我的java代码是使用jxl库读取excel文件。它首先复制原始的excel文件以创建temp.xls。在创建该文件时,它会更改某些值,并成功创建带有公式的temp.xls。
原始档案:
A 1 Y 3 (has formula: A+B)
B 2
复制文件:
A 5 Y 13 (has formula: A+B)
B 8
但是,即使复制的文件发生变化,代码仍会将“3”作为输出而不是“13”。如何才能使其输出正确?
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.*;
import jxl.write.Number;
import jxl.write.biff.RowsExceededException;
public class Reader {
public static void excelWriting() {
try {
Workbook workbook = Workbook.getWorkbook(new File(
"D:\\parser\\calc.xls"));
WritableWorkbook copy = Workbook.createWorkbook(new File(
"D:\\parser\\temp.xls"), workbook);
WritableSheet tempSheet = copy.getSheet(0);
Number num1 = new Number(1, 2, 5);
Number num2 = new Number(1, 3, 8);
tempSheet.addCell(num1);
tempSheet.addCell(num2);
copy.write();
copy.setProtected(false);
copy.close();
workbook.close();
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
excelWriting();
int value = 0;
try {
Workbook wrk1 = Workbook.getWorkbook(new File(
"D:\\parser\\temp.xls"));
// Obtain the reference to the first sheet in the workbook
Sheet sheet1 = wrk1.getSheet(0);
Cell cell = sheet1.getCell(4, 2);
value = Integer.parseInt(cell.getContents());
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(value);
}
}
答案 0 :(得分:0)
我不太了解jxl库,我无法运行您的示例(我应该为Number
使用哪种导入?),但是:
Excel文件格式不仅存储公式,还存储文件中的计算结果。因此,当您更改值A和B时,您需要重新评估公式,以便存储新结果。最有可能的是,公式不会重新评估,仍会返回旧值。
查看jxl API,有一个命令setRecalculateFormulasBeforeSave()
在正确的位置使用时可能会有所帮助(可能在copy.write()
之前:
tempSheet.getSettings().setRecalculateFormulasBeforeSave(true);
可悲的是,我无法自己尝试,因为我无法让你的例子运行,但它可能值得一试。
<强>更新强> 好的,终于让你的榜样有效了。我的上述方法没有帮助。 我的解释:如上所述,Excel文件格式确实将公式结果存储在文件中。更改单元格值需要重新评估公式。这种重新评估/重新计算仅由Excel本身完成,而不是由JXL完成。 更多地考虑这一点,这是有道理的:如果JXL需要重新计算值,它必须支持Excel本身支持的所有公式,包括所有复杂的统计和财务公式,这可能只是太多了。所以JXL所能做的就是改变单元格的值,但实际计算却无法做到。因此,除了在Excel中打开创建的文件并重新保存之外,似乎没有其他方法可以更新公式结果。