【问题标题】:How to auto adjust the column in excel in apache POI如何在apache POI中自动调整excel中的列
【发布时间】:2016-10-19 22:17:38
【问题描述】:

我正在使用 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 的新手

【问题讨论】:

  • 你想怎么调整?哪一栏?澄清。
  • @Ravikumar 我想根据标题调整列,例如,如果名字是 10 个字符,标题也会被调整
  • 不够清楚,编辑您的问题并添加类似当前输出是这样的预期的输出应该是这样的
  • @Ravikumar 看到我已经附加了一个屏幕什么是输出,我想用单元格值调整标题长度
  • 您希望标题名称出现在单行中吗?或者您是否希望列完美对齐而不与其他列重叠?

标签: java excel apache-poi


【解决方案1】:

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

此方法调整列宽以适应内容,阅读doc

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

示例代码

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

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

【讨论】:

  • 请注意 autoSizeColumn 很慢,尤其是在具有合并区域的工作表上。
  • 嗨,我知道我迟到了,但是当我使用 sheet.autoSizeColumn(0);它似乎可以正常工作,但仍然比需要的要小一些。如果我在 excel 本身中自动调整列宽,它会增加几个像素,有没有其他人经历过这个或者有没有人知道如何解决这个问题?
  • @BrendanRobert 不确定,但可能是字体问题。查看这些链接 link1link2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2012-01-26
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多