`
JonyUabka
  • 浏览: 13289 次
  • 性别: Icon_minigender_1
  • 来自: 东营
社区版块
存档分类
最新评论

POI 的兼容实现 兼容03和07的写法

阅读更多
在介绍该写法之前,为了不在此的走错误的方式,有以下总结点:
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.针对之前写的代码,近期我会对其进行性能测试和改进。
分享到:
评论
1 楼 JonyUabka 2011-09-27  
POI 尝试过如果读取2007 Excel 文件 的sheet 页数超过 10以上就会很慢,30个就会 out of memory 但 03 不会出现该种问题。 POI 两种版本测试都会如此, 3.6与3.7。 唯一比较稳定的版本为 3.6  该版本的 读取 03Excel 的sheet页的个数 相当稳定,但 3.7却没有想象的那么好。

相关推荐

    poi3.9读写excel兼容03和07版本

    "poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...

    java+poi实现word转换html兼容03和07

    在这个场景中,我们将重点讨论如何使用Java POI库将Word文档转换为HTML格式,并确保这种转换对Microsoft Word 2003(.doc)和2007(.docx)版本都兼容。 首先,我们需要引入Apache POI库到Java项目中。这可以通过...

    poi实现word转换html兼容03和07

    完成上述步骤后,你就可以将一个Word文档转换为HTML,且兼容03和07版。测试文件`testPOI`可能包含了示例代码或测试用例,供你参考和调试。 总的来说,Apache POI库提供了强大的功能,使得开发者能够在Java环境中...

    POI兼容2003 和 2007

    ### POI兼容2003 和 2007 #### 概述 Apache POI 是一个用于读写Microsoft Office格式文件(如Excel、Word等)的...通过以上知识点的学习,开发者可以更好地理解和使用Apache POI来兼容和处理不同版本的Excel文件。

    POI兼容Excel2003和2007

    在本文中,我们将重点讨论如何使用POI库来实现对Excel 2003和2007文件的兼容性操作。Excel 2003使用的是.BIFF(Binary Interchange File Format)格式,而Excel 2007及以上版本则引入了新的.OpenXML(.xlsx)格式,...

    poi 实例和教程(兼容所有execl)

    这个"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基于SpringBoot和POI实现单线程和多线程导出Excel.zip...

    使用POI读写Word文件(兼容doc与docx版本)

    Apache POI 是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Word(.doc 和 .docx)。本篇文章将详细介绍如何使用POI来读写Word文件,兼容doc与docx版本。 首先,我们需要理解....

    poi包-兼容版

    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在线预览

    本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个实用工具集,它能够帮助开发者实现在Web环境下对这些文件的在线预览功能,无需用户下载文件到本地即可查看内容,提高了用户体验和数据安全性。...

    poi操作word书签,兼容2003和2007

    下载后,运行 可以 Test1中的main方法,注意里面的word模版地址要修改下。 test1.java主要是针对word的书签操作 MSWordTool.java主要是针对word的列表书签的操作,相对来说比较复杂,具体看个人需求。

    java poi读取office03和office07jar包

    在处理Office 03和07版本的文件时,Java POI 提供了不同的类库支持。下面我们将详细探讨如何使用Java POI来读取不同版本的Office文件,以及如何导入所需的jar包。 首先,我们需要理解Java POI的主要组件: 1. **...

    poi导入excel 兼容2003-2007xls,xlsx.txt

    poi导入excel 兼容2003-2007兼容版本,测试可以成功;poi导入excel 兼容2003-2007兼容版本,测试可以成功;

    POI兼容读取Excel2003和Excel2007

    在本文中,我们将深入探讨如何使用Apache POI库来兼容读取Excel2003(.xls)和Excel2007及以上版本(.xlsx)的文件。 首先,Apache POI提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet Format)...

    poi3.16jar包和poi最新版4.0.1jar包

    总的来说,Apache POI是一个强大的工具,无论是3.16还是4.0.1,都能帮助Java开发者轻松地处理Office文档,只是在选择版本时需要权衡性能、稳定性和兼容性等因素。在实际应用中,通常建议使用最新稳定版本以获取最佳...

    通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)

    这篇博客“通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)”正是介绍了如何使用Apache POI库来处理不同版本的Excel文件。 Apache POI 提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet ...

    基于poi实现word/excel转换为HTML(且兼容.doc.docx.xls.xlsx)

    本教程将深入探讨如何使用Apache POI库来实现这些文件向HTML的转换,以实现跨平台和浏览器的兼容性。 Apache POI 提供了HSSF和XSSF两个API,分别用于读写旧版的BIFF8格式(.xls)和新的OOXML格式(.xlsx)。对于...

    poi操作excel导入导出源码(兼容03、07版本).rar

    java使用poi操作excel导入导出源码,可以同时兼容03、07版本,所需jar包可以链接http://download.csdn.net/detail/yaohucaizi/5215864进行下载!

    关于net.sf.jxls下的jxls-core包与POI 4.1.2版本不兼容的解决

    关于net.sf.jxls下的jxls-core包与POI 4.1.2版本不兼容的解决

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。

Global site tag (gtag.js) - Google Analytics