gpt4 book ai didi

java - 如何使用 Java POI 从工作簿中删除所有公式

转载 作者:行者123 更新时间:2023-11-30 06:30:02 28 4
gpt4 key购买 nike

几年前有人问过同样的问题: how to remove all formulas from an excel sheet by java POI api? .

但是,当时没有收到对我有用的答案。我有一本包含几张大工作表的工作簿,想要循环所有单元格以用字符串替换单元格内容。问题是,许多单元格包含我必须首先删除的公式。 cell.setCellFormula(null)cell.setCellType(CellType.STRING) (也不是 BLANK)都不能令人满意,因为要删除的底层进程数组公式需要很长时间并且使整个工作太慢。

以下方法有效,但会留下损坏的 Excel 工作簿,该工作簿只能在第一次时通过修复步骤打开:方法 m = XSSFCell.class.getDeclaredMethod("setBlank");m.setAccessible(true);m.invoke(cell);是否有任何其他快速且更干净的方法来简单地将某些单元格设置为空白,而不管任何公式如何?

最佳答案

工作簿损坏的问题是/xl/calcChain.xml中存储了一个计算链。删除公式的正常慢速方法将更新此计算链。但是,正如您已经发现的那样,它们还尝试仅用于删除单个公式而不是全部。因此,他们在删除部分数组公式时必须小心,这会使它们变慢。

但如果确实要删除所有公式,则无需如此小心,只需删除整个/xl/calcChain.xml即可。

示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.model.CalculationChain;

import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.POIXMLDocumentPart;
import java.lang.reflect.Method;

class ExcelRemoveFormulasAndCalcChain {

private static void removeCalcChain(XSSFWorkbook workbook) throws Exception {
CalculationChain calcchain = workbook.getCalculationChain();
Method removeRelation = POIXMLDocumentPart.class.getDeclaredMethod("removeRelation", POIXMLDocumentPart.class);
removeRelation.setAccessible(true);
removeRelation.invoke(workbook, calcchain);
}

public static void main(String[] args) throws Exception {

XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("Test.xlsx"));

for (Sheet sheet : workbook) {
for (Row row : sheet) {
for (Cell cell : row) {
XSSFCell xssfcell = (XSSFCell)cell;
if (xssfcell.getCTCell().isSetF() && xssfcell.getCTCell().getF().getT() != STCellFormulaType.DATA_TABLE) {
xssfcell.getCTCell().unsetF();
}
}
}
}

removeCalcChain(workbook);

workbook.write(new FileOutputStream("Test_1.xlsx"));
workbook.close();

}
}

这应该删除所有公式,并让所有单元格恢复仅包含值和样式。

关于java - 如何使用 Java POI 从工作簿中删除所有公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46366389/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com