Я хочу удалить некоторые предопределенные стили для XLS - например, «Хорошо». Для XLSX нет проблем: создать новый CTCellStyle (к сожалению, отражением), setName («Хорошо»), setBuiltinId (26) и setHidden (true) - теперь Excel (2016) не показывает стиль «Хороший». Могу ли я сделать это для XLS?Как удалить пользовательский стиль для XLS через ApachePOI?
EDIT
Пример кода:
Hidding стиль для XLSX - нет проблем:
StylesTable styleSource = xssfWorkbook.getStylesSource(); // xssfWorkbook is instance of XSSFWorkbook
try {
// get ctCellStyles (by reflection)
Field field = StylesTable.class.getDeclaredField("doc");
field.setAccessible(true);
Object obj = field.get(styleSource);
StyleSheetDocument ssd = (StyleSheetDocument) obj;
CTStylesheet ctStyleSheet = ssd.getStyleSheet();
CTCellStyles ctCellStyles = ctStyleSheet.getCellStyles();
// find style "Good"
for (int i = 0; i < ctCellStyles.sizeOfCellStyleArray(); i++) {
CTCellStyle ctCellStyle = ctCellStyles.getCellStyleArray(i);
if (ctCellStyle.getName().equals("Good")) {
XmlBoolean hiddenXml = XmlBoolean.Factory.newInstance();
hiddenXml.setStringValue("1");
ctCellStyle.xsetHidden(hiddenXml);
}
}
} catch (Exception e) {}
Hidding стиль для XLS:
Если существует стиль в книге I может получить его, но как установить его как «скрытый»?
try {
// get InternalWorkbook (by reflection)
Field field = HSSFWorkbook.class.getDeclaredField("workbook");
field.setAccessible(true);
Object iwb = field.get(hssfWorkbook); // hssfWorkbook is instance of HSSFWorkbook
InternalWorkbook internalWorkbook = (InternalWorkbook) iwb;
// find style "Good"
for (int xfIndex = 0; xfIndex < internalWorkbook.getNumRecords(); xfIndex++) {
// try to get every record as StyleRecord from internalWorkbook
StyleRecord styleRecord = internalWorkbook.getStyleRecord(xfIndex);
if (styleRecord != null && styleRecord.getName() != null) {
if (styleRecord.getName().equals("Good")) {
new DebugUtil(styleRecord.getName());
// TODO set here sth like "hidden" for styleRecord or maybe:
// get style with current id from workbook
HSSFCellStyle hssfCellStyle = hssfWorkbook.getCellStyleAt((short) xfIndex); // workbook is instance of org.apache.poi.ss.usermodel.Workbook
// TODO set here sth like "hidden" for hssfCellStyle
}
}
}
} catch (Exception e) {}
Даже если бы я мог отметить стиль как «скрытой», есть другая проблема: если я итерация от 0
к internalWorkbook.getNumRecords()
я получаю только существующих стилей. Поэтому, если я создаю книгу самостоятельно, возможно, мне нужно создать новый стильRecord и/или HSSFCellStyle и пометить как «скрытый». Я пробовал:
int size = internalWorkbook.getSize();
StyleRecord newStyleRecord = internalWorkbook.createStyleRecord(size);
HSSFCellStyle newHssfCellStyle = hssfWorkbook.createCellStyle();
newHssfCellStyle.setAlignment((short) 3); // align right, for tests, to see difference between original and created "Good" style
newStyleRecord.setName("Good");
// TODO set here sth like "hidden" for newStyleRecord and/or for newHssfCellStyle
Это способ установить мой собственный «хороший» стиль. Если я этого не сделаю, Excel (2016) будет показывать стиль «Хороший».
Но 'getCellStyleAt()' возвращает пользовательский стиль (один из названных стилей)? Я думаю, что он возвращает стиль для ячейки. Я хотел бы работать с объектной формой класса StyleRecord. Возможно, я написал недостаточно ясно: Excel (2016) имеет 47 названных стилей. Если я удалю один из них для одного документа, сохраните этот документ в виде XLS, откройте его - стиль удаления не отображается в списке. ... – Piotr
... Я бы хотел сделать то же самое через ApachePOI: у меня есть имена стилей, которые должны отображаться в списке, но мне нужно сказать ApachePOI, чтобы удалить (скрыть?) Другие. У меня есть имена стилей, которые я хочу скрыть. Поэтому, может быть, я должен их создать (с помощью 'InternalWorkbook.createStyleRecord (int)' и 'Workbook.createCellStyle()') и «отметить» их как скрытые? Но как? Теперь, если я ничего не делаю, Excel показывает все предопределенные стили (LibreOffice - например - нет). – Piotr
Можете ли вы добавить свой пример кода к вопросу, это обычно упрощает просмотр того, что происходит. – centic