Не удается увидеть изменения стиля в документе POI Apache Excel .xls

#java #excel #eclipse #netbeans #apache-poi

#java #excel #eclipse #netbeans #apache-poi

Вопрос:

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

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

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

Спасибо!

Вот мой код:

 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. Являются ли столбцы, которые вы пытаетесь изменить автоматически, объединенными ячейками? Также какой стиль шрифта вы используете?

2. также какую машину вы используете для разработки? windows или Linux? Где вы планируете его окончательно развернуть?

3. @vancleff Я использую HSSFFont.FONT_ARIAL, и я не знаю, что вы имеете в виду, если ячейки объединены-cells?

4. @vancleff Я использую Mac OS.

5. где вы планируете развернуть этот код?

Ответ №1:

Я предполагаю, что 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: в этом классе есть методы для чтения и записи XML-файлов Microsoft Excel и OpenOffice в формате .xls или .xlsx.

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

Рабочая тетрадь

Это суперинтерфейс всех классов, которые создают или поддерживают рабочие книги 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
}
  

Комментарии:

1. Оригинал: 4309размер: 4298оригинальный: 4053размер: 4070оригинальный: 3498размер: 3501оригинальный: 4309размер: 4298оригинальный: 4010размер: 4010

2. Вы вообще читали мой код? Я не думаю, что вы понимаете проблему, с которой я сталкиваюсь?

3. Ваше изменение размера работает просто отлично, сравните исходное и измененное значение из вашего вывода 🙂

4. ваш автоматический размер работает в соответствии с предоставленным вами выводом. что еще не работает?

5. Что ж, даже если автоматический размер работает, это определенно не решение проблемы! Итак, фактический документ .xls не отображает данные, которые я только что добавил. Его явно не изменили для оптимального просмотра! Таким образом, даже если автоматический размер работает, это не так! Заголовок не изменяется автоматически, и это не те новые строки, которые добавляются каждый сеанс.