Не удается увидеть изменения стиля в POI. Apache Excel .xls документ - PullRequest
0 голосов
/ 11 марта 2019

Интересно, как автоматически изменить размер столбцов в Excel doc.Когда я запускаю этот код, он не делает дерьмо в документе.И я не могу понять, что не так!

Буквально, в документе ничего не изменено автоматически.Я не понимаю, что может быть не так !!Очень расстраивающая проблема:

try
        {
            FileInputStream myxls = new FileInputStream("/Users/xxxxxx/Desktop/tryIt.xls");
            HSSFWorkbook workbook = new HSSFWorkbook(myxls);
            HSSFSheet sheet = workbook.getSheetAt(0);
            int lastRow=sheet.getLastRowNum();


        HSSFCellStyle styleRowHeading = workbook.createCellStyle();
        HSSFCellStyle style = workbook.createCellStyle();

        HSSFFont fontRowHeading = workbook.createFont();
        HSSFFont font = workbook.createFont();

        fontRowHeading.setBold(true);
        fontRowHeading.setFontName(HSSFFont.FONT_ARIAL);
        fontRowHeading.setFontHeightInPoints((short) 14);

        styleRowHeading.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        styleRowHeading.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        styleRowHeading.setBorderTop(BorderStyle.MEDIUM);
        styleRowHeading.setBorderBottom(BorderStyle.MEDIUM);
        styleRowHeading.setBorderLeft(BorderStyle.MEDIUM);
        styleRowHeading.setBorderRight(BorderStyle.MEDIUM);
        styleRowHeading.setFont(fontRowHeading);

        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short)12);

        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setBorderTop(BorderStyle.MEDIUM);
        style.setBorderBottom(BorderStyle.MEDIUM);
        style.setBorderLeft(BorderStyle.MEDIUM);
        style.setBorderRight(BorderStyle.MEDIUM);
        style.setFont(font);

        // Create heading

        if(lastRow <=0){
        Row rowHeading = sheet.createRow(lastRow);
        rowHeading.createCell(0).setCellValue("TEST1");
        rowHeading.createCell(1).setCellValue("TEST2");
        rowHeading.createCell(2).setCellValue("TEST3");
        rowHeading.createCell(3).setCellValue("TEST4");

        for(int i = 0; i < 4; i++){                
            rowHeading.getCell(i).setCellStyle(styleRowHeading);
        }
        }

        Row row = sheet.createRow(++lastRow);

        int i = 0;

        org.apache.poi.ss.usermodel.Cell cellId = row.createCell(i);
        org.apache.poi.ss.usermodel.Cell cellId1 = row.createCell(i+=1);
        org.apache.poi.ss.usermodel.Cell cellId2 = row.createCell(i+=1);
        org.apache.poi.ss.usermodel.Cell cellId3 = row.createCell(i+=1);

        cellId.setCellValue(todaysDate);
        cellId1.setCellValue(txt_year.getText());
        cellId2.setCellValue(txt_correct.getText());
        cellId3.setCellValue(txt_errors.getText());

        cellId.setCellStyle(style);
        cellId1.setCellStyle(style);
        cellId2.setCellStyle(style);
        cellId3.setCellStyle(style);


        // Autofit

        for(int w = 0; w < 5; w++){
            sheet.autoSizeColumn(w);
        }

        myxls.close();

        FileOutputStream output_file =new FileOutputStream(new File("/Users/xxxx/Desktop/tryIt.xls"));
        //write changes
        workbook.write(output_file);
        output_file.close();
        System.out.println("SUCCESSSSSSSSS!");


        }catch(Exception e){
            System.out.println(e.getMessage());
        }

1 Ответ

0 голосов
/ 11 марта 2019

Я предполагаю, что здесь может быть проблема с HSSFCellStyle, не могли бы вы перейти на CellStyle и один раз проверить, нет ли каких-либо изменений в форматировании:

CellStyle style=null;
XSSFFont defaultFont= wb.createFont();
defaultFont.setFontHeightInPoints((short)10);
defaultFont.setFontName("Arial");
defaultFont.setColor(IndexedColors.BLACK.getIndex());
defaultFont.setBold(false);
defaultFont.setItalic(false);

XSSFFont font= wb.createFont();
font.setFontHeightInPoints((short)10);
font.setFontName("Arial");
font.setColor(IndexedColors.WHITE.getIndex());
font.setBold(true);
font.setItalic(false);

style=row.getRowStyle();
style.setFillBackgroundColor(IndexedColors.DARK_BLUE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFont(font);

Ключевые моменты, которые следует иметь в виду:

Давайте разберемся с основным различием между HSSFWorkbook и XSSFWorkbook

  • HSSFWorkbook : в этом классе есть методы для чтения и записи файлов Microsoft Excel в формате .xls.

  • XSSFWorkbook : в этом классе есть методы для чтения и записи MicrosoftXML-файлы Excel и OpenOffice в формате .xls или .xlsx.

  • SXSSF : это API-совместимое потоковое расширение XSSF, которое используется при работе с очень большими электронными таблицамидолжны быть произведены, и пространство кучи ограничено

Workbook

Это супер-интерфейс всех классов, которые создают илиподдерживать книги Excel.Он принадлежит к пакету org.apache.poi.ss.usermodel, и оба вышеупомянутых XSSF, HSSF и SXSSF являются реализациями WORKBOOK

Следовательно,Я бы посоветовал до тех пор, пока, если не будет крайней необходимости, т. е. вам нужна определенная функция для xlsx или xls, просто перейдите к реализации рабочей книги

Большинство изменений в стилях - пробные и пробные,Вам нужно продолжать копаться итерациями, чтобы, наконец, найти то, что вам нужно.


Предложения:

Если вы кодируете только HSSF через HSSFWorkbook, выможет работать только с файлами .xls.Я бы посоветовал вам использовать обычные везде, где это возможно (workbook)

Ваш код загрузки должен выглядеть примерно так:

 Workbook wb = WorkbookFactory.create(new File("test.xls"));
 Sheet s = wb.getSheetAt(0);
 ....

Теперь он автоматически определит типфайл и вернуть вам рабочий объект для .xls или .xlsx в зависимости от того, что он находит.Кроме того, везде, где это возможно, старайтесь, чтобы стилизация и дизайн деталей были общими и независимыми от версии.Таким образом, один и тот же код может быть повторно использован для обоих форматов.

Если вам нужна какая-то особая функция, которая требует либо XSSF, либо HSSF и не может использовать только Workbook затем выполните проверку для type, сначала так:

Workbook wb = WorkbookFactory.create(myExcelFile);
Then you can check the exact type created by the factory:

if (wb instanceof HSSFWorkbook) {
    // do whatever
} else if (wb instanceof SXSSFWorkbook) {
    // do whatever
} else if (wb instanceof XSSFWorkbook) {
    // do whatever
}
...