Java 如何为无法使用xssf方法打开的大型xlsx文件着色
我目前正在编写一个java程序,比较两个不同的.xlsx表,并用不同的颜色标记其中的错误。 因此,我使用ApachePOI方法来实现这一点。 由于表的大小(>20mb),我必须使用sax解析器读取它们以获取数据 我使用下面的代码为工作簿创建cellstyles。 正如您所见,我需要“工作簿wbc”作为输入来创建我的单元格样式Java 如何为无法使用xssf方法打开的大型xlsx文件着色,java,excel,apache,out-of-memory,apache-poi,Java,Excel,Apache,Out Of Memory,Apache Poi,我目前正在编写一个java程序,比较两个不同的.xlsx表,并用不同的颜色标记其中的错误。 因此,我使用ApachePOI方法来实现这一点。 由于表的大小(>20mb),我必须使用sax解析器读取它们以获取数据 我使用下面的代码为工作簿创建cellstyles。 正如您所见,我需要“工作簿wbc”作为输入来创建我的单元格样式 public static CellStyle[] createColorStyles(String [][] fd_files, Workbook wbc) throw
public static CellStyle[] createColorStyles(String [][] fd_files, Workbook wbc) throws IOException{
/*Diese Prozedur erstellt verschiedene CellStyles, die auf eine Xls Arbeitsmappe gewirkt werden können*/
/*Öffnen des Workbooks indem die Cellstyles erstellt werden sollen*/
/* Zellstyle für ausgewähltes Workbook erstellen */
CellStyle[] my_style = new CellStyle[4];
my_style[0] = wbc.createCellStyle();
my_style[1] = wbc.createCellStyle();
my_style[2] = wbc.createCellStyle();
my_style[3] = wbc.createCellStyle();
/* spezifizieren der Hintergrund Farbe, sowie des Zellmusters */
//Auswahl für rote Zellfärbung
my_style[0].setFillPattern(CellStyle.SOLID_FOREGROUND );
my_style[0].setFillForegroundColor(IndexedColors.RED.getIndex());
//Auswahl für gelbe Zellfärbung
my_style[1].setFillPattern(CellStyle.SOLID_FOREGROUND );
my_style[1].setFillForegroundColor(IndexedColors.YELLOW.getIndex());
//Auswahl für grüne Zellfärbung
my_style[2].setFillPattern(CellStyle.SOLID_FOREGROUND );
my_style[2].setFillForegroundColor(IndexedColors.GREEN.getIndex());
//Auswahl für orange Zellfärbung
my_style[3].setFillPattern(CellStyle.SOLID_FOREGROUND );
my_style[3].setFillForegroundColor(IndexedColors.ORANGE.getIndex());
return my_style;
}
但是,当涉及到颜色差异时,我有一个问题,即我无法为工作簿创建单元格样式,因为我首先需要打开.xlsx(如下所示)
由于没有足够的heapspace,我无法打开工作簿,因此无法打开文档的单元格样式和颜色
下面是我用来打开工作簿并传递给cellstyle方法的代码。
不幸的是,我总是在尝试打开文件时出现OutOfMemory错误
public static Workbook openData(String [][] fd_files,int i) throws IOException, InvalidFormatException {
// Hilfsprozedur, zum Öffnen eines übergebenen Workbookspfades (fd_files)
// übergibt geöffnet des Workbook, das für Bearbeitung bereit ist
/*Deklaration lokaler Varibalen*/
Workbook wb = null;
File file = new File(fd_files[i][3]);
OPCPackage opcPackage = OPCPackage.open(file);
wb =WorkbookFactory.create(opcPackage);
return wb;
}
我已经将我的heapspace设置为-Xmx1024m,这是我的最大值
有没有办法在这么大的工作簿上应用颜色或单元格样式,
哪一个只能由sax解析器处理
提前感谢。如何从源文件的
Inputstream
上的NPOIFSFileSystem
创建HSSFWorkBook
,添加样式,然后写入输出流(而不是使用XSSFWorkbook
和OPCPackage
来管理生命周期)
如果这不起作用,我就缺乏想法了…:-/ 首先,谢谢你的回答。我尝试了你的建议来整合SXSSF方法。我可能错了,但我认为SXSSFWorkbook总是围绕着另一个工作簿类,如WorkbookFactory或XSSFWorkbook。我的方法如下:OPCPackage OPCPackage=OPCPackage.open(file);XSSF工作簿测试=新XSSF工作簿(opcPackage);SXSSFWorkbook wbt=新的SXSSFWorkbook(测试,100);-->OOM和工作簿wbs=新的SXSSF工作簿(100);wbs=WorkbookFactory.create(新文件(fd_文件[6][3]);-->OOM是否有其他方法使用SXSSF?事实上,我的回答对您的情况没有任何帮助。。。我编辑它,希望它会更有帮助。纠正我,如果我错了,但这不是只有xls文件可能,而不是xlsx?但是,我将尝试您的方法,首先创建文件,从中创建cellstyles,并使用其数据路径作为文件副本的输出。也许这有点可能奏效。不幸的是,你又对了:-/很抱歉。我想我应该删除我的答案,因为它完全没有用处(你可以在你的问题中添加你为了帮助别人而尝试的内容)
// Both HSSFWorkbook that is event based, and NPOIFSFileSystem that uses nio should use less memory
HSSFWorkbook wb = WorkbookFactory.create(new NPOIFSFileSystem(new FileInputStream(pathToInputFile)));
CellStyle[] cellStyles = createColorStyles(fd_files, Workbook wb);
//...
wb.write(new FileOutputStream(pathToOutputFile));