我一直在研究Apache POI XSSF模型已有一段时间了。我正在尝试生成一个格式化并具有一些样式集的Excel工作表。出于性能原因,我一直在使用POI提供的Big-Grid示例。
除此之外,我还想为每个列应用autoSizeColumn。但我不知道在给定的程序中应该在哪里应用autoSizeColumn方法。
private static void generate(Writer out, Map<String, XSSFCellStyle> styles,String inputFileName, XSSFSheet sheet) throws Exception {
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
SpreadsheetWriter sw = new SpreadsheetWriter(out);
sw.beginSheet();
Integer rowId = 0;
br = new BufferedReader(new FileReader(inputFileName));
while ((line = br.readLine()) != null) {
//use comma as separator
String[] reportRecords = line.split(cvsSplitBy);
if (rowId == 0) { // Print the Report Name
sw.insertRow(rowId++);
sw.createCell(0, StringEscapeUtils.escapeXml(line.substring(1, line.length() - 1)), styles.get("header").getIndex());
sw.endRow();
}
else if(rowId == 1){
sw.insertRow(rowId++);
for (int column = 0; column < reportRecords.length; column++) {
sw.createCell(column, StringEscapeUtils.escapeXml(reportRecords[column].substring(1,reportRecords[column].length() - 1)), styles.get("header").getIndex());
}
sw.endRow();
}
else{
sw.insertRow(rowId++);
for (int column = 0; column < reportRecords.length; column++) {
sw.createCell(column, StringEscapeUtils.escapeXml(reportRecords[column].substring(1,reportRecords[column].length() - 1)));
}
sw.endRow();
}
}
br.close();
sheet.autoSizeColumn(1);
sheet.autoSizeColumn(2);
sheet.autoSizeColumn(3);
sw.endSheet();
}
在这方面,我们非常感谢您的帮助。
谢谢!
答案 0 :(得分:2)
你提到了BigGridDemo。您似乎未能阅读的内容是the top of the file处的重大警告,以及通过标题javadocs稍微小一点的警告:
注意 - 您可能不想再使用此方法了! POI 现在包括SXSSF,你应该为你处理所有这些 改为使用它!此代码主要是出于历史兴趣。
正如标题所说,你应该使用SXSSF instead。 SXSSF提供了一种与XSSF兼容的方式来编写.xlsx
文件,但是通过创建XML本身并且只在内存中保留行和单元的小“窗口”,保留了BigGridDemo所做的非常低的内存占用< / p>
因此,您需要更改代码以使用SXSSFWorkbook,但在很大程度上与您需要内存的XSSF版本相同,并且您会很好
嗯......除此之外,自动调整大小需要访问列中的所有行,以了解哪个单元格最大。 SXSSF无法提供这一点,因为它已将几乎所有行刷新到磁盘以节省内存。因此,您的自动调整大小仅适用于仍在窗口中的少数行,因为这些行是唯一可用于检查大小的行。它可能大部分都是正确的,因为通常列中的大多数单元都是相同的大小。它可能不是完美的,但可悲的是,这是较低内存使用的权衡之一