Подтвердить что ты не робот

Apache POI autoSizeColumn Изменяет размер неправильно

Я использую Apache POI в java для создания файла excel. Я заполняю данные, затем пытаюсь автоматизировать каждый столбец, однако размеры всегда ошибочны (и я думаю, что они согласуются). Первые две строки всегда (?) Полностью рушились. Когда я автоматически сортирую столбцы в excel, он отлично работает.

Никакие пустые ячейки не написаны (я считаю), а изменение размера - это последняя, которую я делаю.

Здесь соответствующий код: Это своя версия без обработки ошибок и т.д.

public static synchronized String storeResults(ArrayList<String> resultList, String file) {
    if (resultList == null || resultList.size() == 0) {
        return file;
    }
    FileOutputStream stream = new FileOutputStream(file);

    //Create workbook and result sheet
    XSSFWorkbook book = new XSSFWorkbook();
    Sheet results = book.createSheet("Results");

    //Write results to workbook
    for (int x = 0; x < resultList.size(); x++) {
        String[] items = resultList.get(x).split(PRIM_DELIM);

        Row row = results.createRow(x);
        for (int i = 0; i < items.length; i++) {
            row.createCell(i).setCellValue(items[i]);
        }
    }

    //Auto size all the columns
    for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) {
        results.autoSizeColumn(x);
    }

    //Write the book and close the stream
    book.write(stream);
    stream.flush();
    stream.close();

    return file;
}

Я знаю, что есть несколько вопросов, похожих на них, но большинство из них - это просто пример калибровки перед заполнением данных. И немногие, которые не являются более сложными/без ответа.

EDIT: Я попытался использовать пару разных шрифтов, и это не сработало. Это не слишком удивительно, так как независимо от того, какой шрифт либо все столбцы должны быть полностью свернуты, либо не должны быть.

Кроме того, поскольку проблема с шрифтом возникла, я запускаю программу в Windows 7.

РЕШЕННО: Это была проблема с шрифтом. Единственным шрифтом, который я нашел, который работал, был Serif.

4b9b3361

Ответ 1

Просто чтобы ответить на мой комментарий. Строки не могли правильно отсортироваться, потому что Java не знала о шрифте, который вы пытались использовать эта ссылка должна помочь, если вы хотите установить новые шрифты в Java, чтобы вы могли использовать что-то более интересное. Он также имеет список стандартных шрифтов, которые Java знает.

Рад, что это помогло, и вы решили проблему!

Ответ 2

Вероятно, это связано с этой ошибкой POI, связанной с ошибкой Java JDK-8013716: рендерер для шрифтов Calibri и Cambria завершился неудачно с момента обновления 45.

В этом случае изменение шрифта или использование JRE выше 6u45/7u21 должно решить проблему.

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

    sheet.autoSizeColumn(x);

    if (sheet.getColumnWidth(x) == 0) {
      // autosize failed use MIN_WIDTH
      sheet.setColumnWidth(x, MIN_WIDTH);
    }

Ответ 3

Я тоже сталкивался с этой проблемой, и это было моим решением.

Шаги:

  • Создать книгу
  • Создать таблицу
  • Создать строку
  • Создать/Установить шрифт в "Arial"
  • Создать/Установить стиль с помощью шрифта
  • Создать/Установить ячейку со значением и стилем
  • autoSizeColumn
  • Создать файл

код:

// initialize objects
XSSFWorkbook workbook = new XSSFWorkbook(); 
XSSFSheet spreadsheet = workbook.createSheet(sheetName);
XSSFRow row = spreadsheet.createRow(0);
XSSFCell cell;

// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);

// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);

// auto size
spreadsheet.autoSizeColumn(0);

// create file
File aFile = new File("Your Filename");
FileOutputStream out = new FileOutputStream(aFile);
workbook.write(out);

Ресурсы

http://www.tutorialspoint.com/apache_poi/index.htm

Ответ 4

У меня была аналогичная проблема в Windows 7.

Я использовал шрифт Calibri (который поддерживается в моей JVM). С помощью этого шрифта getBounds().getWidth() java.awt.font.TextLayout, используемого методом POI autoSizeColumn(), возвращает 0.

Изменение шрифта в Calibri-Regular решило проблему в моем случае.

Ответ 5

Вот мои 2 цента -

Я использовал шрифт по умолчанию (Arial в моем случае), используя его, чтобы отдельные поля были выделены жирным шрифтом в xls. Работала как очарование в Windows вместе с функцией autoSizeColumn().

Linux не был таким прощающим. Автоматическая калибровка была неправильной в местах. После прохождения этой темы и других я придумал следующее решение.

Я скопировал файлы шрифтов Arial.tff в каталог JAVA/jre/lib/fonts и перезапустил приложение. Работал отлично.

Ответ 6

Я обнаружил, что автоматическая калибровка не делает столбец достаточно широким, когда самая широкая строка начинается с пробелов, например.

cell.setCellValue("   New Cell");

Это можно исправить, используя вместо этого отступы, например

// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
style.setIndention((short)2);

// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);

// auto size
spreadsheet.autoSizeColumn(0);

Ответ 7

Я использовал шрифт Helvetica, пытающийся заменить шрифт Arial (на самом деле, Helvetica похож на Arial).

XSSFFont font = wb.createFont();
font.setFontName("Helvetica");

Ответ 8

Следующее работает для меня.

Я устанавливаю шрифт и использую autoSizeColumn() после ввода всех данных.

    public static XSSFWorkbook createExcel(List<ChannelVodFileInfoList> resList) {
    XSSFWorkbook hwb = new XSSFWorkbook();
    String[] title = { "1", "2", "3", "4"};

    XSSFSheet sheet = hwb.createSheet("dataStats");

    XSSFRow firstrow = sheet.createRow(0);
    for (int i = 0; i < title.length; i++) {
        XSSFCell xh = firstrow.createCell(i);
        xh.setCellValue(title[i]);
    }

    if (resList == null || resList.size() == 0) {
        return hwb;
    }

    for (int i = 0; i < resList.size(); i++) {
        ChannelVodFileInfoList doTemp = resList.get(i);
        XSSFRow row = sheet.createRow(i + 1);
        for (int j = 0; j < title.length; j++) {
            XSSFCell cell = row.createCell(j);
            Font font111 = hwb.createFont();
            font111.setBoldweight(Font.BOLDWEIGHT_NORMAL); 
            XSSFCellStyle cellStyle111 = hwb.createCellStyle();
            cellStyle111.setFont(font111);
            cell.setCellStyle(cellStyle111);

            if (j == 0) { 
                cell.setCellValue(dateStr);
            } else if (j == 1) {  
                cell.setCellValue(doTemp.getChannelName()); 
            }else if (j == 2) {  
                cell.setCellValue(doTemp.getBitrate()); 
            }else if (j == 3) {  
                cell.setCellValue(doTemp.getWh()); 
            }
         }

        for (int j = 0; j < title.length; j++) {
           sheet.autoSizeColumn(j);
        }

    return hwb;
}