Java 更新的excel文件仍然返回旧值

Java 更新的excel文件仍然返回旧值,java,excel,jxl,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。我怎样才能使它给出正确的输出 i

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

    }
}
在Excel中,写入方法num1表示等于1的A 在excelWriting方法中,num2表示B等于2 在主方法sheet1.getCell4中,2是Y,等于3
我对jxl库不太了解,也无法让您的示例运行我应该为Number?使用什么导入,但是:

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

查看jxl API,有一个命令setRecreacteFormulasBeforeSave,如果在复制之前的正确位置使用,它可能会有所帮助。write:

遗憾的是,我无法亲自尝试,因为我无法运行您的示例,但这可能值得一试

更新: 好了,你的例子终于起作用了。我上面的方法没有帮助。 我的解释:如前所述,Excel文件格式在文件中存储公式结果。更改单元格值需要重新计算公式。此重新评估/重新计算仅由Excel本身完成,而不是由JXL完成。
仔细想想,这是有道理的:如果JXL需要重新计算值,它必须支持Excel本身支持的所有公式,包括所有复杂的统计和金融公式,这可能太多了。所以JXL所能做的就是改变单元格的值,但实际的计算却无法做到。因此,除了在Excel中打开创建的文件并重新保存外,似乎没有其他方法可以更新公式结果。

yor colArow2变量定义在哪里?@cy3er忘记更改该变量名称,现在它已修复。关于更新:是的,我也注意到了。但是我看不出如何以编程的方式实现它。您可能希望使用ApachePOI而不是JXL:。根据,它支持计算公式。谢谢,我试过了。不幸的是,我公司的一些库与POI存在某种冲突。
tempSheet.getSettings().setRecalculateFormulasBeforeSave(true);