封装设置单元格格式为公式的方法
/**
*
* 公式处理
* @param workbook
* @param s
* @param rowIndex 数据起始行
* @param cellStartIndex
* @param cellEndIndex 本人涉及的表格格式有多个连续一样的 所以用cellStartIndex,
cellEndIndex批量定位单元格位置
*/
public static void updateFormula(Workbook workbook, Sheet s, int rowIndex,int cellStartIndex,int cellEndIndex){
FormulaEvaluator eval=null;
if(workbook instanceof HSSFWorkbook)
eval=new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
else if(workbook instanceof XSSFWorkbook)
eval=new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
//获得当前sheet的开始行
int firstRowNum = s.getFirstRowNum();
int lastRowNum = s.getLastRowNum();
//循环row
for(int rowNum = firstRowNum + rowIndex;rowNum <= lastRowNum;rowNum++){
//获得当前行
Row row = s.getRow(rowNum);
//找到指定单元格
for (int c = row.getFirstCellNum() + cellStartIndex; c < cellEndIndex; c++) {
Cell cell = row.getCell(c);
if(cell != null){
//设置格式为公式
cell.setCellFormula(cell.getStringCellValue());
eval.evaluateFormulaCell(cell);
}
}
}
}
遍历设置各个sheet中每row为公式的单元格格式
/**
* 单元格格式化成公式
* @param workbook
* @return
*/
public Workbook xssfFormulaEvaluator(Workbook workbook){
if(workbook != null){
for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
Sheet sheetAt = workbook.getSheetAt(sheetNum);
if (sheetNum == 0){
updateFormula(workbook,sheetAt,2,1,18);
}
.......其余sheet页详细代码省略,按需设置
}
}
workbook.setForceFormulaRecalculation(true);// 重新计算公式的意思
return workbook;
}
坑:因为导出模板需要多加一列,导致导入数据库的公式和导出的excel表字段列不一致,也因此导致公式不能计算,例如:导入a字段对应A1,结果导出在前面多加了一列,a字段对应为了B1,
希望下次自己长记性,不要犯这种低级错误,加油
解决:将导出多出来的字段加到sheet最后一列即可
注:仅供记录学习,能帮到大家更好,本人小白,各位大牛多多指点,轻喷