java中的POI是什么?
POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”
是用Java编写的免费开源的跨平台的 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
简而言之,就是"进行MsOffice进行读写的这样一个东西“
POI下包结构说明:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
本息主要讲我遇到的 Excel操作:
POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。
(1)HSSF:Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256。
(2)XSSF:Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384。
(3)SXSSF:是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx。
Excel版本兼容性是向下兼容。
三种类的接口和方法如下:
HSSF:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……
XSSF:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……
SXSSF:SXSSFWorkbook、Sheet、Row、Cell……
很重要的一点,SXSSF之所以是一种低内存操作方式,是因为他的构造方法:
System.out.println(System.getProperty("java.io.tmpdir"));
案例代码:
@RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
@ApiOperation(value = "导出Excel", notes = "")
public void exportExcel(@ModelAttribute OhHazard pojo, HttpServletResponse res) throws IOException {
exportExcel(res,pojo);
}
private void exportExcel(HttpServletResponse res, Object pojo) throws IOException {
List<Object> list = service.selectPageList(pojo, 1, Integer.MAX_VALUE).getList();//这是查询语句,需根据实际需求
Workbook wb = new XSSFWorkbook();//创建一个新的工作簿
Sheet sheet = wb.createSheet("导出数据");//创建第一个Sheet页,括号内是工作簿的名字.
String fileName = "表名文字描述" + DateUtil.formatDate(new Date()) + ".xlsx";//给导出的文件取名字
genOhhazardExcel(list, sheet,wb);
sheet.setDisplayGridlines(false);
WebUtils.writeExcel(wb, fileName,res);
}
// TODO: 2021/10/12 导出
private void genObjectExcel(List<Object> list, Sheet sheet,Workbook wb) throws IOException {
// 设置第一行表头
Row rowHead = sheet.createRow(0);
//给表头行创建列(这里创建了8列)
rowHead.createCell(0).setCellValue("XXXXX");
rowHead.createCell(1).setCellValue("XXXXX");
rowHead.createCell(2).setCellValue("XXXXX");
rowHead.createCell(3).setCellValue("XXXXX");
rowHead.createCell(4).setCellValue("XXXXX");
rowHead.createCell(5).setCellValue("XXXXX");
.....
rowHead.createCell(n).setCellValue("XXXX");
CellStyle cellStyleHead = ExcelUtils.headCellStyle(wb);//给单元格设置表头格式
for (int i = 0; i <n+1; i++) {//这个n是上面对应0~5列数最后一列5
rowHead.getCell(i).setCellStyle(cellStyleHead);
}
//当列表不为空的时候,就进行遍历
if(!CollectionUtils.isEmpty(list)){
CellStyle style = ExcelUtils.cellStyle(wb);
CellStyle borderCellStyle = ExcelUtils.cellBorder(wb.createCellStyle());
for(int rownum = 0; rownum < list.size(); rownum++){
Row row = sheet.createRow(rownum+1);
row.setHeight((short) 360);
类名 对象名=list.get(rownum);
//下列进行单元格的赋值
row.createCell(0).setCellValue(对象.getXXX());//取设置每一个单元格的值
if(!StringUtils.isEmpty(对象.XXX1())){
row.createCell(1).setCellValue(对象.XXX1());//
}
.....//后续皆是如此设置一个单元格值
//遍历
for (int i = 0; i <n+1 ; i++) {
if (row.getCell(i) != null) {
row.getCell(i).setCellStyle(style);
} else {
row.createCell(i).setCellStyle(borderCellStyle);
}
}
}
ExcelUtils.autoColumnWidth(sheet, 8);//
}
else{
sheet.createRow(1).createCell(0).setCellValue("查询不到数据");
}
}