java生成的excel文件怎么读取公式计算的值???

不戒的信仰 2010-05-20 10:42:13
我的服务器是linux ,数据库Oracle

做了一个报表系统,具体步骤是:
1.定制一个excel模板(模板里有很多公式),上传到服务器。
2.统计分析数据插入到模板excel存放到服务器目录中。
3.读取excel文件,显示成网页(html)。

我用的主件是jxl,生成的excel是excel2000版本的,上面1和2步都正常,到第3步就出问题了,我统计分析写到excel的数据能正常读取出来,但通过公式计算的值就没办法显示出来。我打开生成的excel查看的时候又发现有值的,但后来查资料发现excel在处于保存状态的时候公式计算的值是不会计算的,只有在我们手动打开的时候公式才会去计算。

因为我本机装的是office2003 ,所以打开再关闭的时候会弹出提示 要求版本升级并且重新计算公式,如果选择“是”,再用程序读这个文件就没有问题可以读出公式计算的值了,如果选择“否”,用程序还是读不出公式计算的值哦。

因此我在想是否可以通过以下几种方案解决:

方案1:直接生成excel2003, 问题1是用什么主件,用poi?还是jxl?还是其他的?问题2是excel2003在保存状态下公式计算的值是否已被计算出来了。

方案2:在服务器上用程序把生成的excel2000升级到2003。问题是用什么方法可以实现这个功能。

方案3:用SOAOFFICE - 微软 OFFICE 中间件 来实现(这个没用过,如果建议我用这种方案的朋友请给出相关的参考资料)



别给 我说把excel的公式读出来转成java来计算好了再把值插入到excel,如果这样做就失去了利用excel公式强大功能的意义的。


大家有遇到过此类问题的都给小弟一点建议哦,最好说说解决方案,

请加我QQ 842656 我们好好探讨一下,小弟在此先谢过了。





补充一下:


我用的jxl的版本为2.6
我建一个excel文档,存放为 d:\Book1.xls
并在Book1.xls中设置值:
A1=100
B1=200
C1=SUM(A1:A2)

根据公式进行计算的话,C1的值应为300

但是我根据d:\Book1.xls生成了一个相同的Book2.xls以后,值也正常写入Book2.xls但是当取得Book2.xls中C1的值的时候,取出来的为0,没有得到公式的结果。

当我手工打开Book2.xls以后,不做任何修改Excel会提示:是否保存你对“Book2.xls”所做的更改?
Microsoft Excel打开由早期版本 Excel最后保存的文件时会自动重算所有公式。

进行保存,再次运行程序,C1计算后的值就以正常取得了。

运行结果如下:
//第一次生成excel情况
Sheet1
Formula in C1 value: 0.00 formula: SUM(A1:B1)
//第二次保存excel情况
Sheet1
Formula in C1 value: 300.00 formula: SUM(A1:B1)

如何让其第一次就可以取得值,不用人工进行干预就可以进行完成.我主要是想利用excel的公式来完成一些表格的计算.然后保存计算结果.

...全文
2048 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LG.BRYANT 2021-07-08
  • 打赏
  • 举报
回复 3

大哥,十年过去了,这个有解决方案了吗?

yangkunlisi 2012-01-08
  • 打赏
  • 举报
回复
解决了,请问是怎么解决的?我现在就遇到这样的问题了。
请告诉下小弟。
chenjun1634 2011-10-31
  • 打赏
  • 举报
回复
try
{
String path = "D:/A.xls";
HSSFWorkbook hssfworkbook = new HSSFWorkbook(new FileInputStream(path));
HSSFSheet sheet = hssfworkbook.getSheetAt(0);
int rows = sheet.getLastRowNum(); // 获取Excel行数
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, hssfworkbook);
HSSFRow row = sheet.getRow(0); // 第0行
// 设置单元格所在行,但是最新官方资料描述
// setCurrentRow:Deprecated. (Aug 2008) - not needed, since the current row can be derived from the cell
evaluator.setCurrentRow(row);
HSSFCell hssfCellValue = row.getCell((short) 1); // 第一列

switch (hssfCellValue.getCellType())
{
case HSSFCell.CELL_TYPE_BOOLEAN:
System.out.println(hssfCellValue.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_NUMERIC:
System.out.println(hssfCellValue.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
System.out.println(hssfCellValue.getStringCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
break;

case HSSFCell.CELL_TYPE_FORMULA:
HSSFFormulaEvaluator.CellValue tempCellValue = evaluator.evaluate(hssfCellValue);
double iCellValue = tempCellValue.getNumberValue();
break;
}
}
catch (Exception e)
{
e.printStackTrace();
}
jastby 2010-10-23
  • 打赏
  • 举报
回复
不知道你用的jxl的版本是什么,我也遇到过,已经解决了,升级jxl到新版本就支持读取公式计算值了。

如果还找不到,周一回公司我看看我的代码。
  • 打赏
  • 举报
回复
这个真不知道 学习 等待中
不戒的信仰 2010-10-13
  • 打赏
  • 举报
回复
fffffffffff

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧