在介绍该写法之前,为了不在此的走错误的方式,有以下总结点:
1.对POI的使用需要进行运行时异常的捕捉,否则连错误都不知道哪里出的。
2.POI对中文日期,也就是通过格式刷读取的内容都会作为数字去识别,对中文格式的样式不支持。
3.需要自己结合判断excel的日期和时间的区别,否则给出的结果也不是期望值。比如:12:00:00和1970-05-01都是敏感日期,也是作为日期和时间分割的临界点。
4.结合POI可以做出很强大的数据映射算法,该强大指的是从实用角度,灵活方便的对数据进行java的数据存储映射进行数据匹配工作。
配置jar文件列表:
POI-3.6-20091214.jar
POI-contrib-3.6-20091214.jar
POI-ooxml-3.6-20091214.jar
POI-ooxm.-schemas-3.6-20091214.jar
POI-scratchpad-3.6-20091214.jar
log4j-1.2.14.jar
(另外由于POI需要调用其他的jar包但POI官网也没提供下载,通过捕捉运行时异常才发现缺少该jar包)
xmlbeans-2.3.0.jar
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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;
public class TestPOI {
public void ExcelModel(String filename) throws FileNotFoundException{
int sheets=0;
FileInputStream fis = new FileInputStream(filename);
try{
//System.out.println(FilePath);
Workbook wb = null;
if (filename.endsWith(".xls")) {
// inp = new FileInputStream(FilePath);
wb = (Workbook) new HSSFWorkbook(new POIFSFileSystem(fis));
} else if (filename.endsWith(".xlsx")) {
wb = (Workbook) new XSSFWorkbook(fis);
}
Sheet childSheet = wb.getSheetAt(sheets);//默认第一页读取
for(int r=1; r < childSheet.getPhysicalNumberOfRows(); r++) {//循环该 子sheet 行数
String sheetname=childSheet.getSheetName();
System.out.println(sheetname );
Row row = childSheet.getRow(r);
if(row==null ){
System.out.println("第 " +r +" 行 为空行" ) ;
}
//System.out.println("childSheet " + (r+1) + "行数:: " + childSheet.getPhysicalNumberOfRows());
//System.out.println("childSheet 单元格的数目:: " + childSheet.getRow(r).getPhysicalNumberOfCells());
HashMap<String,String> rowappend=new HashMap<String,String>();
for (short c = 0; c < childSheet.getRow(r).getPhysicalNumberOfCells(); c++) {//循环该子sheet行对应的单元格项
Cell cell = childSheet.getRow(r).getCell(c);
//System.out.println("cell:: " + cell);
String value = null;
String temp=null;
if (cell == null)
continue;
//System.out.println("cell.getCellType():: " + cell.getCellType());
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
if(DateUtil.isCellDateFormatted(cell)) {
//DateUtil.isCellDateFormatted(cell)
//此处再次判断时间和日期的类型分支
Date d = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String isTime=formater.format(d);
String Time= isTime.substring(0,isTime.lastIndexOf(" ") );
String Date = isTime.substring(isTime.lastIndexOf(" ")+1,isTime.length());
if(Time.equals("1900-01-05")){
isTime=isTime.substring(isTime.lastIndexOf(" ")+1);
value=""+isTime;
}else if(Date.equals("12:00:00")){
isTime=isTime.substring(0, isTime.lastIndexOf(" "));
value=""+isTime;
}else{
value=""+formater.format(d);
}
}else{
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);//true时的格式:1,234,567,890
double acno=cell.getNumericCellValue();
temp=nf.format(acno);
value=""+temp;
}
break;
case HSSFCell.CELL_TYPE_STRING:
String a=cell.getStringCellValue();
if(a.endsWith("null")||a.endsWith("NULL")||a.endsWith("Null")){
value="";
System.out.println("------------ 此处已经对null字符串进行了处理" );
}else {
value = cell.getStringCellValue();
}
break;
// 此处对用户删除数据后,单元格为null的处理
case HSSFCell.CELL_TYPE_BLANK:
{
value="";
}
;
break;
default:
}
System.out.println("value :: " + value);
}
}
}catch (Exception e) {
e.printStackTrace();
System.out.println("-----------------已运行transCount() : " + e);
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[]){
try{
TestPOI test = new TestPOI();
String testExcel = "C:/test.xlsx";
test.transCount(testExcel);
} catch (Exception e) {
System.out.println("已运行xlRead() : " + e);
}
}
}
经过了一段时间的测试 :该POI 存在一些性能问题如下
1.过多的sheet 页读取 wb.getNumberOfSheets() 会出现
java.lang.OutOfMemoryError: Java heap space
2.POI会对 2007 的excel 文件 读取生成一个 等大小的临时文件在
X:\apache-tomcat-5.5.26\temp\poifiles 下,反编译后读取源码发现,并没有对该文件进行删除。
3.针对之前写的代码,近期我会对其进行性能测试和改进。
分享到:
相关推荐
"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...
在这个场景中,我们将重点讨论如何使用Java POI库将Word文档转换为HTML格式,并确保这种转换对Microsoft Word 2003(.doc)和2007(.docx)版本都兼容。 首先,我们需要引入Apache POI库到Java项目中。这可以通过...
完成上述步骤后,你就可以将一个Word文档转换为HTML,且兼容03和07版。测试文件`testPOI`可能包含了示例代码或测试用例,供你参考和调试。 总的来说,Apache POI库提供了强大的功能,使得开发者能够在Java环境中...
### POI兼容2003 和 2007 #### 概述 Apache POI 是一个用于读写Microsoft Office格式文件(如Excel、Word等)的...通过以上知识点的学习,开发者可以更好地理解和使用Apache POI来兼容和处理不同版本的Excel文件。
在本文中,我们将重点讨论如何使用POI库来实现对Excel 2003和2007文件的兼容性操作。Excel 2003使用的是.BIFF(Binary Interchange File Format)格式,而Excel 2007及以上版本则引入了新的.OpenXML(.xlsx)格式,...
这个"poi 实例和教程(兼容所有execl)"的压缩包显然包含了关于如何使用Apache POI库来操作不同版本的Excel(从2003到2010)的详细资料和示例代码。 Apache POI 提供了HSSF和XSSF两个主要的API,用于处理不同的Excel...
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
Apache POI 是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Word(.doc 和 .docx)。本篇文章将详细介绍如何使用POI来读写Word文件,兼容doc与docx版本。 首先,我们需要理解....
3.12-20150511.jar、poi-scratchpad-3.12-20150511.jar、slf4j-api-1.7.21.jar、slf4j-log4j12-1.7.21.jar、xmlbeans-2.6.0.jar-共14个兼容包,我之前出现的问题是java windows里的环境与linux环境一样就是包jar错,...
本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个实用工具集,它能够帮助开发者实现在Web环境下对这些文件的在线预览功能,无需用户下载文件到本地即可查看内容,提高了用户体验和数据安全性。...
下载后,运行 可以 Test1中的main方法,注意里面的word模版地址要修改下。 test1.java主要是针对word的书签操作 MSWordTool.java主要是针对word的列表书签的操作,相对来说比较复杂,具体看个人需求。
在处理Office 03和07版本的文件时,Java POI 提供了不同的类库支持。下面我们将详细探讨如何使用Java POI来读取不同版本的Office文件,以及如何导入所需的jar包。 首先,我们需要理解Java POI的主要组件: 1. **...
poi导入excel 兼容2003-2007兼容版本,测试可以成功;poi导入excel 兼容2003-2007兼容版本,测试可以成功;
在本文中,我们将深入探讨如何使用Apache POI库来兼容读取Excel2003(.xls)和Excel2007及以上版本(.xlsx)的文件。 首先,Apache POI提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet Format)...
总的来说,Apache POI是一个强大的工具,无论是3.16还是4.0.1,都能帮助Java开发者轻松地处理Office文档,只是在选择版本时需要权衡性能、稳定性和兼容性等因素。在实际应用中,通常建议使用最新稳定版本以获取最佳...
这篇博客“通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)”正是介绍了如何使用Apache POI库来处理不同版本的Excel文件。 Apache POI 提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet ...
本教程将深入探讨如何使用Apache POI库来实现这些文件向HTML的转换,以实现跨平台和浏览器的兼容性。 Apache POI 提供了HSSF和XSSF两个API,分别用于读写旧版的BIFF8格式(.xls)和新的OOXML格式(.xlsx)。对于...
java使用poi操作excel导入导出源码,可以同时兼容03、07版本,所需jar包可以链接http://download.csdn.net/detail/yaohucaizi/5215864进行下载!
关于net.sf.jxls下的jxls-core包与POI 4.1.2版本不兼容的解决
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。