一、基本概念
JavaExcel导出指的是通过Java程序将数据导出到Excel文件中,方便数据的管理和处理。在开发过程中,常常需要将数据按照某种规则导出到Excel文件中,这时就需要使用JavaExcel导出技术。 JavaExcel导出主要涉及到POI和EasyExcel两个框架。
二、POI框架
POI全称是Poor Obfuscation Implementation,是Apache基金会下的一个Java项目,提供了Java编写Excel文件的API。POI可以读取、写入和操作Excel文件,支持各种版本的Excel文件。 使用POI框架进行Excel导出需要先创建工作簿对象,再在工作簿中创建单元格和行组成的表格。接着,将数据写入到单元格中,并保存到指定的文件中。
// 1. 创建工作簿对象
Workbook workbook = new XSSFWorkbook();
// 2. 创建工作表对象
Sheet sheet = workbook.createSheet();
// 3. 创建行对象
Row row = sheet.createRow(0);
// 4. 创建单元格对象
Cell cell = row.createCell(0);
// 5. 写入数据到单元格
cell.setCellValue("Hello World");
// 6. 保存到指定的文件中
try (FileOutputStream fileOut = new FileOutputStream("sample.xlsx")) {
workbook.write(fileOut);
}
三、EasyExcel框架
EasyExcel是阿里巴巴开源的JavaExcel导入导出框架,相对于POI,EasyExcel使用更加简单,可读性更高,并且具有更好的性能优化。 使用EasyExcel进行Excel导出,需要先定义Excel文件的表头和数据列表,然后通过EasyExcel提供的API将数据写入到Excel文件中。
// 1. 定义Excel文件的表头
List<List<String>> head = new ArrayList<>();
head.add(Arrays.asList("姓名", "年龄", "性别"));
// 2. 定义数据列表
List<List<Object>> data = new ArrayList<>();
data.add(Arrays.asList("张三", 20, "男"));
data.add(Arrays.asList("李四", 25, "女"));
data.add(Arrays.asList("王五", 30, "男"));
// 3. 写入数据到Excel文件
EasyExcel.write("sample.xlsx")
.head(head)
.sheet("Sheet1")
.doWrite(data);
四、Excel样式定制
在进行Excel导出时,经常需要将数据以一定的格式展示,例如设置单元格的字体、颜色等。POI和EasyExcel均提供了样式定制的功能。
// 1. 创建样式对象
CellStyle style = workbook.createCellStyle();
// 2. 设置字体
Font font = workbook.createFont();
font.setFontName("微软雅黑");
font.setFontHeightInPoints((short) 16);
font.setBold(true);
style.setFont(font);
// 3. 设置单元格背景色
style.setFillForegroundColor(IndexedColors.RED.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 4. 应用样式到单元格
cell.setCellStyle(style);
五、大数据量Excel导出优化
在进行大数据量Excel导出时,如果不进行优化处理,容易导致程序内存溢出,从而影响程序性能甚至崩溃。这时我们需要使用POI和EasyExcel提供的基于流的Excel导出方式。 基于流的Excel导出方式将Excel文件分成多个部分,按需读取和写入,大大降低了程序内存消耗。
// 1. 创建工作簿对象
Workbook workbook = new SXSSFWorkbook();
// 2. 获取表格数据
List<List<Object>> dataList = getDataList();
// 3. 分段写入Excel文件
int count = 1;
for (List<Object> list : Lists.partition(dataList, 10000)) {
Sheet sheet = workbook.createSheet("Sheet" + count++);
for (int i = 0; i < list.size(); i++) {
List<Object> rowList = (List<Object>) list.get(i);
Row row = sheet.createRow(i);
for (int j = 0; j < rowList.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowList.get(j).toString());
}
}
}
// 4. 将数据写入到输出流中
try (ServletOutputStream out = response.getOutputStream()) {
workbook.write(out);
}