工作中需要每个月生成数据的报表,使用Excel
展示数据。生成Excel
肯定需要使用apache poi
,但是我们可以直接使用easy poi
,帮我们封装好了具体细节,但是使用起来有些细节还是需要变通的。
implementation ('cn.afterturn:easypoi-base:4.1.0'){
exclude group: 'com.google.guava', module: 'guava'
exclude group: 'org.apache.commons', module: 'commons-compress'
}
implementation('org.apache.commons:commons-compress:1.21')
排除掉这两个依赖是依赖有严重的漏洞,需要升级。
easy poi
封装的工具类ExcelExportUtil
,这里封装的方法大部分够我们使用了。这里介绍几个常用的API/**
* @param entity
* 表格标题属性
* @param pojoClass
* Excel对象Class
* @param dataSet
* Excel对象数据List
*/
public static Workbook exportExcel(ExportParams entity, Class> pojoClass,
Collection> dataSet)
ExportParams
是导出参数,可以设置标题,sheet
名称,使用的Excel
类型:HSSF
或者XSSF
。
HSSF
: Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256。
XSSF
: Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384。
SXSSF
:是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx。(本次引入的包里是没有这个的)
简要使用:
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(null,"result", ExcelType.XSSF),
TestPojo.class, list);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
workbook.write(byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
return byteArray;
} finally {
workbook.close();
byteArrayOutputStream.close();
}
POJO如下:
@Getter
@Setter
@ExcelTarget("pojo")
public class TestPojo implements java.io.Serializable {
private String offerId;
@Excel(name = "column1", width = 20, isImportField = "true")
private String column1;
@Excel(name = "column2", width = 20)
private String column2;
@Excel(name = "column3", width = 30)
private String column3;
}
isImportField = "true"
意思就是导入参数,可以使用导入。
项目中使用的格式不是单纯的
POJO
,因为业务问题,产品分不同的sheet
展示,当这个产品没有数据的时候,需要在sheet
中展示话术没有数据,这就不是pojo
了。
当然解决很简单的,毕竟只是个POI的封装,看下源代码,拆一下就好了。
源码如下:
public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
Collection<?> dataSet) {
Workbook workbook = getWorkbook(entity.getType(),dataSet.size());
new ExcelExportService().createSheet(workbook, entity, pojoClass, dataSet);
return workbook;
}
这就简单很多了,核心就是这个ExcelExportService
,传递一个Workbook
而已,我们直接使用这个ExcelExportService
就可以了,而且这个类是public
,完全可以在我们的业务代码中使用。
这样我们可以手动创建一个Workbook
,然后根据传递的Collection
是不是空,判断是否要使用这个ExcelExportService
,如果为空,我们就手动去创建sheet
并且写入一行提示:‘该产品没有数据’即可。
代码如下:
XSSFWorkbook workbook = new XSSFWorkbook();
ExcelExportService excelExportService = new ExcelExportService();
if (!CollectionUtils.isEmpty(list)) {
int size = list.size();
excelExportService.createSheet(workbook, new ExportParams(DateUtil.getCurrentDateStr(),
code, ExcelType.XSSF), TestPojo.class, list);
buildCountRow(workbook.getSheet(code), size );
} else {
buildNoValueOrExceptionWorkBook(code + " No Record found.", workbook, productCode);
}
手动创建代码:
private Workbook buildNoValueOrExceptionWorkBook(String value, Workbook workbook, String sheetName) {
if (workbook == null) {
workbook = new XSSFWorkbook();
}
workbook.createSheet(sheetName).createRow(0).createCell(0)
.setCellValue(value);
return workbook;
}