HSSFSheet,主要用于操作Excel 97-2003版本(扩展名为.xls),支持的最大行数为65536行,最大列数为256列。当单个sheet页超过65536行时,会报错,可以选择采取分sheet页处理 在处理大量数据时,可能会占用大量内存,容易导致内存溢出(OOM)错误
/**
* 导出excel模板
*
* @param title 标题
* @param dataList 数据
* @param response 响应
*/
public static void exportExcelLinkedList(LinkedHashMap<String, String> title, List<LinkedHashMap<String, Object>> dataList, HttpServletResponse response) {
try {
// 创建一个HSSFWorkbook,对应一个Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
//记录创建的sheet数量
int sheetIndex=1;
//Excel一张(或者说一页)默认行数是65535,如果超过,要sheet分页
if(dataList.size()>65535){
List<List<LinkedHashMap<String, Object>>> partition = Lists.partition(dataList, 65535);
for (List<LinkedHashMap<String, Object>> list : partition) {
getSheet(title,list,workbook,sheetIndex++);
}
}else{
getSheet(title,dataList,workbook,sheetIndex);
}
response.setContentType("application/octet-stream; charset=utf-8");//以流的形式对文件进行下载
response.setHeader("Content-Disposition", "attachment;");
workbook.write(response.getOutputStream());
response.getOutputStream().close();
} catch (IOException e) {
log.error("error", e);
}
}
保证每个sheet页都有标题列
public static void getSheet(LinkedHashMap<String, String> title, List<LinkedHashMap<String, Object>> dataList,HSSFWorkbook workbook,int sheetIndex){
// 在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = workbook.createSheet("sheet"+sheetIndex);
// 在sheet中添加表头第0行
HSSFRow row = sheet.createRow(0);
// 创建单元格,并设置值表头 设置表头居中
HSSFCellStyle cellStyle = workbook.createCellStyle();
DataFormat dataFormat = workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("@"));
// 声明列对象
HSSFCell headCell;
// 创建标题
int rowKey = 0;
for (Map.Entry entry : title.entrySet()) {
headCell = row.createCell(rowKey);
headCell.setCellValue(entry.getValue().toString());
headCell.setCellStyle(cellStyle);
rowKey++;
}
// 创建内容
HSSFCell rowCell;
if (!CollectionUtils.isEmpty(dataList)) {
for (int i = 0; i < dataList.size(); i++) {
row = sheet.createRow(i + 1);
Map<String, Object> data = dataList.get(i);
int j = 0;
for (Map.Entry entry : title.entrySet()) {
rowCell = row.createCell(j);
rowCell.setCellType(CellType.STRING);
rowCell.setCellValue(data.get(String.valueOf(entry.getKey()).toUpperCase().replaceAll("-", "_")) == null ? "" : data.get(String.valueOf(entry.getKey()).toUpperCase().replaceAll("-", "_")).toString());
rowCell.setCellStyle(cellStyle);
j++;
}
}
}
}