java poi对excel xls和xlsx格式文件导入导出

一)poi简介

Apache POI项目是用于基于Microsoft的OLE 2复合文档格式开发文件格式的纯Java端口的主项目。

官网POI API地址:https://poi.apache.org/components/spreadsheet/quick-guide.html

 

本章主要使用excel相关操作:

HSSF是对Microsoft Excel 97(-2003)文件格式(BIFF8)操作的纯Java API。

XSSF是Microsoft Excel XML(2007+)文件格式(OOXML)操作的纯Java API。

SS是一个使用通用API为两种格式提供通用支持的软件包。它们都支持读写功能。

 

HSSF API和XSSF API,主要是初始化实现类不一样,创建sheet,创建row,创建cell都是一样的原理。

HSSF创建电子文档:

Workbook wb = new HSSFWorkbook();

try  (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}

XSSF创建电子文档:

Workbook wb = new XSSFWorkbook();

try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {
    wb.write(fileOut);
}

 

pom.xml中引入jar:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
		
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

 

创建一个JavaBean,用于封装数据:

package com.oysept.vo;

import java.util.Date;

public class EmployeeVO {

    private Integer userid;
    private String username;
    private Date birthday;
	
    public EmployeeVO() {};
    public EmployeeVO(Integer userid, String username, Date birthday) {
        this.userid = userid;
        this.username = username;
        this.birthday = birthday;
    }
	
    public Integer getUserid() {return userid;}
    public void setUserid(Integer userid) {this.userid = userid;}
	
    public String getUsername() {return username;}
    public void setUsername(String username) {this.username = username;}
	
    public Date getBirthday() {return birthday;}
    public void setBirthday(Date birthday) {this.birthday = birthday;}
}

 

二)poi导出案例

第一步:先获取要导出的数据(比如从文件中读取,从数据库中读取数据)

第二步:创建Workbook

第三步:创建Sheet

第四步:创建Row

第五步:创建Cell

第六步:把数据写入到Workbook中

package com.oysept.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.oysept.vo.EmployeeVO;

/**
 * 导出数据为excel xlsx格式
 * @author ouyangjun
 */
public class ExportDataToXLSX {

    // 初始化数据
    public static List<EmployeeVO> init() {
        List<EmployeeVO> list = new ArrayList<EmployeeVO>();
        EmployeeVO emp1 = new EmployeeVO(111111, "AAAAAA", new Date());
        EmployeeVO emp2 = new EmployeeVO(222222, "BBBBBB", new Date());
        EmployeeVO emp3 = new EmployeeVO(333333, "CCCCCC", new Date());
		
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);
        return list;
    }

    public static void main(String[] args) {
        // 导出数据
        List<EmployeeVO> list = init();
        // 列头
        String[] headers = {"ID", "姓名", "出生日期"};
		
        // 创建后缀为xls excel
        Workbook wb= new XSSFWorkbook();
        try {
            // 指定创建sheet页名称, 并过滤掉一些特殊字符
            String safeName = WorkbookUtil.createSafeSheetName("[O'Brien's sales*?]"); // returns "O'Brien's sales"
            Sheet sheet = wb.createSheet(safeName);
			
            // 设置字体样式
            Font font = wb.createFont();
            font.setFontHeightInPoints((short)24);
            font.setFontName("Courier New");
            font.setItalic(true);
            font.setStrikeout(true);
			
            // 创建一个单元格的风格
            CellStyle cellStyle = wb.createCellStyle();
            // 设置日期格式, 格式存在org.apache.poi.ss.usermodel.BuiltinFormats类中
            CreationHelper createHelper = wb.getCreationHelper();
            cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
            cellStyle.setFont(font); // 设置字体样式
			
            // 创建列头, 第一行
            Row row0 = sheet.createRow(0);
            row0.setHeight((short)230); // 设置一行的高度, 当一行的高度设置为0时, 可以实现隐藏效果
            for (int i = 0, len = headers.length; i < len; i++) {
                // 创建列
                row0.createCell(i).setCellValue(headers[i]);
            }
			
            // 创建数据, 从第二行开始
            for (int i = 0, size = list.size(); i < size; i++) {
                EmployeeVO vo = list.get(i);
				
                // 创建行
                Row iRow = sheet.createRow(i+1);
                iRow.createCell(0).setCellValue(vo.getUserid());
                iRow.createCell(1).setCellValue(vo.getUsername());
				
                // 创建列, 将该列设置为日期格式
                Cell iCell = iRow.createCell(2);
                iCell.setCellValue(vo.getBirthday());
                iCell.setCellStyle(cellStyle);
            }
			
            // 合并单元格, 因为前面已经有4行数据了, 所以从第5行开始
            Row row5 = sheet.createRow(4);
            row5.createCell(0).setCellValue("合并单元格");
            sheet.addMergedRegion(new CellRangeAddress(
                    4, // 从第5行开始, 开始行
                    6, // 到第7行结束, 结束行
                    0, // 从第5行第1个单元格开始, 开始列
                    2  // 到第5行第3个单元格结束, 结束列
            ));
			
            // 如果不存在, 则直接新增, 如已存在, 则直接覆盖旧文件, 并且在操作文件过程中, 文件不能被本地打开
            OutputStream outputStream = new FileOutputStream(new File("D://workbook.xlsx"));
            if (wb != null) {
                wb.write(outputStream);
                outputStream.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

导出数据效果图:

 

三)poi导入案例

第一步:读取excel文件,可先判断时xls或xlsx格式

第二步:读取Sheet、读取Row、读取Cell

第三步:把数据封装存储好(写入到文件中、写入到数据库中)

package com.oysept.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

/**
 * 从excel xlsx文件导入数据
 * @author ouyangjun
 */
public class ImportDataFromXLSX {

    public static void main(String[] args) {
        try {
            InputStream inp = new FileInputStream(new File("D://workbook.xlsx"));
			
            // 获取工作簿
            Workbook wb = WorkbookFactory.create(inp);
            //Sheet sheet = wb.getSheetAt(0);
            //Row row = sheet.getRow(2);
            //Cell cell = row.getCell(3);
			
            // 打印excel中的数据
            for (Sheet sheet : wb) {
                for (Row row : sheet) {
                    for (Cell cell : row) {
                        // 封装数据, 然后再分批处理
                        System.out.println(cell);
                    }
                }
            }
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

四)Workbook中插入图片,支持JPEG、PNG、bitmap、PICT等多种图片格式

package com.oysept.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 在Workbook中插入图片
 * @author ouyangjun
 */
public class PictureWorkBook {

    public static void main(String[] args) {
        try {
            Workbook wb = new XSSFWorkbook();
			
            // 添加一张图片数据, 支持JPEG、PNG、bitmap、PICT等多种图片格式
            InputStream is = new FileInputStream("D://image.jpeg");
            byte[] bytes = IOUtils.toByteArray(is);
            int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
            is.close();
			
            // 创建一个Sheet页
            Sheet sheet = wb.createSheet();
			
            // 初始化工具类
            CreationHelper helper = wb.getCreationHelper();
            // 添加一个图片框
            ClientAnchor anchor = helper.createClientAnchor();
            anchor.setRow1(1); // 指定图片摆放的Row位置
            anchor.setCol1(2); // 指定图片摆放的Cell位置
			
            // 创建一个绘画工具类
            Drawing drawing = sheet.createDrawingPatriarch();
            Picture pict = drawing.createPicture(anchor, pictureIdx);
            pict.resize(); // 自动设置图片的大小
			
            // 保存Workbook
            OutputStream fileOut = new FileOutputStream("D://picture.xlsx");
            wb.write(fileOut); // 把内容写入到excel中
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

插入图片效果图:

 

项目结构图:

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页