2013-12-13 20 views
5

Próbuję napisać ogromny plik Excela, moje wymaganie pozwala mi pisać wiersz i zapomnieć, więc używam SXSSF, który pozwala zachować tylko kilka rzędów w pamięci i odpoczynku wszystkie są zapisywane w dokumencie. pomaga to w przezwyciężaniu wyjątku dotyczącego wyjątków dla dużych plików.Używanie kolorów niestandardowych z SXSSF (Apache POI)

, ale muszę również ustawić style dla komórek za pomocą skoroszytu sxssf. nie jestem w stanie znaleźć sposobu na zdefiniowanie i użycie niestandardowych kolorów w SXSSF (tak jak w XSSF, możemy zdefiniować niestandardowy kolor bezpośrednio, aw HSSF możemy zamienić wpis w palecie na niestandardowy kolor)

i nie może znaleźć sposobu na uzyskanie dostępu do palety od SXSSF workbook.

Nie mogę utworzyć nowego HSSF palette, ponieważ konstruktor jest chroniony.

Jedynym sposobem, który wydaje się obecnie możliwy, jest znalezienie podobnego koloru z listy wszystkich wstępnie zdefiniowanych kolorów i użycie go zamiast oryginału (ale wymagałoby to dopasowania koloru rgb do algo, co byłoby kolejnym zadanie)

może ktoś sugerują obejście (lub może sugerować prymitywny algorytm dopasowywania kolorów RGB)

Odpowiedz

11

Więc po kawałku przeszukiwaniu sieci i czytając dokumenty, mam wskazówkę, że SXSSF jest rzeczywiście otoczyłem XSSF, więc wypisałem CellStyle zwrócone przez skoroszyt SXSSF do XSSF i mogłem użyć XSSFColor bezpośrednio do generowania kolorów.

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

inaczej Próbowałem przekonwertować RGB do formatu Lab, a następnie używając odległości euklidesowej, aby znaleźć podobne kolory, ale to nie zadziałało w tym przypadku, ponieważ podobny kolor musiał być znaleziony tylko z 48 predefiniowanych dostępnych HSSFColors. więc we wszystkich 256 * 256 * 256 kolorach były mapowane tylko do 48. – gaurav5430

3

Aby uniknąć potrzeby typecast dla cellStyles utworzyć najpierw XSSFWorkbook z cellStyles (XSSFCellStyle) stosując własne kolory i owinąć go z konstruktora SXSSFWorkbook jak próbki poniżej:

/** 
* 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(); 
}