在工作中使用到了POI中的SXSSFWorkbook做excel导出,本文将简单介绍SXSSFWorkbook的使用及其做excel导出的一个通用工具类。
1、简单介绍
SXSSFWorkbook是属于apache基金会的Excel导出工具类,从其官网上可以看出SXSSFWorkbook实现了Workbook接口。 SXSSFWorkbook是实现“BigGridDemo”策略的XSSFWorkbook的流媒体版本。SXSSFWorkbook允许编写非常大的文件而不会耗尽内存,因为在任何时候,只有可配置的一部分行保存在内存中。具体细节需要研究官方文档。
2、引入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
3、使用
package cn.sto.station.twin.common.excel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* SXSSFWorkbook导出
*
* @date 2022-05-30 10:50
*/
@Slf4j
public class SXSSFWorkbookExporter {
/**
* 表头
*/
private String[] headerNames;
/**
* 工作簿
*/
private Workbook workBook;
/**
* excel工作表
*/
private Sheet sheet;
/**
*
* @param headerNames 表头
* @param sheetName sheet的名称
*/
public SXSSFWorkbookExporter(String[] headerNames, String sheetName) {
this.headerNames = headerNames;
// 创建一个工作簿 内存中保持100条数据, 超出的部分刷新到磁盘上
workBook = new SXSSFWorkbook(100);
// 创建一个工作表sheet
sheet = workBook.createSheet(sheetName);
initHeader();
}
/**
* 初始化表头信息
*/
private void initHeader() {
// 创建第一行
Row row = sheet.createRow(0);
Cell cell = null;
// 创建表头
for (int i = 0; i < headerNames.length; i++) {
cell = row.createCell(i);
cell.setCellValue(headerNames[i]);
setHeaderCellStyle(cell);
}
}
/**
* 设置表头单元格样式
*
* @param cell 单元格
*/
public void setHeaderCellStyle(Cell cell) {
// 设置样式
CellStyle cellStyle = workBook.createCellStyle();
// 设置字体居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置字体
Font font = workBook.createFont();
font.setFontName(HSSFFont.FONT_ARIAL);
// 设置加粗
font.setBold(true);
// 设置字号
font.setFontHeightInPoints((short) 13);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
/**
*
* @param datas 数据,每一个map都是一行
* @param keys key[i]代表从map中获取keys[i]的值作为第i列的值,如果传的是null默认取表头
*/
public void createTableRows(List<Map<String, Object>> datas, String[] keys) {
for (int i = 0, length_1 = datas.size(); i < length_1; i++) {
if (ArrayUtils.isEmpty(keys)) {
keys = headerNames;
}
// 创建行(从第二行开始)
Map<String, Object> data = datas.get(i);
Row row = sheet.createRow(i + 1);
Cell cell = null;
for (int j = 0, length_2 = keys.length; j < length_2; j++) {
// 单元格获取map中的key
String key = keys[j];
String value = MapUtils.getString(data, key, "");
cell = row.createCell(j);
cell.setCellType(CellType.STRING);
cell.setCellValue(value);
}
}
}
/**
* 根据表头自动调整列宽度
*/
public void autoAllSizeColumn() {
// 如果是SXSSFSheet,需要调用trackAllColumnsForAutoSizing方法一次
if (sheet instanceof SXSSFSheet) {
SXSSFSheet tmpSheet = (SXSSFSheet) sheet;
tmpSheet.trackAllColumnsForAutoSizing();
}
for (int i = 0, length = headerNames.length; i < length; i++) {
sheet.autoSizeColumn(i);
}
}
/**
* 将数据写出到excel中
*
* @param outputStream
*/
public void exportExcel(OutputStream outputStream) {
// 导出之前先自动设置列宽
this.autoAllSizeColumn();
try {
workBook.write(outputStream);
} catch (IOException e) {
log.error(" exportExcel error", e);
} finally {
IOUtils.closeQuietly(outputStream);
}
}
/**
* 将数据写出到excel中
*
* @param outputFilePath
*/
public void exportExcel(String outputFilePath) {
// 导出之前先自动设置列宽
this.autoAllSizeColumn();
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(outputFilePath);
workBook.write(outputStream);
} catch (IOException e) {
log.error(" exportExcel error", e);
} finally {
IOUtils.closeQuietly(outputStream);
}
}
public static void main(String[] args) {
test();
}
private static void test() {
SXSSFWorkbookExporter hssfWorkExcel = new SXSSFWorkbookExporter(new String[] { "姓名", "年龄" }, "人员基本信息");
List<Map<String, Object>> datas = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Map data = new HashMap<>();
data.put("name", "name" + i);
data.put("age", "age" + i);
datas.add(data);
}
hssfWorkExcel.createTableRows(datas, new String[] { "name", "age" });
try {
hssfWorkExcel.exportExcel(new FileOutputStream(new File("e:/test1.xlsx")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}