Apache POI удалить CellStyle из книги - PullRequest
6 голосов
/ 17 ноября 2011

Использование apache POI ... Я использовал workbook.CreateCellStyle (), если через некоторое время мне нужно было удалить созданный CellStyle ... Как удалить его из книги? Я вижу, что он все еще остается, даже если он не используется.

Мне нужно что-то вроде workbook.deleteCellStyle (cellStyle.getIndex ());

Ответы [ 5 ]

4 голосов
/ 30 сентября 2012

Начиная с r1391891 , HSSFOptimiser также удаляет неиспользуемые стили, в дополнение к удалению дублирующихся стилей ячеек.

Итак, возьмите себе последнюю ночную сборку / svn checkout build (или просто подождите релиз 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 ....

4 голосов
/ 17 ноября 2011

Судя по источнику, следующий метод удаляет неиспользуемые CellStyles:

org.apache.poi.hssf.usermodel.HSSFOptimiser.optimiseCellStyles(HSSFWorkbook)
2 голосов
/ 02 октября 2012

В текущем исходном коде нет прямого метода:

Вот как создается стиль:

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)

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

Это все очень ужасно:)

1 голос
/ 28 сентября 2012

Вы можете обойти эту проблему, скопировав данные с необходимыми стилями ячеек во вновь созданную рабочую книгу. Похоже, что "выживание" ячеек стиля за кулисами глючит или плохо продумано.

1 голос
/ 27 сентября 2012

Получение ячейки и установка НИЧЕГО для стиля может работать:

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

Пожалуйста, попробуйте это, это может работать для вас.

...