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.
Ответы
Ответ 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;
}