什么是Apache POI?

Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件。这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库。它包含类和方法对用户输入数据或文件到MS Office文档进行解码。


不同类的区别

HSSFWorkBook:操作2003版本以前的(包括2003版本),扩展名.xls,该类在org.apache.poi:poi中

XSSFWorkBook:操作2007版本以后的(包括2007版本),拓展名.xlsx,该类在org.apache.poi:poi-ooxml中

SXSSFWorkBook:对于海量的数据进行操作

对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。

org.apache.poi.openxml4j.exceptions.InvalidOperationException
org.apache.poi.poifs.filesystem.OfficeXmlFileException

Poi包里有4个主要的类,包括:

Workbook——工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取,

Sheet————表格,Workbook实例的getSheetAt(int num)方法获取,

Row————–行,Sheet实例的getRow(int num)方法获取,

Cell————–单元格,Row实例的getCell(int num)方法获取,

最后通过Cell实例根据数据类型调用对应的方法获取单元格的值。


实现基于模板导出

操作过程如下

	String filePath=session.getServletContext().getRealPath("/")+"example.xlsx"; //获取webapp目录下的模板文件
	File file=new File(filePath); 

	XSSFWorkBook workBook=new XSSFWorkBook(new FileInputStream(file));
	XSSFSheet sheet=workBook.getSheetAt(0);      //根据索引获取Sheet
	XSSFRow row=sheet.getRow(0);  //获取第一行数据
	XSSFCell cell=row.getCell(0);   //获取第一行第一列单元格
	cell.setCellValue("测试数据");

	//写文件到磁盘
	String fileName="导出数据";
	FileOutputStream out = new FileOutputStream("C://Users/Administrator/Desktop"+fileName+".xlsx");
    workbook.write(out);
    out.close();
    out.flush();

将XSSFWorkBook进行封装

public class ExcelExportUtils {
    private File file;
    private XSSFWorkbook workbook;
    private XSSFSheet sheet;


    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public XSSFSheet getSheet() {
        return sheet;
    }

    public void setSheet(XSSFSheet sheet) {
        this.sheet = sheet;
    }

    public XSSFCell getCell(int rowNum, int cellNum) {
        return  sheet.getRow(rowNum).getCell(cellNum);
    }

    //初始化
    public ExcelExportUtils(String filePath)
    {
        try{
            file=new File(filePath);
            workbook=new XSSFWorkbook(new FileInputStream(file));
            sheet=workbook.getSheetAt(0);

        }catch (Exception e)
        {
            e.printStackTrace();
        }

    }

    /**
     * 导出到文件
     * @param fileName
     */
    public void exportFile(String fileName)
    {
        try {
            FileOutputStream out = new FileOutputStream("C://Users/Administrator/Desktop"+fileName+".xlsx");
            workbook.write(out);
            out.close();
            out.flush();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }


    /**
     * 输出数据流
     * @param os 输出数据流
     */
    public ExcelExportUtils write(OutputStream os) throws IOException{
        workbook.write(os);
        return this;
    }

    /**
     * 输出到客户端
     * @param fileName 输出文件名
     */
    public ExcelExportUtils write(HttpServletResponse response, String fileName) throws IOException {
        response.reset();
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename="+Encodes.urlEncode(fileName));
        write(response.getOutputStream());
        return this;
    }
}
	/**
     * 输出数据流
     * @param os 输出数据流
     */
    public ExcelExportUtils write(OutputStream os) throws IOException{
        workbook.write(os);
        return this;
    }


     /**
     * 输出到客户端
     * @param fileName 输出文件名
     */
    public ExcelExportUtils write(HttpServletResponse response, String fileName) throws IOException {
        response.reset();
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename="+Encodes.urlEncode(fileName));
        write(response.getOutputStream());
        return this;
    }

提前写入模板的公式在导出时不生效怎么办

采取的办法: 1.使用cell.setCellFormula方法重新在制定Cell里写入公式。 2.使用sheet.setForceFormulaRecalculation(true);方法强制让改Sheet执行公式。

设置表格样式

HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
HSSFDataFormat format = demoWorkBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("@"));
cell.setCellStyle(cellStyle2);

HSSFDataFormat的数据格式

内置数据类型 编号 内置数据类型 编号
“General” 0 “h:mm:ss AM/PM” 0x13
“0” 1 “h:mm” 0x14
“0.00” 2 “h:mm:ss” 0x15
“#,##0” 3 “m/d/yy h:mm” 0x16
“#,##0.00” 4 保留为过国际化用 0x17 - 0x24
“($#,##0_);($#,##0)” 5 “(#,##0_);(#,##0)” 0x25
“($#,##0_);Red 6 “(#,##0_);Red 0x26
“($#,##0.00);($#,##0.00)” 7 “(#,##0.00_);(#,##0.00)” 0x27
“($#,##0.00_);Red 8 “(#,##0.00_);Red 0x28
“0%” 9 ($*#,##0);($*(#,##0);($* \”-\”);(@_)” 0x29
“0.00%” 0xa ($*#,##0.00);($*(#,##0.00);($*\”-\”??);(@_)” 0x2a
“0.00E+00” 0xb ($*#,##0);($*(#,##0);($*\”-\”??);(@_)” 0x2b
“# ?/?” 0xc ($*#,##0.00);($*(#,##0.00);($*\”-\”??);(@_)” 0x2c
“# ??/??” 0xd “mm:ss” 0x2d
“m/d/yy” 0xe “[h]:mm:ss” 0x2e
“d-mmm-yy” 0xf “mm:ss.0” 0x2f
“d-mmm” 0x10 “##0.0E+0” 0x30
“mmm-yy” 0x11 “@” - This is text format 0x31
“h:mm AM/PM” 0x12    
赞 赏