使用场景
1、主从表数据同时导出,因为数据量较大,使用多sheet展示,可以增加数据可读性。
2、因为项目中多个地方有这个需求,所以花了一些时间编写了一个工具类,提高开发效率。
下面上干货:
实现思路
1、流开启后 ,创建一个Workbook 使用workbook创建多个sheet ,并设置不同的sheetName、表头 ,数据写入文本行后,关闭流。
2、通过反射、泛型 ,达到通用的目的
实现代码(包含单个sheet导出)
public class DataExportToExcelUtil {
private DataExportToExcelUtil() {
}
/**
* 工作薄
*/
private static HSSFWorkbook workbook;
//sheet
private static HSSFSheet sheet;
//标题行开始位置
private static final int TITLE_START_POSITION = 0;
//时间行开始位置
// private static final int DATEHEAD_START_POSITION = 1;
//表头行开始位置
private static final int HEAD_START_POSITION = 1;
//文本行开始位置
private static final int CONTENT_START_POSITION = 2;
/**
* 数据导出(多sheet)
*
* @param dataMap 对象集合 key为主表bean value为从表List集合
* @param titleMap 表头信息(对象属性名称--要显示的标题值)
* @param sheetName sheet名称和表头值(静态部分)
* @param sheetList sheet名称和表头值 (动态部分)(传入要获取的key对象的字段)
*/
public static void excelExportBacth(Map<?, ?> dataMap, Map<String, String> titleMap, List<String> sheetList, String sheetName,
String suffix, HttpServletResponse response, String fileName) {
try (OutputStream output = response.getOutputStream()) {
// 初始化workbook
initHSSFWorkbook(sheetName);
Set<?> dateSet = dataMap.keySet();
for (Object obj : dateSet
) {
//将sheetName赋给temp
String temp = sheetName;
//拼接sheetName
sheetName = getSheetName(obj, sheetList, sheetName);
//创建sheet;
sheet = workbook.createSheet(sheetName);
//标题行
createTitleRow(titleMap, sheetName);
//清空sheetName
sheetName = temp;
//时间行
// createDateHeadRow(titleMap);
//表头行
createHeadRow(titleMap);
// 文本行
createContentRow