POI刷新数据后的函数(公式)更新问题
来源:互联网 发布:大势至usb端口 编辑:程序博客网 时间:2024/04/25 22:05
使用POI将Excel模板中的数据进行更新,这应该是很常见的操作
下面就贴上一小段简单的示例代码来稍作演示
public class ModifyExcel { /** * @param fileName Excel报表路径 * @param sheetName Excel中需要修改的sheet名 * @param modify_from 从哪一个坐标点开始刷新数据 * @param crs 从Oracle中读取出来的缓存数据集 * @throws Exception */ public void doModify(String fileName,String sheetName,int[] modify_from,CachedRowSet crs) throws Exception{ Workbook wb=WorkbookFactory.create(new FileInputStream(fileName)); Sheet sheet=wb.getSheet(sheetName); int i=0; while(crs.next()){ if(sheet.getRow(i+modify_from[0])==null) sheet.createRow(i+modify_from[0]); for(int j=0;j<crs.getMetaData().getColumnCount();j++){ Cell cell=sheet.getRow(i+modify_from[0]).getCell(j+modify_from[1]); if(cell==null) cell=sheet.getRow(i+modify_from[0]).createCell(j+modify_from[1]); String content=crs.getString(j+1); try{ cell.setCellValue(Double.parseDouble(content)); }catch(Exception e){ cell.setCellValue(content); } } i++; } FileOutputStream fout = new FileOutputStream(fileName); wb.write(fout); fout.flush(); fout.close(); wb.close(); }}
这一段代码是使用POI将从数据库中取到的结果集更新到报表中的一个隐藏sheet中去
然而遇到一个问题
隐藏的sheet作为数据源,为多个非隐藏的报表sheet提供基础数据,也就是说Excel中还有很多sheet是要调用这个隐藏sheet中的数据的
使用POI将数据源的sheet更新后,你的Excel模板并没有触发任何的数据修改事件,因为你本身并没有打开WPS或者Office
所以报表sheet中那些代入,那些引用,那些函数和公式,全部都不会有更新
除非你在 wb.write(fout); 之前加上一句
wb.setForceFormulaRecalculation(true);
强制整个Excel在你打开WPS或者Office的一瞬间,重新计算更新一下函数公式
接着又会碰到另一个问题
如果我不打开WPS或者Office,一直不打开,那在单纯的Excel文件里,那些报表的函数公式会更新吗?
答案是否定的
想做个这个测试很简单,先在隐藏sheet中修改数据源,然后不打开WPS或者Office
再一次使用POI去读这个文件,将读到的公式数据输出,你会发现他们还是原来的值,并没有因为数据源的变化而重新计算
经过博主的不断研究,终于发现如果要在不打开WPS或者Office的情况下,更新完数据源后强制所有sheet中的公式重新计算
需要对指定的Cell进行如下操作:
wb.getCreationHelper().createFormulaEvaluator().evaluateFormulaCell(cell);
博主最终将这行代码添加在读取公式单元格的操作中,在读的时候强制计算新值
实现代码如下:
String strCell = "";switch (cells[i][j].getCell().getCellType()) {case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cells[i][j].getCell().getNumericCellValue()); break;case HSSFCell.CELL_TYPE_STRING: strCell = cells[i][j].getCell().getStringCellValue(); break;case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cells[i][j].getCell().getBooleanCellValue()); break;case HSSFCell.CELL_TYPE_FORMULA: //刚写入的数据无法及时更新,需要人为打开WPS或者Office才能更新 //使用evaluateFormulaCell对函数单元格进行强行更新计算 wb.getCreationHelper().createFormulaEvaluator().evaluateFormulaCell(cells[i][j].getCell()); try { strCell = String.valueOf(cells[i][j].getCell().getNumericCellValue()); } catch (IllegalStateException e) { strCell = String.valueOf(cells[i][j].getCell().getRichStringCellValue()); } break;default: strCell = "";}
- POI刷新数据后的函数(公式)更新问题
- Poi处理Excel时公式不能更新的问题
- Poi处理Excel时公式不能更新的问题
- POI使用公式的问题,POI对excel函数的支持
- Recyclerview刷新延迟的问题(刷新两次才更新数据)
- js更新dom后的强制刷新问题
- 提交更新数据后刷新本页
- ajax异步问题导致的刷新页面数据不更新
- arcims不能刷新更新数据问题
- 适配器更新后刷新屏幕的方法
- POI生成EXCEL,公式不自动执行的问题
- 关于EF4.1更新数据后的显示问题-----PagedList
- theano:更新后函数名的更换,问题积累
- Contentprovider,CursorAdapter更新数据后自动刷新ListView
- 小结:POI写Excel公式(函数)及从Excel中读取公式计算值
- 使用了过滤条件的 ArrayAdapter,向源数据添加或删除数据后刷新时,界面不会同步更新
- 使用了过滤条件的 ArrayAdapter,向源数据添加或删除数据后刷新时,界面不会同步更新
- POI对公式的支持
- 启动Service并用Intent传递数据
- [游戏技术]求生之路服务器指令
- 自定义和扩展WordPress搜索功能
- C++中的IO类(iostream, fstream, stringstream)小结
- Android 学习笔记之界面布局
- POI刷新数据后的函数(公式)更新问题
- IOS开发UI篇--使用UICollectionView实现一个无限轮播的案例
- Windows Python 27 64 位配置LibSvm接口
- [BAT]批处理修改IP地址
- simpleXML
- JavaScript加载XML文件的两种方式
- 向 Web 开发人员推荐35款 JavaScript 图形图表库
- SGU 261
- error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.