在介绍该写法之前,为了不在此的走错误的方式,有以下总结点:
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完美修订版本 java源码 兼容03和07 可运行 带详细注释 GX了
java+poi实现word转换html兼容03和07,可以直接用于项目中,当做工具类使用,添加部分注释,自己也是在网上做了很多功课整理出来的,血汗分
poi实现word转换html兼容03和07,手动整理含jar包,报错原因。
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(文件路径))); jar包包括:...
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
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错,...
NULL 博文链接:https://81365341.iteye.com/blog/1149108
POI导入导出工具类支持office2003和2007的excel表格导入
poi导入excel 兼容2003-2007兼容版本,测试可以成功;poi导入excel 兼容2003-2007兼容版本,测试可以成功;
下载后,运行 可以 Test1中的main方法,注意里面的word模版地址要修改下。 test1.java主要是针对word的书签操作 MSWordTool.java主要是针对word的列表书签的操作,相对来说比较复杂,具体看个人需求。
poi 对execl 所有版本(2003到2010)进行创建 ,读取,写入,等操作及相关 教程资料
利用POI实现Excel的导入和导出实例的实现,外加poi的全部jar包
java使用poi操作excel导入导出源码,可以同时兼容03、07版本,所需jar包可以链接http://download.csdn.net/detail/yaohucaizi/5215864进行下载!
poi3.16jar包和poi最新版4.0.1jar包
应用poi3.9实现读取excel03和07表格中的数据并在控制台打印出来的简单demo
该包已改过包名,亲测可兼容使用,网上有说把poi升级到4.1.2但是试了导出还是报错,我的原来是3.9版本升到4.1.2还涉及改动代码有风险,所以干脆按自己修改包引用打了个独立的jar包,也可留后续其他项目备用。...
基于poi实现word/excel转换为HTML(且兼容.doc.docx.xls.xlsx) 对于简单的word Excel 转换 足够。excel转换时存在火狐浏览器不兼容乱码问题,希望多多交流。
现在office都到了一几版本了,大部分都是07版本的导入,今天把03和07的jar包都上传
java实现word、excel在线预览。版本2003和2007都支持在线预览,项目需要导入一些poi相关的jar,jar之间的版本有要求。在我的资源列表,有相关的jar包可以下载。
java中poi读写excel封装工具类(兼容office2003和2007等版本),绝对可用的例子!