Apache POI autoSizeColumn Resizes Incorrectly

前端 未结 8 940
小鲜肉
小鲜肉 2020-11-29 06:27

I\'m using Apache POI in java to create an excel file. I fill in the data then try to autosize each column, however the sizes are always wrong (and I think consiste

相关标签:
8条回答
  • 2020-11-29 06:58

    I found that auto-sizing didn't make the column wide enough when the widest string began with spaces, e.g.

    cell.setCellValue("   New Cell");
    

    This can be fixed by using indentations instead, e.g.

    // 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);
    
    0 讨论(0)
  • 2020-11-29 07:01

    The following works for me.

    I set the font and use autoSizeColumn() after enter all the data.

        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;
    }
    
    0 讨论(0)
  • 2020-11-29 07:02

    I've used Helvetica font trying to replace Arial font (in fact, Helvetica is similar to Arial).

    XSSFFont font = wb.createFont();
    font.setFontName("Helvetica");
    
    0 讨论(0)
  • 2020-11-29 07:08

    Here are my 2 cents -

    I was using the default font (Arial in my case) using it to make certain fields bold in the xls. Worked like a charm in Windows along with autoSizeColumn() function.

    Linux wasn't that forgiving. The auto-sizing was improper at places. After going through this thread and other I came up with the following solution.

    I copied the Arial font's .tff files into the JAVA/jre/lib/fonts directory and re-ran the application. Worked just fine.

    0 讨论(0)
  • 2020-11-29 07:10

    I had a similar issue on Windows 7.

    I was using the Calibri font (that is supported in my JVM). With that font the getBounds().getWidth() of the java.awt.font.TextLayout used by the autoSizeColumn() POI method returns 0.

    Changing the font to Calibri-Regular solved the issue in my case.

    0 讨论(0)
  • 2020-11-29 07:12

    This is probably related to this POI Bug which is related to Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45.

    In this case changing the Font or using JRE above 6u45 / 7u21 should fix the issue.

    You can also mtigitate the issue and avoid the columns from being totally collapsed by using a code like this:

        sheet.autoSizeColumn(x);
    
        if (sheet.getColumnWidth(x) == 0) {
          // autosize failed use MIN_WIDTH
          sheet.setColumnWidth(x, MIN_WIDTH);
        }
    
    0 讨论(0)
提交回复
热议问题