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();
posted @ 2020-01-20 11:35  Java半路人生  阅读(487)  评论(0编辑  收藏  举报