Java Apache POI autoSizeColumn的大小调整不正确
我正在使用java中的ApachePOI创建一个excel文件。我填写数据,然后尝试自动调整每个列的大小,但是大小总是错误的(我认为是一致的)。前两行总是(?)完全折叠。当我在excel中自动调整列的大小时,它工作得非常好 没有空白单元格被写入(我相信),调整大小是我做的最后一件事 以下是相关代码:这是一个没有错误处理等的简化版本Java Apache POI autoSizeColumn的大小调整不正确,java,apache,excel,apache-poi,Java,Apache,Excel,Apache Poi,我正在使用java中的ApachePOI创建一个excel文件。我填写数据,然后尝试自动调整每个列的大小,但是大小总是错误的(我认为是一致的)。前两行总是(?)完全折叠。当我在excel中自动调整列的大小时,它工作得非常好 没有空白单元格被写入(我相信),调整大小是我做的最后一件事 以下是相关代码:这是一个没有错误处理等的简化版本 public static synchronized String storeResults(ArrayList<String> resultList,
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;
}
公共静态同步字符串存储结果(ArrayList resultList,字符串文件){
if(resultList==null | | resultList.size()==0){
返回文件;
}
FileOutputStream=新的FileOutputStream(文件);
//创建工作簿和结果表
XSSFWorkbook book=新XSSFWorkbook();
工作表结果=book.createSheet(“结果”);
//将结果写入工作簿
对于(int x=0;x
我知道有一些问题是类似的,但大多数问题只是在填写数据之前进行大小调整。而少数没有的问题则更加复杂/无法回答
编辑:我试过使用几种不同的字体,但都没用。这并不奇怪,因为无论字体是什么,要么所有的列都应该完全折叠,要么没有
另外,因为字体问题,我正在Windows7上运行这个程序
已解决:这是字体问题。我发现唯一有效的字体是衬线。只是为了从我的评论中找到答案。这些行无法正确地调整大小,因为Java不知道您尝试使用的字体,如果您想在Java中安装新字体,那么您可以使用更高级的字体。它还有Java知道的默认字体列表
很高兴这有助于解决您的问题 我在Windows7上也遇到了类似的问题 我使用的是Calibri字体(在我的JVM中受支持)。 对于该字体,
autoSizeColumn()
POI方法使用的java.awt.font.TextLayout
的getBounds().getWidth()
返回0
将字体更改为Calibri Regular解决了我的问题。这可能与哪个有关 在这种情况下,更改字体或使用6u45/7u21以上的JRE可以解决问题 您还可以使用以下代码对问题进行数字化,避免列完全折叠:
sheet.autoSizeColumn(x);
if (sheet.getColumnWidth(x) == 0) {
// autosize failed use MIN_WIDTH
sheet.setColumnWidth(x, MIN_WIDTH);
}
这是我的2美分-
我使用默认字体(在我的例子中为Arial)在xls中将某些字段设置为粗体。与autoSizeColumn()函数一起在Windows中发挥了巨大的作用
Linux并不是那么宽容。自动调整大小在某些位置不合适。在经历了这个线程和其他线程之后,我提出了以下解决方案
我将Arial字体的.tff文件复制到JAVA/jre/lib/fonts目录中,然后重新运行应用程序。工作正常。我也遇到了这个问题,这就是我的解决方案 步骤:
我发现当最宽的字符串以空格开头时,自动调整大小并不能使列足够宽,例如
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);
我用Helvetica字体试图取代Arial字体(事实上,Helvetica类似于Arial)
以下内容适合我 输入所有数据后,我设置字体并使用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;
}
publicstaticxssf工作簿createExcel(列表resList){
XSSFWorkbook hwb=新XSSFWorkbook();
字符串[]title={“1”、“2”、“3”、“4”};
XSSFSheet sheet=hwb.createSheet(“数据状态”);
XSSFRow firstrow=sheet.createRow(0);
for(int i=0;i
您检查过这两个问答吗?…它可能与使用的问题有关font@kiwiwings我使用Windows中的默认字体(Calibri)。我会尝试将字体更改为其他字体并发布结果,但我认为它不会是字体。你能试试我们吗
XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
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;
}