java解析获取Excel中的数据--同时兼容2003及2007
首先大家先了解一下以下內容:引用 http://feitian0127.iteye.com/blog/1152524
java解析Excel(兼容2003及2007)
剛開始從網上找了個例子使用new HSSFWorkbook(new FileInputStream(excelFile))來讀取Workbook,
對Excel2003以前(包括2003)的版本沒有問題,但讀取Excel2007時發生如下異常:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
??????? 該錯誤意思是說,文件中的數據是用Office2007+XML保存的,而現在卻調用OLE2 Office文檔處理,應該使用POI不同的部分來處理這些數據,比如使用XSSF來代替HSSF。
??????? 于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)來讀取Workbook,對Excel2007沒有問題了,可是在讀取Excel2003以前(包括2003)的版本時卻發生了如下新異常:
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
??????? 該錯誤是說,操作無效,不能打開指定的xls文件。
??????? 到網上查了下,原來是XSSF不能讀取Excel2003以前(包括2003)的版本,這樣的話,就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對應調用HSSF或XSSF來讀取。
??????? 這種做法比較麻煩,看了下API,發現XSSF和HSSF雖然在不同的包里,但卻引用了同一接口Workbook,于是想到了這樣的讀取方法:
??????? Workbook book = null;
??????? try {
??????????? book = new XSSFWorkbook(excelFile);
??????? } catch (Exception ex) {
??????????? book = new HSSFWorkbook(new FileInputStream(excelFile));
??????? }
???????
本認為程序應該沒錯了吧,但一運行還是報錯(當時用得是poi3.6的zip包):
java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
網上搜了下,是少poi-ooxml-schemas-xxx.jar包,根據提示在Apache網站上(http://labs.renren.com/apache-mirror//poi/release/bin/)下載了3.7的zip文件(poi-bin-3.7-20101029.zip),解壓后將poi相關的包和xml相關的包都放上去。
在各版本的Excel中測試,沒有發生異常,問題解決。
下面是POI的API網址,不過是英文的:
POI API Documentation
http://poi.apache.org/apidocs/index.html
?
轉入正題:以下是代碼,代碼也是從別人的代碼拿過來的,其中修改了部分
package com.execl;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;/*** * @描述:測試excel讀取* * 導入的jar包* * poi-3.8-beta3-20110606.jar* * poi-ooxml-3.8-beta3-20110606.jar* * poi-examples-3.8-beta3-20110606.jar* * poi-excelant-3.8-beta3-20110606.jar* * poi-ooxml-schemas-3.8-beta3-20110606.jar* * poi-scratchpad-3.8-beta3-20110606.jar* * xmlbeans-2.3.0.jar* * dom4j-1.6.1.jar* * jar包官網下載地址:http://poi.apache.org/download.html* * 下載poi-bin-3.8-beta3-20110606.zipp* * @作者:建寧* * @時間:2012-08-29 下午16:27:15*/public class ImportExecl {/** 總行數 */private int totalRows = 0;/** 總列數 */private int totalCells = 0;/** 錯誤信息 */private String errorInfo;/** 構造方法 */public ImportExecl(){}/*** * @描述:得到總行數* * @作者:建寧* * @時間:2012-08-29 下午16:27:15* * @參數:@return* * @返回值:int*/public int getTotalRows(){return totalRows;}/*** * @描述:得到總列數* * @作者:建寧* * @時間:2012-08-29 下午16:27:15* * @參數:@return* * @返回值:int*/public int getTotalCells(){return totalCells;}/*** * @描述:得到錯誤信息* * @作者:建寧* * @時間:2012-08-29 下午16:27:15* * @參數:@return* * @返回值:String*/public String getErrorInfo(){return errorInfo;}/*** * @描述:驗證excel文件* * @作者:建寧* * @時間:2012-08-29 下午16:27:15* * @參數:@param filePath 文件完整路徑* * @參數:@return* * @返回值:boolean*/public boolean validateExcel(String filePath){/** 檢查文件名是否為空或者是否是Excel格式的文件 */if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath))){errorInfo = "文件名不是excel格式";return false;}/** 檢查文件是否存在 */File file = new File(filePath);if (file == null || !file.exists()){errorInfo = "文件不存在";return false;}return true;}/*** * @描述:根據文件名讀取excel文件* * @作者:建寧* * @時間:2012-08-29 下午16:27:15* * @參數:@param filePath 文件完整路徑* * @參數:@return* * @返回值:List*/public List<List<String>> read(String filePath){List<List<String>> dataLst = new ArrayList<List<String>>();InputStream is = null;try{/** 驗證文件是否合法 */if (!validateExcel(filePath)){System.out.println(errorInfo);return null;}/** 判斷文件的類型,是2003還是2007 */boolean isExcel2003 = true;if (WDWUtil.isExcel2007(filePath)){isExcel2003 = false;}/** 調用本類提供的根據流讀取的方法 */File file = new File(filePath);is = new FileInputStream(file);dataLst = read(is, isExcel2003);is.close();}catch (Exception ex){ex.printStackTrace();}finally{if (is != null){try{is.close();}catch (IOException e){is = null;e.printStackTrace();}}}/** 返回最后讀取的結果 */return dataLst;}/*** * @描述:根據流讀取Excel文件* * @作者:建寧* * @時間:2012-08-29 下午16:40:15* * @參數:@param inputStream* * @參數:@param isExcel2003* * @參數:@return* * @返回值:List*/public List<List<String>> read(InputStream inputStream, boolean isExcel2003){List<List<String>> dataLst = null;try{/** 根據版本選擇創建Workbook的方式 */Workbook wb = null;if (isExcel2003){wb = new HSSFWorkbook(inputStream);}else{wb = new XSSFWorkbook(inputStream);}dataLst = read(wb);}catch (IOException e){e.printStackTrace();}return dataLst;}/*** * @描述:讀取數據* * @作者:建寧* * @時間:2012-08-29 下午16:50:15* * @參數:@param Workbook* * @參數:@return* * @返回值:List<List<String>>*/private List<List<String>> read(Workbook wb){List<List<String>> dataLst = new ArrayList<List<String>>();/** 得到第一個shell */Sheet sheet = wb.getSheetAt(0);/** 得到Excel的行數 */this.totalRows = sheet.getPhysicalNumberOfRows();/** 得到Excel的列數 */if (this.totalRows >= 1 && sheet.getRow(0) != null){this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();}/** 循環Excel的行 */for (int r = 0; r < this.totalRows; r++){Row row = sheet.getRow(r);if (row == null){continue;}List<String> rowLst = new ArrayList<String>();/** 循環Excel的列 */for (int c = 0; c < this.getTotalCells(); c++){Cell cell = row.getCell(c);String cellValue = "";if (null != cell){// 以下是判斷數據的類型switch (cell.getCellType()){case HSSFCell.CELL_TYPE_NUMERIC: // 數字cellValue = cell.getNumericCellValue() + "";break;case HSSFCell.CELL_TYPE_STRING: // 字符串cellValue = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN: // BooleancellValue = cell.getBooleanCellValue() + "";break;case HSSFCell.CELL_TYPE_FORMULA: // 公式cellValue = cell.getCellFormula() + "";break;case HSSFCell.CELL_TYPE_BLANK: // 空值cellValue = "";break;case HSSFCell.CELL_TYPE_ERROR: // 故障cellValue = "非法字符";break;default:cellValue = "未知類型";break;}}rowLst.add(cellValue);}/** 保存第r行的第c列 */dataLst.add(rowLst);}return dataLst;}/*** * @描述:main測試方法* * @作者:建寧* * @時間:2012-08-29 下午17:12:15* * @參數:@param args* * @參數:@throws Exception* * @返回值:void*/public static void main(String[] args) throws Exception{ImportExecl poi = new ImportExecl();// List<List<String>> list = poi.read("d:/aaa.xls");List<List<String>> list = poi.read("c:/book.xlsx");if (list != null){for (int i = 0; i < list.size(); i++){System.out.print("第" + (i) + "行");List<String> cellList = list.get(i);for (int j = 0; j < cellList.size(); j++){// System.out.print(" 第" + (j + 1) + "列值:");System.out.print(" " + cellList.get(j));}System.out.println();}}}}/*** * @描述:工具類* * @作者:建寧* * @時間:2012-08-29 下午16:30:40*/class WDWUtil {/*** * @描述:是否是2003的excel,返回true是2003* * @作者:建寧* * @時間:2012-08-29 下午16:29:11* * @參數:@param filePath 文件完整路徑* * @參數:@return* * @返回值:boolean*/public static boolean isExcel2003(String filePath){return filePath.matches("^.+\\.(?i)(xls)$");}/*** * @描述:是否是2007的excel,返回true是2007* * @作者:建寧* * @時間:2012-08-29 下午16:28:20* * @參數:@param filePath 文件完整路徑* * @參數:@return* * @返回值:boolean*/public static boolean isExcel2007(String filePath){return filePath.matches("^.+\\.(?i)(xlsx)$");}}?
?
?
?
算吧! 我把我的源碼也放上—— 哈哈
?
??????????? http://download.csdn.net/detail/mmm333zzz/4560058
?
總結
以上是生活随笔為你收集整理的java解析获取Excel中的数据--同时兼容2003及2007的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 预装win8/win8.1改win7(w
- 下一篇: 对折纸张厚度超过珠峰