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)$");
- }
- }
相关推荐
本篇将深入探讨如何使用POI库来解析和创建2003及2007版本的Excel文件,并提供相关实例和类包。 Apache POI提供了两个主要的API,HSSF(Horrible Spreadsheet Format)用于处理老版的BIFF8格式(.xls,Excel 2003及...
Excel文件格式有两种主要版本,即2003年的.xls格式和2007年及以后的.xlsx格式。为了兼容这两种格式,Java引入了Apache POI库,这是一个用于处理Microsoft Office文档的开源API。 Apache POI提供了HSSF(Horrible ...
Java读写Excel是一项常见的任务,尤其在数据处理和报表生成中。Xxl-Excel是一个流行的Java库,专门用于处理Excel文件,提供了简单易用的API,使得开发人员能够方便地进行Excel的读取和写入操作。在这个示例中,我们...
在本项目中,我们关注的是“java编写的兼容2003、2007Excel文件读取工程”。这个工程的目标是实现一个Java程序,能够读取Microsoft Excel的两种主要格式:.xls(用于2003及更早版本)和.xlsx(用于2007及更高版本)...
- **读取Excel文件**:使用Apache POI解析Excel文件,提取NURBS数据。 - **NURBS计算**:实现NURBS算法,包括控制点、权重、knot向量的处理,生成曲线或曲面。 - **数据结构**:设计合适的Java类来存储和操作NURBS...
在Java编程中,处理大量数据的Excel文件是一项常见的任务,特别是对于数据分析、数据导入或导出等场景。这里我们主要探讨如何使用Java有效地读取2003版和2007版这两种不同格式的大型Excel文件。 1. **Apache POI库*...
在Java开发中,如果需要操作Excel文件,开发者可以使用Apache POI、JExcelAPI等库,其中Apache POI提供了对不同版本Excel文件格式的支持,包括解决2003和2007版本的兼容问题。 具体到压缩包子文件的文件名称列表...
3. 解析Excel的注意事项: - 文件路径:在Java中,路径通常是文件系统的绝对路径;在Android中,可能是内部存储或外部存储的路径,或者从Assets或Raw资源中加载。 - 版本兼容:不同的Excel版本(如xls和xlsx)可能...
本文将深入探讨如何使用一个优秀的Java库来高效地实现Excel的导入和导出,尤其针对Excel 2003和2007格式的兼容性。 标题中的“好用的excel导入导出工具for Java”指的是Java开发中的一种专门处理Excel的库,它允许...
Apache POI 是一个开源项目,专门用于处理微软...以上是关于Apache POI-3.16在Java中解析Excel的基本介绍和使用要点,通过这个库,开发者可以轻松地在Java应用程序中与Excel文件进行交互,实现数据的导入、导出和处理。
附件是java poi 3.17的lib库及其依赖库,全部下载引用后,可以进行excel的读写操作,无需引用其他lib库。poi-3.17适用于jdk1.7。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft ...
ava解析Excel(兼容2003及2007):解析2003及以下使用HSSFWorkbook类, 解析2007及以上使用XSSFWorkbook, 如果解析类与excel版本不对应,抛出相应的异常,例如HSSFWorkbook解析2007: org.apache.poi.poifs....
JXL是一个Java API,专为处理Microsoft Excel文件设计,支持在任何Java兼容的操作系统上运行。以下是详细的解析: 1. **JXL库介绍** - JXL是一个开源的Java库,用于读写Excel文件。 - 官方主页:...
Java解析Excel是一项常见的任务,特别是在数据处理和报告生成的场景中。`poi.jar`库是Apache POI项目的一部分,这是一个开源的Java API,专门用于处理Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在Java...
在"Excel2html"中,开发者可能利用了POI库来解析Excel文件,获取每个单元格的内容、样式信息(如边框、颜色、字体、字号等),然后将这些信息转换为HTML标签和CSS样式,以重现Excel的视觉效果。 转换过程中,边框线...
本文将深入探讨如何使用Apache POI库来实现在Java中导出Excel 2007文件,同时也会涉及如何处理Excel 2003的.xls格式。 Apache POI是Apache软件基金会的一个项目,它提供了一组API,用于读写Microsoft Office格式的...
Java避免UTF-8的csv文件打开中文出现乱码的方法 在Java中,避免UTF-8的csv文件打开中文出现乱码的方法是非常重要的。...同时,需要考虑Excel版本的兼容性问题,以确保csv文件可以正确地被打开和读取。
10. **版本兼容性**: 需要考虑Excel文件的不同版本(如97-2003的`.xls`和2007及以后的`.xlsx`),因为这可能需要不同的ODBC驱动或Apache POI的API。 通过以上知识点,你可以构建一个Java类,它能够连接到ODBC数据源...