日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

采用APACHE POI操作EXCEL文件--计算式调用另一文件

發布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 采用APACHE POI操作EXCEL文件--计算式调用另一文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.sina.com.cn/s/blog_6151984a0100sczi.html

  • 測試環境:

當前EXCEL文件: workbook.xls

假設一個CELL的計算式如下:

?='C:\testFB\[workbook1.xls]Test2'!B2+'C:\testFB\[workbook1.xls]測試1'!C3

?

?

  • 調用步驟:

1.不僅要打開當前EXCEL文檔(本例是workbook.xls),也要打開所有計算式FORMULA引用的EXCEL文檔(workbook1.xls)

不僅要為當前EXCEL文檔建立HSSFFormulaEvaluator對象,也要為所有計算式FORMULA引用的EXCEL文檔建立HSSFFormulaEvaluator對象

? String ROOT = "d:\\testFB\\";

? String[] files = {"workbook.xls","workbook1.xls"};

?

??HSSFWorkbook[] wbs = new HSSFWorkbook[files.length];
??HSSFFormulaEvaluator[] evaluators =new HSSFFormulaEvaluator[files.length];
?

??FileInputStream fileIn = null;
??FileOutputStream fileOut = null;???????
??for(int i=0;i<files.length;i++){
?????fileIn = new FileInputStream(files[i]);
?????POIFSFileSystem fs = new POIFSFileSystem(fileIn);
?????wbs[i] = new HSSFWorkbook(fs);
?????evaluators[i] = new HSSFFormulaEvaluator(wbs[i]);
??}

?

?

2. 設置Evaluator對象環境

HSSFFormulaEvaluator.setupEnvironment(files, evaluators); ?

?

3. 對計算式進行Evalutor計算

?

??for(int i=0;i<wbs[0].getNumberOfSheets();i++){
??????? sheet1 = wbs[0].getSheetAt(i);
????????for (Cell cell : row) {
????????????switch(cell.getCellType()) {
??????????????? case Cell.CELL_TYPE_STRING:
????????????????? System.out.println("CELL_TYPE_STRING |"+cell.getRichStringCellValue().getString());
????????????????? break;
??????????????? case Cell.CELL_TYPE_NUMERIC:
????????????????? if(DateUtil.isCellDateFormatted(cell)) {
??????????????????? System.out.println("CELL_TYPE_NUMERIC |"+cell.getDateCellValue());
????????????????? } else {
??????????????????? System.out.println("CELL_TYPE_NUMERIC |"+cell.getNumericCellValue());
????????????????? }
????????????????? break;
??????????????? case Cell.CELL_TYPE_BOOLEAN:
????????????????? System.out.println("CELL_TYPE_BOOLEAN |"+cell.getBooleanCellValue());
????????????????? break;
??????????????? case Cell.CELL_TYPE_FORMULA:

????????????????? System.out.print("Cell.CELL_TYPE_FORMULA |"+cell.getCellFormula()+"|");??
??????????????????CellValue cellValue = evaluators[0].evaluate(cell);
??????????????????// 或者evaluators[0].evaluateFormulaCell(cell);
????????????????? switch (cellValue.getCellType()) {
?????????????????? case Cell.CELL_TYPE_BOOLEAN:
?????????????????????? System.out.println(cellValue.getBooleanValue());
?????????????????????? break;
?????????????????? case Cell.CELL_TYPE_NUMERIC:
?????????????????????? System.out.println(cellValue.getNumberValue());
?????????????????????? break;
?????????????????? case Cell.CELL_TYPE_STRING:
?????????????????????? System.out.println(cellValue.getStringValue());
?????????????????????? break;
?????????????????? case Cell.CELL_TYPE_BLANK:
?????????????????????? break;
?????????????????? case Cell.CELL_TYPE_ERROR:
?????????????????????? break;
???
?????????????????? // CELL_TYPE_FORMULA will never happen
?????????????????? case Cell.CELL_TYPE_FORMULA:
?????????????????????? break;
?????????????????? }// end of switch

????????????????? break;
??????????????? default:
????????????????? System.out.println();
????????? ??}// end of switch
???????}
????? ?
????? }?

?

?

  • ?原理

    ?


  • 所以問題的關鍵是:

從CELL的FORMULA計算式獲得何種格式的文件名,而POI系統會以該格式的文件名從 Formula Evaluator Environment獲取對應的Evaluator

?

?

現在存在的問題是,EXCEL CELL的計算式與POI 解析出的計算式是不同的

現象1:

當前文件和計算式調用文件在同一路徑下時,POI是忽略路徑的

?EXCEL文件?POI解析出的FORMULA
?='C:\testFB\[workbook1.xls]Test2'!B2+'C:\testFB\[workbook1.xls]測試1'!C3?'[workbook1.xls]Test2'!B2+'[workbook1.xls]測試1'!C3

現象2:

當前文件和計算式調用文件不在同一路徑下時,POI會獲取路徑,但路徑顯示方式比較特殊

POI沒解析出'C:'

POI沒解析出'\'或'/',而代之以ASCII碼2()和3()

EXCEL文件?POI解析出的FORMULA
?='C:\testFB1\[workbook1.xls]Test2'!B2+'C:\testFB1\[workbook1.xls]測試1'!C3'[testFB1workbook1.xls]Test2'!B2+'[testFB1workbook1.xls]測試1'!C3

?由于新浪博客有些特殊字符不能顯示,下面附上截圖.

?

現象1的解決辦法:

因為POI解析出的文件名是不含路徑的,根據原理,那么在Formula Evaluator Environment中的文件名必須與之匹配,不含路徑

String[] files = {"workbook.xls","workbook1.xls"};

...

HSSFFormulaEvaluator.setupEnvironment(files, evaluators);???

?

現象2的解決辦法:

因為POI解析出的文件名包含路徑,但不包含驅動器名,且路徑斜杠變成ASCII碼2和3

根據原理,那么在Formula Evaluator Environment中的文件名必須與之匹配,所以最好先通過cell.getCellFormula()獲知POI解析出FORMULA,然后把文件名設置入Environment.

例我們System.out.println(cell.getCellFormula())得到如下:

'[testFB1workbook1.xls]Test2'!B2+'[testFB1workbook1.xls]測試1'!C3?

則我們需要設置Environment如下:

String[] filePaths = {"[testFBworkbook.xls","[testFB1workbook1.xls"};

...

HSSFFormulaEvaluator.setupEnvironment(filePaths,evaluators); ?

而且我們要把文件存在C:盤下,不要存在其他盤下

?

?由于新浪博客有些特殊字符不能顯示,下面附上截圖.



?

?

?

總結

以上是生活随笔為你收集整理的采用APACHE POI操作EXCEL文件--计算式调用另一文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。