Java Apache POI中的autoSizeColumn放在哪里?
我已经在ApachePOIXSSF模型上工作了相当长的一段时间了。我正在尝试生成一个excel表格,该表格已格式化并应用了一些样式集。出于性能原因,我一直在使用POI提供的大网格示例 除此之外,我还希望为每个列应用autoSizeColumn。但是我不确定在给定的程序中应该在哪里应用autoSizeColumn方法Java Apache POI中的autoSizeColumn放在哪里?,java,apache-poi,Java,Apache Poi,我已经在ApachePOIXSSF模型上工作了相当长的一段时间了。我正在尝试生成一个excel表格,该表格已格式化并应用了一些样式集。出于性能原因,我一直在使用POI提供的大网格示例 除此之外,我还希望为每个列应用autoSizeColumn。但是我不确定在给定的程序中应该在哪里应用autoSizeColumn方法 private static void generate(Writer out, Map<String, XSSFCellStyle> styles,String in
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();
}
private static void generate(编写器输出、映射样式、字符串输入文件名、XSSFSheet)引发异常{
BufferedReader br=null;
字符串行=”;
字符串cvsSplitBy=“,”;
电子表格书写器sw=新的电子表格书写器(输出);
sw.beginSheet();
整数rowId=0;
br=新的BufferedReader(新的文件读取器(inputFileName));
而((line=br.readLine())!=null){
//使用逗号作为分隔符
String[]reportRecords=line.split(cvsSplitBy);
如果(rowId==0){//打印报告名称
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
在这方面,非常感谢你的帮助
谢谢 你提到了BigGridDemo。您似乎没有阅读到的是在上的大警告,以及通过标题javadocs向下的小警告: 注意-您可能不想再使用这种方法了!POI 现在包括SXSSF,它为您处理所有这些,您应该 用它来代替!这部法典主要是出于历史利益而保留下来的 正如标题所说,您应该使用。SXSSF提供了一种基本上与XSSF兼容的方式来编写
.xlsx
文件,但是通过创建XML本身并在内存中只保留一个小的行和单元格“窗口”,保留了BigGridDemo所具有的非常低的内存占用
因此,您需要更改代码以供使用,但在其他方面与内存不足的XSSF版本基本相同,这样做会很好
嗯。。。除此之外,自动调整大小需要访问列中的所有行,以了解哪个单元格最大。SXSSF无法提供这一点,因为它已将几乎所有行刷新到磁盘以节省内存。因此,自动调整大小仅适用于仍在窗口中的少数行,因为只有这些行可用于检查窗口的大小。通常情况下,列中的大多数单元格都是相同大小的。这可能并不完美,但令人遗憾的是,这是降低内存使用率的一个折衷办法您的调整大小尝试目前是否失败?您是否意识到自动调整列大小需要读取每个单元格以确定哪个单元格最长,这与将所有单元格写入磁盘以使其不在内存中基本不兼容?