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

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

Пустые ячейки не пишутся (я полагаю), а изменение размерапрошлой что я делаю

Вот'соответствующий код: Это развернутая версия без обработки ошибок и т. Д.

public static synchronized String storeResults(ArrayList 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;
}

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

РЕДАКТИРОВАТЬ: Я попытался использовать пару разных шрифтов, и это нет работа. Который неЭто слишком удивительно, поскольку независимо от того, какой шрифт либо все столбцы должны быть полностью свернуты, либо ни один не должен быть.

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

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

 user345443925 июл. 2017 г., 05:09
Dot Net сталкивается с той же проблемой?
 Jaws21205 июн. 2013 г., 17:42
@kiwiwings Я использую шрифт по умолчанию (Calibri), который в Windows просто отлично. Я'попробую изменить шрифт на что-то другое и опубликую результаты, но я неНе думаю, что это будет шрифт.
 Shaded05 июн. 2013 г., 20:57
Можете ли вы попробовать использоватьSerif шрифт (или проверить, если у вас уже есть) и посмотреть, работает ли это? У меня есть ощущение, что это связано со шрифтами, которые знает Java.
 AknKplnoglu27 нояб. 2014 г., 10:21
Можете ли вы поделиться своим рабочим кодом здесь? @ Jaws212
 kiwiwings05 июн. 2013 г., 17:29
Вы проверили эти два вопросаA? 1, 2 ... возможно, что-то связано с использованным шрифтом
 Jaws21205 июн. 2013 г., 22:14
Сериф работал. Я никогда не пробовал что-то такое общее, но, думаю, мне следовало это сделать. Спасибо
 Gagravarr05 июн. 2013 г., 23:51
Вы проверили, что Java может видеть все шрифты, которые есть в вашей системе?

Ответы на вопрос(8)

Это, вероятно, связано сэта ошибка 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); }

 golimar19 окт. 2016 г., 12:49
В моем случае столбец остается свернутым даже после setColumnWidth ... что было бы типичным MIN_WIDTH?
 t0r0X01 июл. 2015 г., 17:34
Тот'Решающий ответ, спасибо !!! Обновление, понижение или исправление JRE решают мою проблему, так как Calibri является шрифтом по умолчанию в текущей версии Excel.

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

XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
Решение Вопроса

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

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

 theblang09 июл. 2013 г., 20:56
Мне действительно любопытно, что изменилось, чтобы это произошло, и почему я вижу это только в наших разработках для Windows 7. Смотрите мой комментарий на Альдоответ.
 t0r0X01 июл. 2015 г., 17:40
@mattblang См. Себастьянответ для объяснения. У нас была эта проблема также только на наших блоках разработки (Windows), но не на машинах интеграции (Linux).

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

cell.setCellValue("   New Cell");

Это можно исправить с помощью отступов, например, I '

// 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);

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

шаги:

Создать рабочую книгуСоздать электронную таблицуСоздать строкуСоздать / установить шрифт на "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

 sancho2111 апр. 2016 г., 13:37
На самом деле, добавление шрифта до / после написания контента, решает проблему

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

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

    public static XSSFWorkbook createExcel(List 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;
}

У меня была похожая проблема на Windows 7.

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

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

 t0r0X01 июл. 2015 г., 17:37
Это, видимо, решило проблему, но на самом деле нет, потому чтоCalibri-Regular» будучи не установленным, его заменили наArial», который выглядит по-другому. Себастьен»Ответ s обеспечил решение в моем случае.
 theblang09 июл. 2013 г., 20:43
Я также использовал Calibri, который работал, когда я впервые написал код. Единственное, что изменилось, о чем я могу подумать, это наша версия Java с 6 до 7. Странно то, что наши Linux-боксы по-прежнему работают нормально, пострадали только наши среды разработки Windows 7.
 theblang09 июл. 2013 г., 22:16
Weird,Verdana Безразлично»не совсем правильно работает на производственных блоках Linux. Я собираюсь попробовать просто с помощьюCalibri-Regular как вы упомянули.

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

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

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

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

Ваш ответ на вопрос