新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗:
《沉重的时刻》(里尔克)
此刻有谁在世上某处哭,无缘无故在世上哭,在哭我。
此刻有谁在夜间某处笑,无缘无故在夜间笑,在笑我。
此刻有谁在世上某处走,无缘无故在世上走,走向我。
此刻有谁在世上某处死,无缘无故在世上死,望着我。
不考虑以上所说的问题,个人花了些许时间写了两个Excel 工具类:ExcelReadUtil以及ExcelWriteUtil (代码地址见篇尾),集中处理了包含单不仅限于以下问题:
toXlsxByMap(List<Map<String,Object>> dataList,
String[] headerNames,
String[] cellNames,
CellFmt[] cellFmts)
导致的问题是传入的dataList内部的Map的value必须是Object类型,之后钻研了下java泛型,使用这种方式轻松解决问题!
public static <V extends Object> File toXlsxByMap(List<Map<String,V>> dataList,
String[] headerNames,
String[] cellNames,
CellFmt[] cellFmts)
//数据分组
List<List<Map<String, V>>> mData = splitMapList(dataList);
//循环每组数据 并创建sheet>写单元格
for (List<Map<String, V>> subList : mData) {
//第一个sheet 参数(sheet名称,sheet的序号)
sheet = workbook.createSheet(String.format("%s~%s",
(dataList.size() > DATA_SPLIT_GROP_SIZE ?
mData.indexOf(subList) * DATA_SPLIT_GROP_SIZE + 1
: 0) + "",
(dataList.size() > DATA_SPLIT_GROP_SIZE ?
(mData.size() == (mData.indexOf(subList) + 1) ? dataList.size() : DATA_SPLIT_GROP_SIZE * (mData.indexOf(subList) + 1))
: dataList.size()) + "")
);
LOGGER.info(">>>sheet name : {}",sheet.getSheetName());
PoiCellProcess.writeHeaderCell(sheet,headerCellStyle,headerNames);
PoiCellProcess.writeBodyCellByMap(sheet,bodyCellStyle,cellNames,subList, cellFmts);
}
public static CellStyle headerCellStyle(SXSSFWorkbook wb){
CellStyle headerStyle = wb.createCellStyle();
//...some code
//允许单元格内换行
headerStyle.setWrapText(true);
return headerStyle;
}
另外一个问题是单元格类型与编程语言的数据类型相异同时与poi所能提供的数据类型也相异,如图:
public static void writeHeaderCell(SXSSFSheet sheet, CellStyle headerCellStyle, String[] headerNames) { SXSSFRow row = sheet.createRow(0); row.setHeight((short) 30); row.setHeightInPoints((short) 30); SXSSFCell headerCell; for (int i = 0; i < headerNames.length; i++) { headerCell = row.createCell(i); headerCell.setCellStyle(headerCellStyle); headerCell.setCellValue(headerNamesi); sheet.setColumnWidth(i, null == headerNamesi ? CELL_BASE_LENGTH : (headerNamesi.contains("\r\n") ? CELL_CHARSET_LENGTH * headerNamesi.length() / 2 : CELL_CHARSET_LENGTH * headerNamesi.length())); } }
这是最终处理的结果:
以上写的过于粗糙,各位有更好的想法请分享下哈~
现在是 2019-02-18 星期一,各位中午好~