我正在尝试使用许多公式更新现有的Excel文件。 我正在使用Apache POI 3.16
我知道Apache POI API本身正在提供FomulaEveluator来评估公式, 但Apache POI不支持某些公式。 我不能使用evaluate-function(Excel文件包含Apache POI不支持的公式)
我可以从文件中删除缓存的结果(更新后),但我无法使用新的缓存结果保存新文件。 为此,我需要在GUI模式下打开Excel。但我不想打开Excel表并重新计算。
任何人都可以指导在不打开Excel的情况下获得解决方案而不使用FormulaEvaluator我将获得新计算的单元格值?
谢谢和问候
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class POITestRB {
static String excelFileOrig = "C:/Test/1.xlsm";
static String excelFileNew = "C:/Test/excelFileNew.xlsm";
static FileInputStream fis;
static XSSFWorkbook workbook;
public static void main(String[] args) throws IOException {
fis = new FileInputStream(excelFileOrig);
workbook = new XSSFWorkbook(fis);
gettingCellContents(workbook, "D5");
updateCell(workbook, 10.0);
fis.close();
workbook.close();
fis = new FileInputStream(excelFileNew);
workbook = new XSSFWorkbook(fis);
gettingCellContents(workbook, "D5");
fis.close();
workbook.close();
}
public static void updateCell(XSSFWorkbook workbook, Double newData) {
try {
XSSFSheet sheet = workbook.getSheetAt(1);
CellReference ref = new CellReference("C8");
int row = ref.getRow();
int col = ref.getCol();
Cell cell = sheet.getRow(row).getCell(col);
if (cell != null) {
cell.setCellValue(newData);
}
workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();
workbook.setForceFormulaRecalculation(true);
cleenCach(workbook);
OutputStream os = new FileOutputStream(excelFileNew);
workbook.write(os);
os.flush();
os.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void cleenCach(XSSFWorkbook workbook) {
for (Sheet sheet : workbook) {
for (Row r : sheet) {
for (Cell c : r) {
if (c.getCellTypeEnum() == CellType.FORMULA) {
String temp = c.getCellFormula();
c.setCellType(CellType.STRING);
c.setCellType(CellType.FORMULA);
c.setCellFormula(temp);
}
}
}
}
}
private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {
workbook.setForceFormulaRecalculation(true);
XSSFSheet sheet = workbook.getSheetAt(1);
CellReference ref = new CellReference(cellId);
int row = ref.getRow();
int col = ref.getCol();
Cell cell = sheet.getRow(row).getCell(col);
switch (cell.getCellTypeEnum()) {
case STRING:
System.out.println(cell.getRichStringCellValue().getString());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case FORMULA:
System.out.println("Formula is: " + cell.getCellFormula());
System.out.println("cell.getCachedFormulaResultType(): " + cell.getCachedFormulaResultType());
switch(cell.getCachedFormulaResultType()) {
case Cell.CELL_TYPE_NUMERIC:
System.out.println("0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
System.out.println("4. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
break;
case Cell.CELL_TYPE_ERROR:
System.out.println("5. case Cell.CELL_TYPE_ERROR --> ");
break;
}
break;
case BLANK:
System.out.println();
break;
default:
System.out.println("default");
}
}
}
程序输出:
Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 6.0
Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 0.0
请参阅Excel文件: Link