2015-11-02 4 views
0

Я хочу удалить некоторые предопределенные стили для 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) будет показывать стиль «Хороший».

ответ

1

Вы должны иметь возможность использовать HSSFWorkbook.getCellStyleAt(int index) для доступа к стилям в данной позиции.

+0

Но 'getCellStyleAt()' возвращает пользовательский стиль (один из названных стилей)? Я думаю, что он возвращает стиль для ячейки. Я хотел бы работать с объектной формой класса StyleRecord. Возможно, я написал недостаточно ясно: Excel (2016) имеет 47 названных стилей. Если я удалю один из них для одного документа, сохраните этот документ в виде XLS, откройте его - стиль удаления не отображается в списке. ... – Piotr

+0

... Я бы хотел сделать то же самое через ApachePOI: у меня есть имена стилей, которые должны отображаться в списке, но мне нужно сказать ApachePOI, чтобы удалить (скрыть?) Другие. У меня есть имена стилей, которые я хочу скрыть. Поэтому, может быть, я должен их создать (с помощью 'InternalWorkbook.createStyleRecord (int)' и 'Workbook.createCellStyle()') и «отметить» их как скрытые? Но как? Теперь, если я ничего не делаю, Excel показывает все предопределенные стили (LibreOffice - например - нет). – Piotr

+0

Можете ли вы добавить свой пример кода к вопросу, это обычно упрощает просмотр того, что происходит. – centic