如何在使用apache POI时自动调整Excel中的列宽

5
我正在使用Apache POI创建Excel文件,已生成Excel文件,但无法根据单元格值调整列宽。下面是我所做的代码:

以下是我如何在Excel中创建表头:

HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet();
        sheet.protectSheet("password");
        sheet.autoSizeColumn(15);
        HSSFFont hSSFFont = wb.createFont();
        hSSFFont.setFontName(HSSFFont.FONT_ARIAL);
        hSSFFont.setFontHeightInPoints((short) 8);

        CellStyle style = wb.createCellStyle();
        /* cell style for locking */
        CellStyle lockedCellStyle = wb.createCellStyle();
        lockedCellStyle.setLocked(true);

        HSSFRow row = null;

        HSSFCell cell = null;

        row = sheet.createRow(0);
        int headercolumnNo = 0;



        //1st Column Header for Indicator
        cell = row.createCell(headercolumnNo);
        cell.setCellValue(new HSSFRichTextString(listOfActiveCarrierUserHeader.get(0)));
        style.setWrapText(true);
        style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
        style.setFont(hSSFFont);
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        cell.setCellStyle(style);
        headercolumnNo = 1;

        cell = row.createCell(headercolumnNo);  //2nd Column Header for Firstname
        cell.setCellValue(new HSSFRichTextString(listOfActiveCarrierUserHeader.get(1)));
        style.setWrapText(true);
        style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
        style.setFont(hSSFFont);
        cell.setCellStyle(style);
        headercolumnNo = headercolumnNo + 1;

        cell = row.createCell(headercolumnNo);  //2nd Column Header for Firstname
        cell.setCellValue(new HSSFRichTextString(listOfActiveCarrierUserHeader.get(2)));
        style.setWrapText(true);
        style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
        style.setFont(hSSFFont);
        cell.setCellStyle(style);
        headercolumnNo = headercolumnNo + 1;

and this is how i have  populated the values in that excel file 

for(CarrierActiveUser carrierActiveUser : listOfCarrierUser){

            int columnNo = 0;
            row = sheet.createRow(j + 1);

            cell = row.createCell(columnNo);
            if(null != carrierActiveUser.getFistName()){

                cell.setCellValue(new HSSFRichTextString(carrierActiveUser.getFistName()));
                 lockedCellStyle.setFont(hSSFFont);
                 cell.setCellStyle(lockedCellStyle);

            }else{
                cell.setCellValue(new HSSFRichTextString(" "));
                cell.setCellStyle(lockedCellStyle);
            }

            columnNo = columnNo + 1;
            cell = row.createCell(columnNo);
            if(null != carrierActiveUser.getLastName()){

                cell.setCellValue(new HSSFRichTextString(carrierActiveUser.getLastName()));
                   lockedCellStyle.setFont(hSSFFont);
                cell.setCellStyle(lockedCellStyle);

            }else{
                cell.setCellValue(new HSSFRichTextString(" "));
                cell.setCellStyle(lockedCellStyle);
            }

            columnNo = columnNo + 1;
            cell = row.createCell(columnNo);
            if(null != carrierActiveUser.getLastName()){

                cell.setCellValue(new HSSFRichTextString(carrierActiveUser.getEmailId()));
                lockedCellStyle.setFont(hSSFFont);
                cell.setCellStyle(lockedCellStyle);

            }else{
                cell.setCellValue(new HSSFRichTextString(" "));
                cell.setCellStyle(lockedCellStyle);
            }

请有人帮助我调整列,我是apache poi的新手

Current output


1
你想要如何进行调整?是哪一列?请澄清。 - Ravikumar
@Ravikumar 我想根据表头调整列的宽度,例如如果名字是10个字符,表头也会相应地调整。 - storyteller
不够清晰,请编辑您的问题并添加类似于“当前输出为此”和“期望输出应该像这样”的内容。 - Ravikumar
@Ravikumar,我已经附上了一个屏幕截图,显示了输出结果,我想调整标题长度以适应单元格值。 - storyteller
您想让标题名称单行显示吗?或者您想让列完美对齐,不会与其他列重叠吗? - Ravikumar
@Ravikumar的列需要完美对齐。 - storyteller
1个回答

11

你可以使用HSSFSheet.autoSizeColumn(columnNumber)方法来完美对齐列。

该方法会自动调整列的宽度以适应内容,请参阅文档

在为所有列设置单元格值后,您可以使用此方法,在您当前的代码中,在for循环之后调用此方法。

示例代码:

sheet.autoSizeColumn(1);
sheet.autoSizeColumn(2);

注意 - 您需要为您想要对齐的所有列单独执行此操作,并且在将数据填充到Excel之后调用 sheet.autoSizeColumn(columnNumber)。在填充数据之前调用将没有任何效果。


请注意,autoSizeColumn 功能速度较慢,特别是在具有合并区域的工作表上。 - IceArdor
嗨,我知道我来晚了,但是当我使用sheet.autoSizeColumn(0);时,它似乎可以正常工作,但仍然比需要的稍微小一些。如果我在Excel中自动调整列宽,它会增加几个像素,有其他人遇到过这种情况吗?或者有人知道如何解决这个问题吗? - Brendan Robert
@BrendanRobert 不确定,但可能是字体问题。请查看这些链接 link1link2 - Ravikumar
给出错误:java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/font/FontRenderContext; 在 org.apache.poi.ss.util.SheetUtil.<clinit>(SheetUtil.java:111) 处 在 org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:235) 处 在 org.apache.poi.hssf.usermodel.HSSFSheet.autoSizeColumn(HSSFSheet.java:2165) 处 在 org.apache.poi.hssf.usermodel.HSSFSheet.autoSizeColumn(HSSFSheet.java:2147) 处 - Ramesh Bhati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接