Java 如何为无法使用xssf方法打开的大型xlsx文件着色

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

我目前正在编写一个java程序,比较两个不同的.xlsx表,并用不同的颜色标记其中的错误。 因此,我使用ApachePOI方法来实现这一点。 由于表的大小(>20mb),我必须使用sax解析器读取它们以获取数据

我使用下面的代码为工作簿创建cellstyles。 正如您所见,我需要“工作簿wbc”作为输入来创建我的单元格样式

 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));