EDIT:
それでは、どのようにキャッシュするためにPOIオブジェクトのハッシュを利用して装飾されたオブジェクトを追跡する程度。使用されていない他の作成されたCellStylesは、ガベージコレクションによって破棄されます。
今
final class MyCellStyle implements Cloneable {
private XSSFCellStyle xssfCellStyle;
public MyCellStyle(XSSFCellStyle xssfCellStyle) {
this.xssfCellStyle = xssfCellStyle;
}
@Override
public MyCellStyle clone() {
MyCellStyle clone = new MyCellStyle(xssfCellStyle);
return clone;
}
public final MyCellStyle borderLeftMedium() {
MyCellStyle result = clone();
result.xssfCellStyle.setBorderLeft(XSSFCellStyle.BORDER_MEDIUM);
return result;
}
... further decorations
public XSSFCellStyle getXSSFCellStyle() {
return xssfCellStyle;
}
}
新しいオブジェクトを作成しないようにするには、我々は
private MyCellStyle getCellStyle(MyCellStyle targetStyle) {
int targetHash = targetStyle.hashCode();
if (styleCache.keySet().contains(targetHash)) {
return styleCache.get(targetHash);
} else {
return styleCache.put(targetHash, targetStyle);
}
}
その後、私たちが作成できる小さな関数を書く
private Map<Integer, MyCellStyle> styleCache = new HashMap<>();
そして私たち自身のCellStyleクラス:ここ
は、当社のキャッシュです細胞そのものは次のようになります:
public void createCells() {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
MyCellStyle baseStyle = new MyCellStyle(
(XSSFCellStyle) wb.createCellStyle());
MyCellStyle decoratedStyle = getCellStyle(baseStyle.borderLeftMedium());
cell.setCellStyle(decoratedStyle.getXSSFCellStyle());
}
のhashCodeがMyCellStyleオブジェクトの同じプロパティに対して一意でない場合、我々はhashCodeを機能上書きする必要がある場合があります:
@Override
public int hashCode() {
return hashValue;
}
を、私たちの装飾機能の各々の中のスタイル値を追加します。
public final MyCellStyle borderLeftMedium() {
MyCellStyle result = clone();
result.xssfCellStyle.setBorderLeft(XSSFCellStyle.BORDER_MEDIUM);
hashValue += XSSFCellStyle.BORDER_MEDIUM; // simplified hash
return result;
}
=======================
ORIGINAL:
私は、セルスタイルにセルの特定のアスペクトを追加する装飾方法を作成するのが好きです。だから、最初にあなたは、あなたの基本スタイル
public final XSSFCellStyle cellStyleStringBase = wb.createCellStyle();
を作成し、
public XSSFCellStyle addBorderLeft(XSSFCellStyle style) {
XSSFCellStyle result = style.clone();
result.setBorderLeft(XSSFCellStyle.BORDER_MEDIUM);
return result;
}
特定のスタイルを作成するために、デコレータのメソッドを作成するには、新しいオブジェクトを作成しないようにしたい場合は今、あなたはまだ維持する必要があります独自の変数でcellStyles、あなたはそれを避けることはできませんが、あなたが飾る場合は、単にこの
cell1.setCellStyle(addBorderLeft(cellStyleStringBase);
cell2.setCellStyle(addBorderRight(addBorderRight(cellStyleStringBase));
...
のようなあなたの細胞を飾る場合は、私の経験から、パフォーマンスが十分ですそれは理にかなっているスタイルの多くは、独自のCellStyleクラス
public final MyCellStyle implements Cloneable {
private XSSFCellStyle xssfCellStyle;
public MyCellStyle(XSSFCellStyle xssfCellStyle) {
this.xssfCellStyle = xssfCellStyle;
}
@Override
public MyCellStyle clone() {
MyCellStyle clone = new MyCellStyle(this.xssfCellStyle);
return clone;
}
public final MyCellStyle borderLeftMedium() {
return this.clone().setBorderLeft(XSSFCellStyle.BORDER_MEDIUM);
}
public final MyCellStyle borderRightThick() {
...
}
あなたがより良い読めるようにし、あなたのスタイルを構築することができます作成します。
MyCellStyle base = new MyCellStyle(cellStyleStringBase);
cell1.setCellStyle(base
.addBorderLeftMedium()
.addBorderRightThick()
.addBorderBottomThin());
テストされていないが、私はそれが役に立てば幸い。
このソリューションは素晴らしいサウンドです。悲しいことに、私は別の作業に進む必要があったので、今すぐテストすることはできません... CellStylesはこの方法で再利用できますか?言い換えれば:遭遇したセルごとに、または遭遇したcellStyleごとに、新しいCellStyleを作成するか? – samjaf
私は依存関係の階層をちょうど読みました:私たちはまだpoi 3.9を使っています。しかし、私は古いメソッド 'setCellStyleProperty'を使って未使用の中間形式を作成することは受け入れられると思います。合計スタイルはほとんどなく、変更できるのはセルあたり最大2つの境界だけです。 30%の未使用スタイルを持つことは、30,000を超える疑似ユニークスタイルよりも優れています。私の以前の質問は、 'setCellStyleProperty'のソースを読んで、すでに知られているスタイルを再利用している部分を見つけて、今は時代遅れです。どうもありがとう! – samjaf
'setCellStyleProperty'を使用すると、セルから' CellStyle'を取得し、新しいプロパティがマージされた 'CellStyle'模様を作成し、ワークブックに相当する' CellStyle'を見つけようとします。存在しない場合、新しい「CellStyle」が作成され、セルに適用されます。 'setCellStyleProperties'は、一度に1つのメソッドに対してプロパティグループ全体に対してこれを行うことを可能にします。垂直の枠線を作成している場合は、枠線を追加した順番に応じて、左端の枠線のみ、または右端の枠線だけを使用して、未使用のスタイルを束ねることになります。 – jmarkmurphy