什么是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;
}
- 使用response对象实现文件下载只能使用Form表单来提交下载请求,而不能用ajax来提交,这是因为ajax请求的数据类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现下载可以用form表单提交请求
提前写入模板的公式在导出时不生效怎么办
采取的办法: 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 |