更新的excel文件仍返回旧值

时间:2014-06-13 08:01:22

标签: java excel jxl

我的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);

    }
}
  • 在excelWriting()方法中,num1表示“A”等于1
  • 在excelWriting()方法中,num2表示“B”等于2
  • 在main()方法中,sheet1.getCell(4,2)是“Y”,等于3

1 个答案:

答案 0 :(得分:0)

我不太了解jxl库,我无法运行您的示例(我应该为Number使用哪种导入?),但是:

Excel文件格式不仅存储公式,还存储文件中的计算结果。因此,当您更改值A和B时,您需要重新评估公式,以便存储新结果。最有可能的是,公式不会重新评估,仍会返回旧值。

查看jxl API,有一个命令setRecalculateFormulasBeforeSave()在正确的位置使用时可能会有所帮助(可能在copy.write()之前:

tempSheet.getSettings().setRecalculateFormulasBeforeSave(true);

可悲的是,我无法自己尝试,因为我无法让你的例子运行,但它可能值得一试。

<强>更新 好的,终于让你的榜样有效了。我的上述方法没有帮助。 我的解释:如上所述,Excel文件格式确实将公式结果存储在文件中。更改单元格值需要重新评估公式。这种重新评估/重新计算仅由Excel本身完成,而不是由JXL完成。 更多地考虑这一点,这是有道理的:如果JXL需要重新计算值,它必须支持Excel本身支持的所有公式,包括所有复杂的统计和财务公式,这可能只是太多了。所以JXL所能做的就是改变单元格的值,但实际计算却无法做到。因此,除了在Excel中打开创建的文件并重新保存之外,似乎没有其他方法可以更新公式结果。