使用以下命令为每个单元格创建单元格样式并不是一个好主意apache poi
。在 Excel 中,单元格样式存储在工作簿级别。如果可能的话,工作表和单元格共享单元格样式。
所有 Excel 版本中不同单元格样式的最大计数都有限制。二进制的限制*.xls
小于 OOXML 的值*.xlsx
.
限制本身并不是造成结果的唯一原因。但 Excel 似乎对工作簿中 50 个完全相同的单元格样式不太满意。这些都是内存浪费,因为所有 50 个单元格共享相同的样式,因此只需要一种共享样式。
解决方案是:
在单元格创建循环之外的工作簿级别上创建单元格样式,并且仅将样式设置为循环中的单元格。
Example:
private static void exportXlsCorrect() {
try (
OutputStream os = new FileOutputStream("testCorrect.xls");
Workbook wb = new HSSFWorkbook();) {
CellStyle cs = wb.createCellStyle();
cs.setFillBackgroundColor(IndexedColors.WHITE.index);
cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cs.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
Sheet sh = wb.createSheet("test");
Row r = sh.createRow(0);
for (int i = 0; i < 50; i++) {
Cell c = r.createCell(i);
c.setCellValue(i + 1);
c.setCellStyle(cs);
}
wb.write(os);
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
有时,在创建单元格之前实际上不可能知道所有可能需要的单元格样式。然后CellUtil https://poi.apache.org/apidocs/dev/org/apache/poi/ss/util/CellUtil.html可以使用。这个有一个方法CellUtil.setCellStyleProperties
它能够为单元格设置特定的样式属性。仅当需要时,才会在工作簿级别创建新的单元格样式。如果已经存在,则使用当前的单元格样式。
Example:
private static void exportXlsUsingCellUtil() {
try (
OutputStream os = new FileOutputStream("testUsingCellUtil.xls");
Workbook wb = new HSSFWorkbook();) {
Sheet sh = wb.createSheet("test");
Row r = sh.createRow(0);
for (int i = 0; i < 50; i++) {
Cell c = r.createCell(i);
c.setCellValue(i + 1);
java.util.Map<java.lang.String,java.lang.Object> properties = new java.util.HashMap<java.lang.String,java.lang.Object>();
properties.put(org.apache.poi.ss.util.CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.WHITE.index);
properties.put(org.apache.poi.ss.util.CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.LIGHT_BLUE.getIndex());
properties.put(org.apache.poi.ss.util.CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
org.apache.poi.ss.util.CellUtil.setCellStyleProperties(c, properties);
}
wb.write(os);
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}