2013-12-13 2 views
5

Ich versuche, eine riesige Excel-Datei zu schreiben, meine Anforderung erlaubt mir, die Zeile zu schreiben und zu vergessen, so dass ich SXSSF verwenden, die nur einige Zeilen im Speicher zu behalten erlaubt und Ruhe alle sind in das Dokument geschrieben. Dies hilft bei der Überwindung der Ausnahmebedingung für große Dateien.Verwendung von benutzerdefinierten Farben mit SXSSF (Apache POI)

, aber ich muss auch Stile zu Zellen mit sxssf Arbeitsmappe festlegen. Ich bin nicht in der Lage, einen Weg zu finden, benutzerdefinierte Farben in SXSSF zu definieren und zu verwenden (wie in XSSF können wir eine benutzerdefinierte Farbe direkt definieren, und in HSSF können wir einen Eintrag in der Palette durch eine benutzerdefinierte Farbe ersetzen)

i kann keine Möglichkeit finden, auf eine Palette von SXSSF workbook zuzugreifen.

Ich kann keine neue HSSF palette erstellen, da der Konstruktor geschützt ist. Die einzige Möglichkeit, die momentan machbar scheint, ist irgendwie eine ähnliche Farbe aus einer Liste aller vordefinierten Farben zu finden und sie anstelle des Originals zu verwenden (aber das würde erfordern, dass eine RGB-Farbabstimmung Algo wäre, die eine andere wäre) Aufgabe)

Kann jemand einen primitiven RGB-Farbe-Matching-Algorithmus)

Antwort

11

So, nach einem bisschen suchen über das Internet und lesen Sie die Dokumentation eine Abhilfe (oder vielleicht vorschlagen vorschlagen, ich einen Hinweis bekommen, dass SXSSF eigentlich ist Wrapper um XSSF, also habe ich den von der SXSSF-Arbeitsmappe zurückgegebenen CellStyle in XSSF eingegeben und konnte XSSFColor direkt zum Erzeugen von Farben verwenden.

SXSSFWorkbook workbook = new SXSSFWorkbook(50); 
Sheet sheet = workbook.createSheet("Image Data"); 
.... 
Cell cell = row.createCell(j); 
cell.setCellValue(j); 
XSSFCellStyle cs1 = (XSSFCellStyle) workbook.createCellStyle(); 
cs1.setFillForegroundColor(new XSSFColor(new java.awt.Color(red,green,blue)));   
cs1.setFillPattern(CellStyle.SOLID_FOREGROUND); 
cell.setCellStyle(cs1); 
+0

sonst Ich hatte versucht, das RGB-Format in das Lab-Format zu konvertieren und dann die euklidische Entfernung zu verwenden, um ähnliche Farben zu finden, aber das hat in diesem Fall nicht funktioniert, weil eine ähnliche Farbe von nur 48 vordefinierten HSSFolors gefunden werden musste. also wurden in allen 256 * 256 * 256 Farben nur 48 abgebildet. – gaurav5430

3

Um die Notwendigkeit von Typumwandlung für die angewendete Cellstyles, erstellen Sie zuerst eine XSSFWorkbook mit angewendete Cellstyles (XSSFCellStyle) Anwendung der benutzerdefinierten Farben zu vermeiden und es dann mit einem SXSSFWorkbook Konstruktor wickeln wie die Probe unter:

/** 
* Sample based on POI <a href="http://poi.apache.org/spreadsheet/how-to.html#sxssf">Spreadsheet How-To</a>. 
* 
* @see <a href="https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html">SXSSFWorkbook</a> 
*/ 
public static void main(String[] args) throws Throwable { 

    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); 

    XSSFColor colorGrey = new XSSFColor(new Color(210, 210, 210)); 
    XSSFCellStyle cellStyleGrey = xssfWorkbook.createCellStyle(); 
    cellStyleGrey.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    cellStyleGrey.setFillForegroundColor(colorGrey); 

    // keep 100 rows in memory, exceeding rows will be flushed to disk 
    SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook, 100); 
    Sheet sheet = sxssfWorkbook.createSheet(); 

    for (int rownum = 0; rownum < 1000; rownum++) { 
     Row row = sheet.createRow(rownum); 
     for (int cellnum = 0; cellnum < 10; cellnum++) { 
      Cell cell = row.createCell(cellnum); 
      String address = new CellReference(cell).formatAsString(); 
      cell.setCellValue(address); 

      // for even rows apply the grey cellStyle 
      if (rownum % 2 == 0) { 
       cell.setCellStyle(cellStyleGrey); 
      } 
     } 

    } 

    // Omitted asserts block from original sample... 

    FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 
    sxssfWorkbook.write(out); 
    out.close(); 

    // dispose of temporary files backing this workbook on disk 
    sxssfWorkbook.dispose(); 
}