poi操作excel中,长用的一些可以使用的代码

Posted rensheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poi操作excel中,长用的一些可以使用的代码相关的知识,希望对你有一定的参考价值。

1. 根据 单元格的位置字符串,得到所在的行和列; 例如 “A2”-第一行第二列

// 数据开始行,列
String startDataCell = "A2";
CellReference cellReference = new CellReference(startDataCell);
int dataStartRow = cellReference.getRow();
int dataStartCol = cellReference.getCol();

2. 根据 sheet 获取该sheet中所有的合并单元格区域

int numMergedRegions = sheet.getNumMergedRegions();
for (int i = 0; i < numMergedRegions; i++) {

    CellRangeAddress mergedRegion = sourceSheet.getMergedRegion(i);

    int firstRow = mergedRegion.getFirstRow();
    int firstColumn = mergedRegion.getFirstColumn();
    int lastRow = mergedRegion.getLastRow();
    int lastColumn = mergedRegion.getLastColumn();

    
   // 根据坐标,创建新的合并区域
    CellRangeAddress cellRangeAddress = new CellRangeAddress(firstRow, lastRow, firstColumn, lastColumn);
    targetSheet.addMergedRegion(cellRangeAddress);
}

3. 单元格格式 复制

            // 将源单元格的格式 赋值到 目标单元格中
        CellStyle sourceCellStyle = sourceCell.getCellStyle();
        /*
            此处由于是新建了workbook对象,只能新建 CellStyle对象,然后clone,再赋值;
            直接赋值 源CellStyle对象 会报不是同源异常
        */
        CellStyle targetCellStyle = targetWorkBook.createCellStyle();
        targetCellStyle.cloneStyleFrom(sourceCellStyle);
        targetCell.setCellStyle(targetCellStyle);

4. 根据单元格类型,获取对应类型的值

        // 获取单元格类型,处理公式单元格
        CellType cellTypeEnum = sourceCell.getCellTypeEnum();
        switch (cellTypeEnum) {
            case STRING:
                targetCell.setCellValue(sourceCell.getStringCellValue());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(sourceCell)) {
                    // 日期格式的值
                    targetCell.setCellValue(sourceCell.getDateCellValue());
                } else {
                    targetCell.setCellValue(sourceCell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                targetCell.setCellValue(sourceCell.getBooleanCellValue());
                break;
            case FORMULA:
                // ***为公式的情况下获取的是单元格的数值
                try {
                    targetCell.setCellValue(sourceCell.getNumericCellValue());
                } catch (IllegalStateException e) {
                    LOGGER.error("单元格公式计算错误:公式为" + sourceCell.getCellFormula());
                    targetCell.setCellValue("单元格计算出错");
                }
                break;
            case BLANK:
                break;
            case ERROR:
                targetCell.setCellValue(sourceCell.getErrorCellValue());
                break;
            case _NONE:
                break;
            default:
        }

 

5. 单元格中有公式的情况,直接在代码进行计算,获取excel的计算器

// 获取计算器
FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();

// 计算所有的单元格的值
formulaEvaluator.evaluateAll();

 

6.  公式依赖其他excel的情况,给当前计算器,注入其他excel的计算器

//Excel依赖计算集合
Map<String, FormulaEvaluator> workbooks = new HashMap<>();

//放入依赖的计算器
 workbooks.put(v.getModelFileName(),targetWorkbook.getCreationHelper().createFormulaEvaluator());


//给当前计算器设置依赖的计算器
FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
formulaEvaluator.setupReferencedWorkbooks(workbooks);

// 计算器计算
formulaEvaluator.evaluateAll();

以上是关于poi操作excel中,长用的一些可以使用的代码的主要内容,如果未能解决你的问题,请参考以下文章

POI操作excel基本使用

springboot中poi操作合集

easyexcel中poi

使用Apache POI时,我可以使用索引遍历excel文件吗?

java使用POI操作excel文件,实现批量导出,和导入

java使用POI操作excel文件,实现批量导出,和导入