这周做了一个功能,要求导出指定格式的Excel表,虽然没有公式,单元格数据类型等复杂,但是字段来源于不同的表中,记录一下,方便以后使用:
- 这里传入数据时,使用了org.apache.commons.beanutils.BeanUtils.describe方法将bean 转为Map,存到了集合中。
- 由于表头是固定顺序且不存在于一个表中,所以传入了表头的字段名数组,所有数据存储在valueList中的map中,根据excelHeadKey的顺序打印。
package com.lnlic.credit.platform.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import java.util.List;
import java.util.Map;
/**
* [Excel工具类]
* <p>
* <br>@author jy
* <br>@date 2018-8-15
* <br>@version 1.0
* <p>
*/
public class ExcelUtil {
/**
* [导出excel]
* @param excelHeader 表头
* @param excelHeadKey 字段名
* @param valueList List<HashMap>格式数据
* @return
*/
public static HSSFWorkbook exportExcel(String[] excelHeader, String[] excelHeadKey, List<Object> valueList) {
// 基本变量初始化
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
HSSFSheet hssfSheet = hssfWorkbook.createSheet("sheet1");
HSSFRow headerRow = hssfSheet.createRow(0);
HSSFCellStyle headCellStyle = hssfWorkbook.createCellStyle();
HSSFCellStyle dataCellStyle = hssfWorkbook.createCellStyle();
int columnNum = excelHeader.length;
// 样式设置
headCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
headCellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
headCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
headCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
headCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
headCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
dataCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
dataCellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);
dataCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
dataCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
dataCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
dataCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
dataCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerRow.setHeightInPoints(20);
HSSFFont font = hssfWorkbook.createFont();
font.setFontHeightInPoints((short) 12);
headCellStyle.setFont(font);
// 打印表头
for (int i = 0; i < columnNum; i++) {
HSSFCell headerCell = headerRow.createCell(i);
headerCell.setCellValue(excelHeader[i]);
headerCell.setCellStyle(headCellStyle);
//根据表头长度设置单元格宽度
hssfSheet.setColumnWidth(i, excelHeader[i].getBytes().length * 2 * 180);
}
// 打印数据行
for (int i = 0; i < valueList.size(); i++) {
HSSFRow dataRow = hssfSheet.createRow(i + 1);
dataRow.setHeightInPoints(20);
Map<String, String> rowMap = (Map<String, String>) valueList.get(i);
for (int j = 0; j < excelHeader.length; j++) {
HSSFCell dataCell = dataRow.createCell(j);
String rowVal = rowMap.get(excelHeadKey[j]);
//无数据补空格,避免后续单元格无数据而使数据溢出单元格
if (rowVal == "" || rowVal == null) {
rowVal = " ";
}
dataCell.setCellValue(rowVal);
dataCell.setCellStyle(dataCellStyle);
}
}
return hssfWorkbook;
}
}
导出效果:
Excel图
网友评论