Apache POI从工作簿中删除CellStyle

时间:2011-11-17 14:37:01

标签: java apache-poi

使用apache POI ...我使用了workbook.CreateCellStyle(),如果过了一段时间我需要删除创建的CellStyle ...如何从工作簿中删除它?我可以看到即使它未使用它仍然存在。

我需要的是像workbook.deleteCellStyle(cellStyle.getIndex());

5 个答案:

答案 0 :(得分:4)

从源头判断,以下方法删除未使用的CellStyles:

org.apache.poi.hssf.usermodel.HSSFOptimiser.optimiseCellStyles(HSSFWorkbook)

答案 1 :(得分:4)

r1391891开始,HSSFOptimiser除了删除重复的单元格样式外,还会删除未使用的样式。

所以,抓住你自己最近的每晚build / svn checkout版本(或者只是等待一个月左右的3.9-beta1版本!),然后执行以下操作:

NPOIFSFileSystem poifs = new NPOIFSFileSystem(new File("/path/to/excel/file.xls"));
HSSFWorkbook wb = new HSSFWorkbook(poifs.getRoot());
HSSFOptimiser.optimiseCellStyles(wb);

FileOutputStream fout = new FileoutputStream("optimised.xls");
wb.write(fout);
fout.close()

之后,optimsed.xls将不包含重复的单元格样式,也不包含未使用的单元格样式。 (如果文件尚未存在,您可以轻松地将优化步骤放在创建文件的末尾)

注意 - HSSFOptimiser方法仅适用于.xls文件,而不适用于XSSF .xlsx文件。应该可以通过不太多的工作来概括方法,但现在它只是HSSF ....

答案 2 :(得分:2)

目前的源代码中没有直接的方法:

这就是风格的创建方式:

public HSSFCellStyle createCellStyle()
{
    ...
    ExtendedFormatRecord xfr = workbook.createCellXF();
    short index = (short) (getNumCellStyles() - 1);
    HSSFCellStyle style = new HSSFCellStyle(index, xfr, this);
    return style;
}

public short getNumCellStyles()
{
    return (short) workbook.getNumExFormats();
}

和(在InternalWorkbook中)<​​/ p>

public int getNumExFormats() {
    ...
    return numxfs;
}

并使用workbook.createCellXF()解析为:

public ExtendedFormatRecord createCellXF() {
    ExtendedFormatRecord xf = createExtendedFormat();

    records.add(records.getXfpos()+1, xf);
    records.setXfpos( records.getXfpos() + 1 );
    numxfs++;
    return xf;
}

那么从HSSFWorkbook可以得到的是:

InternalWorkbook getWorkbook() {
    return workbook;
}

然后在InternalWorkbook对象上:

public ExtendedFormatRecord getExFormatAt(int index) {
    int xfptr = records.getXfpos() - (numxfs - 1);

    xfptr += index;
    ExtendedFormatRecord retval =
    ( ExtendedFormatRecord ) records.get(xfptr);

    return retval;
}

public void removeExFormatRecord(ExtendedFormatRecord rec) {
    records.remove(rec); // this updates XfPos for us
    numxfs--;
}

所以简而言之,从顶级工作簿开始,就像这样:

 InternalWorkbook w = workbook.getWorkbook();
 ExtendedFormatRecord record = w.getExFormatAt(index);
 w.removeExFormatRecord(record);

这一切都非常可怕:)

答案 3 :(得分:1)

获取单元格并将NOTHING设置为样式可能有效:

HSSFRow hr= workBook.getSheet("SheetName").getRow(rowIndex);
HSSFCell hc=hr.getCell(cellIndex);
hc.setCellStyle(null);

请尝试这可能会对你有用。

答案 4 :(得分:1)

您可以通过将具有任何所需单元格样式的数据复制到新创建的工作簿来解决此问题。幕后的单元格“生存”似乎是错误的,或者没有经过深思熟虑。