2013-06-05 3 views
21

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

Никаких пустых ячеек не написано (я считаю), а изменение размера последнее вещь сделаю.

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

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.

+1

Вы проверили эти два вопроса? [1] (http://stackoverflow.com/questions/11573993/setting-column-width-in-apache-poi/11574647), [2] (http://stackoverflow.com/questions/7412457/crash-when -calling-autosizecolumn-on-worksheet-when-run-under-linux-servicemix/12517025 # 12517025) ... у него, вероятно, есть что-то делать с используемым шрифтом – kiwiwings

+0

@kiwiwings Я использую шрифт по умолчанию (Calibri), который находится в Windows просто хорошо. Я попробую изменить шрифт на что-то еще и опубликовать результаты, но я не думал, что это будет шрифт. – Jaws212

+1

Можете ли вы попробовать использовать шрифт 'Serif' (или проверить, есть ли у вас), и посмотреть, работает ли это? У меня такое чувство, что это связано с тем, что Java знает. – Shaded

ответ

12

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

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

+1

Мне действительно интересно, что изменилось, чтобы это произошло и почему я вижу это только в наших окнах разработки Windows 7. Смотрите мой комментарий на ответ Альдо. – theblang

+0

@mattblang См. Ответ Себастьяна для объяснения. У нас была эта проблема также только на наших ящиках разработки (Windows), но не на интеграционных машинах (Linux). – t0r0X

4

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

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

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

+0

Я также использовал Calibri, который работал, когда я впервые написал код. Единственное, что изменилось, что я могу придумать, это наша версия Java от 6 до 7. Странно то, что наши Linux-серверы все еще работают нормально, на них повлияли только наши среды разработки Windows 7. – theblang

+0

Странно, 'Verdana' работает не совсем корректно на продуктовых Linux-боксах.Я попытаюсь использовать «Калибр-Регулярный», как вы упомянули. – theblang

+0

Это, по-видимому, решило проблему, но на самом деле этого не произошло, потому что «Calibri-Regular» не был установлен, он был заменен на «Arial», который выглядит по-другому. Ответ Себастьяна предоставил решение в моем случае. – t0r0X

7

Это, вероятно, связано с this POI Bug, что связано с Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45.

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

Вы также можете mtigitate проблему и избежать колонн от полного разрушилась, используя код, как этот sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); }

+0

Это решающий ответ, спасибо !!! Модернизация, понижение или исправление JRE действительно решают мою проблему, поскольку Calibri является шрифтом по умолчанию в текущей версии Excel. – t0r0X

+0

В моем случае столбец остается рухнувшим даже после setColumnWidth ... что будет типичным MIN_WIDTH? – golimar

2

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

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

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

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

6

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

Шагов:

  1. Создать Рабочий
  2. Создания таблицы
  3. Создать ряд
  4. Создать/Установить шрифт "Arial"
  5. Создать/Установить стиль с шрифтом
  6. Создать/Set ячейка со значением и типом
  7. autoSizeColumn
  8. Создать файл

Код:

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

+0

На самом деле, добавив шрифт до/после написания контента, решает проблему – sancho21

0

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

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

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

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

XSSFFont font = wb.createFont(); 
font.setFontName("Helvetica"); 
Смежные вопросы