POI 导出Excel实现合并单元格以及列自适应宽度

时间:2024-03-27 08:30:58

目录

 

POI 导出Excel

1. 合并单元格

2. 自适应列宽度:

2.2 强调的是设置自适应列宽:

3. 设置列宽

3.1 字符串

3.2 单元格是公式单元格(单元格存的是公式)

4. POI IndexedColors 所有颜色索引

 

参考推荐:

Java HSSFWorkbook 生成 excel

POI 简易帮助文档系列--给Excel设置样式

Java Excel POI 实现合并单元格以及列自适应宽度

POI 导出Excel 并且根据内容设置列宽自适应

java POI 实现excel表格下拉框选择一个值,另一个单元格自动填充内容


POI 导出Excel

1. 合并单元格

POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是:

public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

/*
说明:
    1, // 起始行
    1, // 结束行
    0, // 起始列
    2  // 结束列
*/
sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2));

2. 自适应列宽度:

sheet.autoSizeColumn(i); // i:列索引

sheet.autoSizeColumn(i, true);

​

这两种方式都是自适应列宽度,但是注意这个方法在后边的版本才提供,poi的版本不要太老。

注意:第一个方法在合并单元格的的单元格并不好使,必须用第二个方法。

2.2 强调的是设置自适应列宽:

方法一:
sheet.autoSizeColumn(i); 
// 上面的属性,只能解决英文、数字列宽自适应,如果该列为中文,会出现列宽不足现象。
1. sheet.autoSizeColumn(i);//先设置自动列宽 
2. sheet.setColumnWidth(i, sheet.getColumnWidth(i)*17/10);
// 设置列宽为自动列宽的1.7倍(当然不是严格的1.7倍,int的除法恕不再讨论),这个1.6左右也可以,这是本人测试的经验值*

方法二:
可通过手动设置列宽解决

首先通过value.getBytes().length方法对比找到该列数据最大长度

通过sheet.setColumnWidth(i, cellLength*2*256);手动设置列宽。

长度乘以2是为了解决纯数字列宽度不足会显示科学计数法问题,乘以256得到的数据才是excel真实列宽。

案例参考:
if (autoSize) {
      // Autosize columns
      for (int i=0; i < maxColumns && i < rowsetBody[0].length; i++) {
        workbookSheet.autoSizeColumn(i);        
        //设置中文列宽自适应
        int curColWidth = workbookSheet.getColumnWidth(i)/256;
        for (int rowNum = 0; rowNum < workbookSheet.getLastRowNum(); rowNum++) {
            Row currentRow;  
            //当前行未被使用过  
            if (workbookSheet.getRow(rowNum) == null) {  
                currentRow = workbookSheet.createRow(rowNum);  
            } else {  
                currentRow = workbookSheet.getRow(rowNum);  
            }
            if (currentRow.getCell(i) != null) {
                Cell currentCell = currentRow.getCell(i);
                if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                    int length = currentCell.getStringCellValue().getBytes().length;
                    if (curColWidth < length) {  
                        curColWidth = length;  
                    }
                }
            }
        }        
        workbookSheet.setColumnWidth(i,curColWidth*256);
      }      
    }

3. 设置列宽

3.1 字符串

sheet.setColumnWidth(m, “列名”.getBytes().length*2*256);

注:这个方法是计算字符串的长度,以便设置列宽,该方法在解决中文的问题上比较好,前面两种方法对中文不好好用。。。。

3.2 单元格是公式单元格(单元格存的是公式)

还有在自适应宽度的时候,有时候遇到单元格是公式单元格,自适应不起作用,那是因为单元格存的是公式,并不是真正的数据,解决方法:

HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook());

CellValue cell71Val = evaluator.evaluate(cell71);

cell71.setCellValue(cell71Val.getNumberValue());

将格式化后的数据再次set进去,就是真正的值了。

4. POI IndexedColors 所有颜色索引

POI 导出Excel实现合并单元格以及列自适应宽度

 

参考推荐

Java HSSFWorkbook 生成 excel

POI 简易帮助文档系列--给Excel设置样式

Java Excel POI 实现合并单元格以及列自适应宽度

POI 导出Excel 并且根据内容设置列宽自适应

java POI 实现excel表格下拉框选择一个值,另一个单元格自动填充内容