Получение ошибки при использовании POI HSSF

Я получаю сообщение об ошибке при попытке открыть лист Excel в MS Office 2003. Этот лист Excel создан с использованием HSSFWorkbook, реализующего область пользовательской модели org.apache.poi.hssf.usermodel

В Microsoft Excel 2003: «Слишком много разных форматов ячеек». В Microsoft Excel 2007/2010 файлы могут выдавать следующее сообщение об ошибке: «Excel обнаружил нечитаемое содержимое в файле». Это касается форматов ячеек, пожалуйста, обратитесь к следующей странице:

http://support.microsoft.com/kb/213904

Итак, как я могу исправить эту проблему в коде?


person Hektor Khristoff Barragan    schedule 13.07.2012    source источник
comment
Не могли бы вы показать нам код генерации?   -  person cporte    schedule 13.07.2012
comment
Возможно, вы создаете один формат ячейки для каждой ячейки? Форматы ячеек широки для рабочей книги и должны использоваться повторно...   -  person Gagravarr    schedule 14.07.2012


Ответы (1)


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

Где ваш код мог ранее выглядеть примерно так

Sheet s = wb.createSheet();
for (int rn=0; rn<=10; rn++) {
    Row r = s.createRow(rn);
    for (int cn=0; cn<=4; cn++) {
        Cell c = r.createCell(c);
        c.setCellValue( getMyCellValue(rn,cn) );

        CellStyle cs = wb.createCellStyle();
        cs.setBold(true);
        if (cn == 2) { 
            cs.setDataFormat( DataFormat.getFormat(yyyy/mm/dd) );
        }
        c.setCellStyle(cs);
    }
}

Вместо этого вам нужно вытащить создание стиля ячейки с самого начала, что-то вроде

CellStyle bold = wb.createCellStyle();
bold.setBold(true);

CellStyle boldDate = wb.createCellStyle();
boldDate.setBold(true);
boldDate.setDataFormat( DataFormat.getFormat(yyyy/mm/dd) );

Sheet s = wb.createSheet();
for (int rn=0; rn<=10; rn++) {
    Row r = s.createRow(rn);
    for (int cn=0; cn<=4; cn++) {
        Cell c = r.createCell(c);
        c.setCellValue( getMyCellValue(rn,cn) );

        CellStyle cs = bold;
        if (cn == 2) { 
            cs = boldDate;
        }
        c.setCellStyle(cs);
    }
}
person Gagravarr    schedule 14.07.2012