将autoSizeColumn放在Apache POI中的位置?

时间:2015-08-14 14:29:33

标签: java apache-poi

我一直在研究Apache POI XSSF模型已有一段时间了。我正在尝试生成一个格式化并具有一些样式集的Excel工作表。出于性能原因,我一直在使用POI提供的Big-Grid示例。

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java

除此之外,我还想为每个列应用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();

}

在这方面,我们非常感谢您的帮助。

谢谢!

1 个答案:

答案 0 :(得分:2)

你提到了BigGridDemo。您似乎未能阅读的内容是the top of the file处的重大警告,以及通过标题javadocs稍微小一点的警告:

  

注意 - 您可能不想再使用此方法了! POI   现在包括SXSSF,你应该为你处理所有这些   改为使用它!此代码主要是出于历史兴趣。

正如标题所说,你应该使用SXSSF instead。 SXSSF提供了一种与XSSF兼容的方式来编写.xlsx文件,但是通过创建XML本身并且只在内存中保留行和单元的小“窗口”,保留了BigGridDemo所做的非常低的内存占用< / p>

因此,您需要更改代码以使用SXSSFWorkbook,但在很大程度上与您需要内存的XSSF版本相同,并且您会很好

嗯......除此之外,自动调整大小需要访问列中的所有行,以了解哪个单元格最大。 SXSSF无法提供这一点,因为它已将几乎所有行刷新到磁盘以节省内存。因此,您的自动调整大小仅适用于仍在窗口中的少数行,因为这些行是唯一可用于检查大小的行。它可能大部分都是正确的,因为通常列中的大多数单元都是相同的大小。它可能不是完美的,但可悲的是,这是较低内存使用的权衡之一