Apache Poi导出Excel多Sheet页详解!

时间:2021-07-19 20:24:53

apache poi是目前比较常用导出excel的方式。最近想要实现一个导出excel多sheet页的功能。
网上查了一下大多都是针对某个具体对象的导出,不能实现任意对象的导出。现在将自己研究出的代码贴出来,供大家参考。


//注意:此处实现的关键是将数据对象封装成List<Map<String,Object>>的形式,这样才能适合多个不同对
//象的解析

/**
* @Title: exportExcel
* @Description:
* @param workbook 工作薄
* @param sheetNum (sheet的位置,0表示第一个表格中的第一个sheet)
* @param sheetTitle (sheet的名称)
* @param headers (表格的标题)
* @param list (数据结果集的封装)
* @param keys 数据库列名
* @throws Exception
*/

public void exportExcel(HSSFWorkbook workbook, int sheetNum,
String sheetTitle, String[] headers, List<Map<String, Object>> list,String[]
keys) throws Exception {
// 声明一个工作薄
HSSFSheet sheet = workbook.createSheet();
try {
//设置sheet页名称
workbook.setSheetName(sheetNum, sheetTitle);
} catch (Exception e) {
// TODO: handle exception
}
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.BLACK.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// 把字体应用到当前的样式
style.setFont(font);

// 指定当单元格内容显示不下时自动换行
style.setWrapText(true);

// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {

//创建单元格
HSSFCell cell = row.createCell((short) i);

//设置单元格样式
cell.setCellStyle(style);

//组装单元格值
HSSFRichTextString text = new HSSFRichTextString(headers[i]);

//给单元格设置值
cell.setCellValue(text.toString());
}

// 遍历集合数据,产生数据行
try {
if (list.size() > 0) {
for (short i = 1; i < list.size(); i++) {

// Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
// 创建一行,在页sheet上
Row row1 = sheet.createRow((short) i);

// 在row行上创建一个方格
for (short j = 0; j < keys.length; j++) {

//创建数据单元格
Cell cell = row1.createCell(j);

//给单元格设置值,list<Map<String,Object>>在封装数据的时候key就是数据库
//表的字段名称,所以这儿通过key来取值判断。
cell.setCellValue(list.get(i).get(keys[j]) == null ? " " :
list.get(i).get(keys[j]).toString());

//设置单元格样式
cell.setCellStyle(style);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

总结:要实现通用的excel导出,组装数据是关键。目前我这块觉得用map的方式是比较简单的。可能还有更简单的,希望大家多多指点!