Стиль ячейки HSSF применяется только после щелчка по нему в Excel

Как говорится в статье, созданный стиль применяется только после того, как я открою созданный файл *.xls и дважды щелкну отформатированную ячейку.

 public HSSFWorkbook makeWorkbookExc(List<String[]> allValues, List<String> captions, Integer[] order,
        List<Integer> numTypeColumns,List<Integer> dateTypeColumns, final container container, final List<ErrorContainer> errors) {
    HSSFWorkbook workbook = new HSSFWorkbook();

    HSSFFont fontBold = workbook.createFont();
    fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    fontBold.setFontHeightInPoints((short) 11);
    HSSFCellStyle styleBold = workbook.createCellStyle();
    styleBold.setFont(fontBold);

    HSSFFont font = workbook.createFont();
    font.setFontHeightInPoints((short) 11);
    font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
    HSSFCellStyle style = workbook.createCellStyle();
    style.setFont(font);
    style.setWrapText(true);
    HSSFDataFormat dataFormat = workbook.createDataFormat();
    HSSFCellStyle dateStyle = ((HSSFWorkbook)workbook).createCellStyle();
    dateStyle.setDataFormat(dataFormat.getFormat("dd.mm.yyyy hh:mm"));
    HSSFSheet baseDataSheet = workbook.createSheet();
    int rowNr = 0;

    Row row = baseDataSheet.createRow(rowNr++);


    for(int i=0; i< allValues.size(); i++) {

        row = baseDataSheet.createRow(rowNr++);
        String[] dataFields = allValues.get(i);

        for (int index = 0 ; index < order.length; index++){
            Cell nmrCell = row.createCell(index);   
            String value = dataFields[order[index]];
            if(value.contains("<br>")){
                //listagg spaces fix
                String trimSpaces = value.trim().replaceAll(" +"," ");
                value = trimSpaces;
                String replace = value.trim().replaceAll("<br> ","\n\n");
                value = replace;
            }

            if (!numTypeColumns.isEmpty() && !"".equals(value) && numTypeColumns.contains(index+1)){
                double valueDouble = Double.parseDouble(value);
                nmrCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                nmrCell.setCellValue(valueDouble);
            } else if(!numTypeColumns.isEmpty() && !"".equals(value) && dateTypeColumns.contains(index+1)){
                nmrCell.setCellStyle(dateStyle);
                nmrCell.setCellValue(value);
            }else
                nmrCell.setCellStyle(style);
                nmrCell.setCellValue(value);


        }

    }

    return workbook;
}

Есть ли решение?

Lorem ipsum dolor sit amet, habeo aliquam Definitionem qui eu, ut voluptua mandamus ius. Sint aliquam nam at. In eam fastidii inimicus similique. Ne cum viderer diceret, appetere liberavisse sea in. Eam suas brute in, est simul debitis te, falli elitr имеет идентификатор. Продажа errem vis no, eu vis case habeo.

Eam ne quidam semper adversarium, vim lorem ridens tractatos ei, vivendum sententiae vix ut. Eros aliquam vivendo ei sea. Te singulis deserunt expetenda cum. Causae petentium nec ne. Ea adhuc graeci est, eos no tritani mnesarchum. Per suavitate torquatos disputationi eu, augue epicuri nec et.


person mAtsea    schedule 04.12.2015    source источник
comment
Где бит, где вы создаете стили? Также должен ли быть { после else?   -  person Gagravarr    schedule 04.12.2015
comment
Я обновил данный код   -  person mAtsea    schedule 04.12.2015
comment
Какую версию Apache POI вы используете? И если это не последняя версия, что произойдет при обновлении?   -  person Gagravarr    schedule 04.12.2015
comment
Обновлен до последней стабильной версии .13 и ничего не изменил. Я думаю, что это как-то связано со стилем ячейки по умолчанию (richtext), прежде чем я изменю его на dateStyle.   -  person mAtsea    schedule 07.12.2015
comment
Я только что заметил, что для чисел вы устанавливаете значение ячейки как double (хорошо!), но для дат, похоже, вы можете установить значение как String, а не как Date - так ли это?   -  person Gagravarr    schedule 07.12.2015
comment
да, спасибо, я тоже это заметил и добавил разбор simpleDateFormat :)   -  person mAtsea    schedule 07.12.2015


Ответы (2)


Таким образом, ответ заключался в добавлении синтаксического анализа даты, потому что я изначально получал значение в виде строки

SimpleDateFormat date = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
                try {
                    Date dateVal = date.parse(value);
                    nmrCell.setCellStyle(dateStyle);
                    nmrCell.setCellValue(dateVal);
                } catch (ParseException e) {
                    nmrCell.setCellValue(value);
                }
person mAtsea    schedule 07.12.2015
comment
Я попробовал вышеуказанное решение, но оно не сработало. Тем не менее форматирование применяется только после нажатия на ячейку Excel. - person Prem Prakash; 17.02.2017
comment
Я также сталкиваюсь с той же проблемой. - person Madan; 16.03.2017

Пожалуйста, проверьте тип данных cell.SetCellValue. Например, для форматирования данных валюты тип данных будет двойным cell.SetCellValue(double) или датой, это будет дата. cell.SetCellValue(String) может вызвать проблемы

person Avijit Ghosh    schedule 25.06.2020