1、需要导入的JAR问题:
必须要用的包:
poi-xxx.jar
poi-ooxml-xxx.jar
poi-ooxml-schemas-xxx.jar
xmlbeans-xxx.jar.jar
dom4j-1.6.1.jar
poi-scratchpad-xxx.jar
geronimo-stax-api_1.0_spec-1.0
可能用到的:
poi-examples-3.8.jar
poi-excelant-3.8.jar
还有那一大堆common的包。
我目前用的POI是3.8的。
必须用的是因为我的项目里面有引入,后面两个JAR在应用里面起不起作用我没有测试过,只是引入过。
可能用到的这些JAR因为在系统里面没有引用,但是网上有些说需要引入。
2、异常:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion
需要的包都引入之后可以解决很多乱七八糟的问题,但是也可能出现这个个异常:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion。
具体表现是这样子的:
我在一个try/catch/finally结构的try里面写:
XSSFWorkbook workbook = new XSSFWorkbook();
System.out.println("***************************");
执行new XSSFWorkbook()这句的时候,直接跳到finally里面去了,不执行System.out,也不进入catch,直接进入finally,但是控制台报异常:java.lang.IllegalStateException: Cannot reset buffer after response has been committed。这个异常很常见,无非就是各种stream的flush,close问题导致的,问题是我这还没有牵涉到流呢,怎么会有这个呢。瞎报错。网上查资料,折腾了好久,一直这样子,后来把catch里面的Exception改成了Throwable,再一执行,哈哈,果然进来了。报错:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion。网上查资料说这个异常是因为poi-ooxml-schemas-xxx.jar导致的,得换成ooxml-schemas-1.1.jar。ooxml-schemas-1.1.jar不知道去哪里下,百度找到的都得花钱买,MD。买了替换了问题解决啦。这个jar包我也上传了,有需要的可以下。
3、异常:
a、org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
b、org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: xxx
这两个异常基本都是版本没用对造成的,HXXF只能处理2003的,XSSF只能处理2007的,要是用错了就会报InvalidOperationException错。
4、Excel单元格数据类型的处理问题:
使用HSSF、XSSF读取Excel单元格里面的数据的时候,可能会因为数据格式报错,譬如Excel里面是数字类型的,代码用toString()一转,就报“数字不能转换成字符串”的错误啦,譬如时间类型的问题。这个在网上查了很多资料,根据碰到的问题,总结了一个比较全的:
private String parseExcel(Cell cell) { String result = new String(); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型 short format = cell.getCellStyle().getDataFormat(); SimpleDateFormat sdf = null; if(format == 14 || format == 31 || format == 57 || format == 58){ //日期 sdf = new SimpleDateFormat("yyyy-MM-dd"); }else if (format == 20 || format == 32) { //时间 sdf = new SimpleDateFormat("HH:mm"); } //若为数字,获取到的Value会自动添加一个0,变成xxx.0,这种格式的数据不能保存到数据类型为int的字段中 Double value = cell.getNumericCellValue(); if(sdf!=null){//需要进行格式化 Date date = HSSFDateUtil.getJavaDate(value); result = sdf.format(date); }else{//可能是数字 Long longVal = Math.round(value);//转换成long类型,此时没有小数点 // System.out.println(longVal+"\t"+Double.parseDouble(longVal + ".0")); if(Double.parseDouble(longVal + ".0") == value) result = longVal.toString(); else result = value.toString(); } break; case HSSFCell.CELL_TYPE_STRING:// String类型 result = cell.getRichStringCellValue().toString(); break; case HSSFCell.CELL_TYPE_BLANK: result = ""; default: result = ""; break; } return result; }
上面的代码主要参考了两个人的代码, 具体链接找不到了,找到了再补上,有谁知到的可以给我留个言。
上面的代码说了一个问题:通过Double value = cell.getNumericCellValue();获取到的Value会自动添加一个0,变成xxx.0,这种格式的数据不能保存到数据类型为int的字段中。因此下面加了处理的代码:
Long longVal = Math.round(value);//转换成long类型,此时没有小数点 //System.out.println(longVal+"\t"+Double.parseDouble(longVal + ".0")); if(Double.parseDouble(longVal + ".0") == value) result = longVal.toString(); else result = value.toString();
4、new FileOutputStrea处理文件问题:
可能这不是一个问题,但是对于像我这种对流不是很清楚的人来说,还真是一个问题。通过
FileOutputStream fout = new FileOutputStream(filePath);
是可以新建文件的。要是给定的文件不存在,它就会自动创建,要是存在就直接使用。这个情况是真的不知道,所以每次都傻傻的先手动新建一个。
5、Excel无法打开问题:
在用XSSF处理Excel数据时,使用FileOutputStream fout = new FileOutputStream(filePath);新建的Excel在写入数据之前是不能用Excel打开的。一打开会报错说格式不对或已经受损不能打开,具体原因这篇说的很清楚:http://blog.csdn.net/iaiti/article/details/45153627。开始的时候我还以为是我的Excel新建的有问题导致每次都“org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file”,后来手动建 了一个能使用的2007的Excel放那儿让XSSF去读,结果还是这错,最后用XSSF往这个Excel里面写入数据后打开就没有任何问题啦。这也说明Can't open the specified file这个异常不是Excel弄出来的,是XSSF。
应该没有其他问题了吧,再出现了再补吧(附件太大了,只能压缩再压缩了,莫怪莫怪!)。
相关推荐
C#的,winform的,这是我自己写的一个c#操作excel的例子,其中包括数据操作,字体,格式,单元格等操作,还有一个生成柱状图的方法,所有的方法都在ExcelHelper.cs类里,点击Form1窗体里的按钮可以看到各种操作的...
从标签"源码"来看,这个压缩包可能包含了示例代码,帮助开发者理解如何使用POI HSSF来操作Excel文件。"工具"标签可能意味着这些代码片段或类是实用的,可以作为开发过程中的辅助工具。 在给定的文件名称列表中: 1....
在传统的Web开发中,当用户需要导出数据到Excel时,通常会遇到一些挑战。例如,如果使用.NET框架,可以直接利用服务器端控件方便地生成Excel。但在J2EE环境下,为了保持代码的可移植性和稳定性,直接在服务器端生成...
以下是对使用Apache POI HSSF进行Excel读写操作的详细知识点: 1. **HSSF模型**:Apache POI使用了一种类似于Excel内部结构的模型来表示工作簿、工作表、行、单元格等元素。HSSFWorkbook代表一个工作簿,HSSFSheet...
然而,XSSF在处理大量数据时,由于整个工作簿都驻留在内存中,可能会导致内存溢出问题。 针对大数据量导出,Apache POI引入了SXSSF。SXSSF是内存优化的API,它使用滑动窗口模型,仅保留最近使用的行在内存中,其余...
在Java开发中,处理Excel数据是一项常见的任务,尤其是在数据导入导出、数据分析或者报表生成等场景。Apache POI是一个流行的库,它允许开发者使用Java来读取、写入和修改Microsoft Office格式的文件,包括Excel(....
本手册是POI操作Excel文件的快速入门指南,旨在帮助开发者快速掌握使用HSSF和XSSF进行Excel文件操作的基本方法。通过阅读和实践本手册中的内容,用户可以学会如何添加POI支持、创建新工作簿、创建新的sheet页、操作...
4. **公式与数据格式化**:对于XSSF,你可以编写Excel公式,而HSSF则支持一些基本的计算功能。此外,可以设置单元格的数据格式,如日期、货币、百分比等。 5. **保存和关闭**:完成操作后,使用`Workbook`对象的`...
使用HSSF 对Excel导入导出的纯Java操作 简介 工作中纯靠数据库软件生成的Excel报表有可能不会满足需求,时间工作中需要的数据结构往往是很复杂的,而且在大数据的情况下需要对数据的处理更加精细化,所以单纯的sql语句...
使用HSSF,你可以创建新的工作簿,添加工作表,插入数据,设置单元格样式,以及执行其他与Excel相关的操作。以下是一个简单的HSSF示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org....
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和.NET框架相关项目时。本主题聚焦于如何利用C#与Microsoft Office Interop库来创建Excel电子表格并自动生成图表。以下是对这个技术的详细解释:...
读取数据时,我们通常从单元格开始。`IRow`代表一行,`ICell`代表单元格。例如,获取第一行的第一个单元格的数据: ```csharp var row = sheet.GetRow(0); var cell = row.GetCell(0); var cellValue = cell....
3. **迭代读取行**:使用POI的XSSF或HSSF API,可以通过迭代行而不是一次性加载所有数据来读取Excel文件。每次只处理一行,处理完后释放资源,这样可以显著减少内存占用。 4. **延迟样式计算**:POI提供了延迟样式...
11. **性能优化**:对于大数据量的Excel操作,可以考虑使用内存流和缓冲区,避免一次性加载整个工作簿到内存,以提高性能。 总之,这个压缩包提供了使用C#和NPOI库处理Excel文件的实例,无论你是新手还是经验丰富的...
描述中提到的“将java数据转化为Excel表格”,意味着我们要利用HSSF API将程序运行过程中产生的Java数据结构转换成用户可以交互的Excel工作表。这在数据分析、报表生成、数据导出等场景中非常常见。通过HSSF,我们...
本文将详细介绍如何使用Apache POI的HSSF API来控制Excel文件的各种操作,包括创建工作簿、创建和管理表格、设置单元格数据和样式等。 #### 二、创建工作簿(Workbook) 在使用Apache POI创建Excel文件之前,首先...
对于导出带图片的Excel,我们需要使用它的HSSF(处理老版97-2003 .xls格式)或XSSF(处理.xlsx格式)API。 2. **工作簿和工作表**:在POI中,工作簿(Workbook)代表整个Excel文件,而工作表(Sheet)代表其中的...
本篇文章将深入探讨如何使用C#来操作Excel文件,这是许多开发者在处理数据时经常会遇到的需求。 首先,要操作Excel文件,C#开发者通常会使用Microsoft提供的Office Interop库,它允许程序直接与Office应用程序进行...