我在java中使用Apache POI来创建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;
}
我知道有一些类似的问题,但大多数问题只是填写数据之前的大小调整。少数不是更复杂/没有答案。
编辑:我尝试使用几种不同的字体,但它不起作用。这并不太令人惊讶,因为无论字体是什么,所有列都应该完全折叠或者不应该是。
另外,因为出现了字体问题,我正在Windows 7上运行该程序。
已解决:这是一个字体问题。我发现唯一有效的字体是Serif。
答案 0 :(得分:13)
只是为了回答我的评论。这些行无法正确调整大小,因为Java不知道您尝试使用的字体this link如果要将新字体安装到Java中应该有帮助,这样您就可以使用更高级的东西。它还有Java知道的默认字体列表。
很高兴这有帮助,你解决了问题!
答案 1 :(得分:7)
这可能与this POI Bug有关,Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45。
在这种情况下,更改字体或使用高于6u45 / 7u21的JRE应该可以解决问题。
您还可以通过使用以下代码来调整问题并避免列完全崩溃:
sheet.autoSizeColumn(x);
if (sheet.getColumnWidth(x) == 0) {
// autosize failed use MIN_WIDTH
sheet.setColumnWidth(x, MIN_WIDTH);
}
答案 2 :(得分:6)
我也遇到了这个问题,这是我的解决方案。
步骤:
代码:
// 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);
资源:
答案 3 :(得分:4)
我在Windows 7上遇到了类似的问题。
我使用的是Calibri字体(我的JVM支持)。
使用该字体时,getBounds().getWidth()
POI方法使用的java.awt.font.TextLayout
的{{1}}将返回0.
将字体更改为Calibri-Regular解决了我的问题。
答案 4 :(得分:2)
这是我的2美分 -
我使用默认字体(在我的情况下为Arial)使用它来使xls中的某些字段变为粗体。像Windows中的魅力和autoSizeColumn()函数一样工作。
Linux并不是那么宽容。在某些地方,自动调整大小是不合适的。经过这个线程和其他我提出了以下解决方案。
我将Arial字体的.tff文件复制到 JAVA / jre / lib / fonts 目录中并重新运行该应用程序。工作得很好。
答案 5 :(得分:1)
我发现当最宽的字符串以空格开头时,自动调整大小并不能使列足够宽,例如。
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);
答案 6 :(得分:1)
我使用Helvetica字体试图替换Arial字体(事实上,Helvetica类似于Arial)。
babel-node
答案 7 :(得分:0)
我的情况是在自动调整大小后,这些单元格比实际内容的宽度略小。
我所做的只是在调用 autoSizeColumn
方法后添加了额外的 200 个宽度。
sheet.autoSizeColumn(columnIndex);
sheet.setColumnWidth(columnIndex, sheet.getColumnWidth(columnIndex) + 200);
这对我来说很好:)