Java Apache POI autoSizeColumn的大小调整不正确

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,

我正在使用java中的ApachePOI创建一个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;
}
公共静态同步字符串存储结果(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目录中,然后重新运行应用程序。工作正常。

我也遇到了这个问题,这就是我的解决方案

步骤:

  • 创建工作簿
  • 创建电子表格
  • 创建行
  • 创建/设置字体为“Arial”
  • 使用字体创建/设置样式
  • 创建/设置具有值和样式的单元格
  • autoSizeColumn
  • 创建文件
  • 代码:

    资源:


    我发现当最宽的字符串以空格开头时,自动调整大小并不能使列足够宽,例如

    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;
    }