/ / SXSSFでカスタムカラーを使う(Apache POI) - java、excel、apache-poi

SXSSF(Apache POI)でカスタムカラーを使用する - java、excel、apache-poi

私は巨大なExcelファイルを書き込もうとしています、私の要求は私が行を書いて忘れることを可能にしているので、私は使っています SXSSF これにより、少数の行だけをメモリに保持し、残りのすべての行をドキュメントに書き込むことができます。これは大きなファイルのメモリ不足の例外を克服するのに役立ちます。

しかし、私はまたスタイルをセルに設定する必要がありますsxssfワークブックSXSSFでカスタムカラーを定義して使用する方法を見つけることができません(XSSFのように、カスタムカラーを直接定義でき、HSSFではパレットのエントリをカスタムカラーで置き換えることができます)。

私はからパレットにアクセスする方法を見つけることができません SXSSFワークブック.

新規作成できません HSSFパレット コンストラクタは保護されているので。

現在実行可能と思われる唯一の方法は、どういうわけか、すべての事前定義された色のリストから類似の色を見つけて、オリジナルの代わりにそれを使用します(しかし、それは別の仕事になるでしょう、RGBカラーマッチングアルゴを持つことを必要とするでしょう)

誰かが回避策を提案することができますか(または原始的なRGBカラーマッチングアルゴリズムを提案することができる)

回答:

回答№1の11

そのため、Webを介して少し検索した後ドキュメントを読んで、SXSSFは実際にはXSSFのラッパーであるというヒントを得たので、SXSSFワークブックから返されたCellStyleをXSSFに型キャストし、色を生成するのにXSSFColorを直接使用できました。

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

回答№2については4

cellStylesの型キャストの必要性を回避するために、最初にカスタムカラーを適用するcellStyles(XSSFCellStyle)を使用してXSSFWorkbookを作成してから、次のサンプルのようにSXSSFWorkbookコンストラクタでそれをラップします。

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