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: // Boolean
- cellValue = 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)$");
- }
- }
相关推荐
JAVA用POI读取和创建2003和2007版本Excel完美示例 同时还有相关的类包 注意工程里面别存在冲突类包
ava解析Excel(兼容2003及2007):解析2003及以下使用HSSFWorkbook类, 解析2007及以上使用XSSFWorkbook, 如果解析类与excel版本不对应,抛出相应的异常,例如HSSFWorkbook解析2007: org.apache.poi.poifs....
Excel Parser提供了一个功能,可以轻松地从Spring引导应用程序中提取Excel数据。 使用Apache POI库对API进行了抽象,并且通过使用Excel Parser,用户可以专注于编写业务逻辑。 同时支持DOM类型XSSFWorkBook和SAX...
实例18 实现Java中的JTable与Excel之间的数据交换 实例23 Linux下Java程序的编译与调试 实例27 利用JNI实现企业Java程序与传统应用程序的集成 实例35 Java Servlet驱动SQLServer中的数据库 实例37 Java对象...
java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...
基于poi实现word/excel转换为HTML(且兼容.doc.docx.xls.xlsx) 对于简单的word Excel 转换 足够。excel转换时存在火狐浏览器不兼容乱码问题,希望多多交流。
主要介绍了java 中 poi解析Excel文件版本问题解决办法的相关资料,需要的朋友可以参考下
对Excel '97(-2003)(BIFF8)文件格式的读写支持。 BIFF(二进制交换文件格式)的低级结构。 复合文档文件格式(也称为“ OLE2存储文件格式”或“ Microsoft-Office兼容存储文件格式”)的低级结构。 用于创建,...
全面取消静态编译中的人为功能限制(此前有最多5个支持库同时参与静态链接等功能限制) 6. 公开易语言静态编译技术文档(参见sdk\static_docs),便于第三方支持库作者针对静态编译进行支持库改造 7. 修改以下多...
针对于excel生成和读取所要使用的jar包。。。。。。。。。。。。。。。。。。。。。。。。。。。。
JSON 具有易于人阅读和编写,同时也易于机器解析和生成的特点。 动态交互性 Highstock 支持丰富交互性,在图表创建完毕后,可以用丰富的 API 进行添加、移除或修改数据列、数据点、坐标轴等操作。 结合 jQuery 的 ...
JSON 具有易于人阅读和编写,同时也易于机器解析和生成的特点。 动态交互性 Highstock 支持丰富交互性,在图表创建完毕后,可以用丰富的 API 进行添加、移除或修改数据列、数据点、坐标轴等操作。 结合 jQuery 的 ...
JSON 具有易于人阅读和编写,同时也易于机器解析和生成的特点。 动态交互性 Highcharts 支持丰富交互性,在图表创建完毕后,可以用丰富的 API 进行添加、移除或修改数据列、数据点、坐标轴等操作。 结合 jQuery 的 ...
如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法...
excelPOI都有一个严重的问题,就是非常消耗内存,特别处理数据量多时,速度慢并且时有异常发生,所以改用由阿里研发的easyExcel更可靠一些,它的官方建议对于1000行以内的采用原来poi的写法一次读写,但于1000行以上...
针对大型及分散完成的工程,Passolo 提供有特殊的版本,可以让用户非常容易地与外部翻译人员进行数据交换。由于有免费的译员版可供使用,因此软件的授权费用得到了降低,同时还简化了与译员之间的工作流程。 Passolo...
支持多种匹配方式(全匹配/模糊查询/包含查询/不匹配查询)技术点十一:移动平台支持,对Bootstrap(兼容Html5)进行标准封装技术点十二:动态报表功能(用户输入一个sql,系统自动解析生成报表)技术点十三:数据权限...
投资组合经理 使用AlphaVantage API的投资组合管理应用程序的Android原型。 图书馆: 安卓 支持库-兼容性 HelloCharts-图 排球-网络 ...XLRD-Excel文件解析器 AlphaVantage-Web API的Python包装器