`
开心就好
  • 浏览: 539924 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Java 操作 Excel (读)

阅读更多

一个项目要求读Excel表格,于是Google、baidu查了查,看到不少关于Java读Excel到文章,讲解的比较详细。今天开博,第一篇文章,对Java读Excel进行一下总结,内容全都是来自网络,我只是做了一些修改、总结。经过挑选决定采用poi和fastexcel。

 

1、poi读取Excel (poi-3.2-FINAL-20081019)

 

        // 构造 HSSFWorkbook 对象,strPath 传入文件路径
        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(strPath));
        // 读取文件中的第一张表格
        HSSFSheet sheet = wb.getSheetAt(0);
        // 定义 row、cell
        HSSFRow row;
        // HSSFCell cell;
        String cell;
        // 循环输出表格中的内容
        for (int i = sheet.getFirstRowNum(); i < sheet.getPhysicalNumberOfRows(); i++) {
            row = sheet.getRow(i);
            for (int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++) {
                // 推荐通过 row.getCell(j).toString() 获取单元格内容,
                cell = row.getCell(j).toString();
                System.out.print(cell + "\t");
            }
            System.out.println("");
        }

 

2、fastexcel读Excel (fastexcel-0.2-2009-01-16)

 

        // 打开表格文件,strPath设置文件所在路径
        Workbook workBook = FastExcel.createReadableWorkbook(new File(strPath));
        workBook.open();

        // 基于事件的读取
//        workBook.getSheet(0, new SheetReadAdapter() {
//			public void onCell(int row, int col, String content) {
//				System.out.println(row + "," + col + "," + content);
//			}
//		});

        // 基本的读取
        // 操作第一张表格
        Sheet s = workBook.getSheet(0);
        // 设置 row、cell
        String[] row;
        String cell;
        // 循环输出表格内容
        for (int i = s.getFirstRow(); i < s.getLastRow(); i++) {
            row = s.getRow(i);
            for (int j = s.getFirstColumn(); j < s.getLastColumn(); j++) {
                cell = s.getCell(i, j);
                System.out.print(cell + "\t");
            }
            System.out.println("");
        }
        // 关闭连接
        workBook.close();

 

3、简单测试读取速度 (Intel(R) Pentium(R) Dual T2330  @ 1.60GHz 内存:2G)

 

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
        TimeZone t = sdf.getTimeZone();
        t.setRawOffset(0);
        sdf.setTimeZone(t);
        Long startTime = System.currentTimeMillis();
        // 检测代码
        String fileName = "F:\\我的文档\\专业实训\\07信管缴费代码.xls";
        try {
            // 性能更好,读取更快
            FastexcelReadExcel fre = new FastexcelReadExcel();
            fre.testFastExcel(fileName);
        } catch (Exception ex) {
            Logger.getLogger(FastexcelReadExcel.class.getName()).log(Level.SEVERE, null, ex);
        }
        Long endTime = System.currentTimeMillis();
        System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));

        startTime = System.currentTimeMillis();
        // 检测代码
        try {
            PoiReadExcel er = new PoiReadExcel();
            er.testPoiExcel(fileName);
        } catch (Exception ex) {
            Logger.getLogger(FastexcelReadExcel.class.getName()).log(Level.SEVERE, null, ex);
        }
        endTime = System.currentTimeMillis();
        System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));

 

fastexcel 读取用时:656ms,poi 读取用时:735ms。

Excel 表格 为 80行8列。

 

总结:poi是非常强大的,可以完成设置各种格式,但是相对的也可能更慢一些(猜测),fastexcel则更适合读取数据,不需要控制太多的格式,只是简单的读取。

两者的具体实现没有过深入的了解过。

对于读取Excel内容,导入数据库中,优先选用fasteexcel。

对于要求更高的格式控制,优先选用poi。

另外还有JXL等其他操作Excel的开源项目,没有使用过,感觉有以上两者已经足够。

对于office2007格式还没有研究,等待……

分享到:
评论
11 楼 lkjust08 2009-02-28  
LZ写的很好。
10 楼 bevis.cn 2009-02-28  
很不错,行
9 楼 l7810 2009-02-28  
niwei 写道
baoq 写道
几万行的excel 怎么办?

这个倒是我一开始做导入导出时一直很困惑的问题,对于b/s应用来说搞个几万行的excel(好像最多是65536吧)出来,如果把它们逐一读取到内存中,再进行业务逻辑上的验证,服务器内存好像吃不消。后来我们在项目中是搞个提示,导入的附件最多只能3M之类的。
不过这样从用户体验来说也不怎么爽吧。
我还真不知道有什么好的解决办法。

我用jxl+JDBC+jdk1.5做的导入,最多只能一次导入1.5万条数据,郁闷死我了,再多1条,就报告说虚拟内存不够,开始以为是我程序问题,结果后来发现不是我的,是jxl包中抛了异常,哎,这个问题至今还没解决掉,哎
8 楼 niwei 2009-02-25  
baoq 写道
几万行的excel 怎么办?

这个倒是我一开始做导入导出时一直很困惑的问题,对于b/s应用来说搞个几万行的excel(好像最多是65536吧)出来,如果把它们逐一读取到内存中,再进行业务逻辑上的验证,服务器内存好像吃不消。后来我们在项目中是搞个提示,导入的附件最多只能3M之类的。
不过这样从用户体验来说也不怎么爽吧。
我还真不知道有什么好的解决办法。
7 楼 guooscar 2009-02-25  
fmzrt 写道
几个月前我一直在做导入导出

就是日期的导入会出问题


日期有问题是因为excel内建的日期格式和java用的日期格式有出入引起的

fastexcel在0.3.1版本中已经加入对这些内建格式的转化,基本上都可以读出来
6 楼 fmzrt 2009-02-25  
几个月前我一直在做导入导出

就是日期的导入会出问题
5 楼 baoq 2009-02-25  
几万行的excel 怎么办?
4 楼 elyson_chen 2009-02-25  
lz对poi操作excel还不深入,在贴出的poi读excel的Java代码中第10行和12行的方法是不正确的,之所以能用是因为你那是从第0行0列开始的数据。
3 楼 guooscar 2009-01-27  
开心就好 写道
heqteyur 写道
POI确实很强大,但是当你的Excel文件里包含日期类型的字段时你会遇到麻烦的,比如说用PB把数据库导出来,然后直接用POI读取内容时,如果遇到有日期类型会报错,而且POI还没有解决这个问题,我用jxl读取同样的情况下只会报警搞,但是数据能读得出来的,其他方面还没有具体用过。。。

不怕你笑话,我还没有遇到过这样的情况,也才刚学习Java一年,没有经验,这次主要是Java读取Excel,把数据导入到MySQL中,所使用的数据不包含日期类型,所以没有碰到你所说的情况。

通过Google查到 HSSFDateUtil.isCellDateFormatted(cell) 可以判断出单元格的值是否为日期

读取日期的话,我感觉可以通过读取文本的方式来实现,在程序中实现转换成日期类型。

不知道 对不对

excel中的数据格式很多,而且很大一部分是可以自定义的,内建格式一般的都可以读出来,但是对于用户自定义的格式在程序分析的时候就会遇到很多麻烦,程序只能一个一个的试。其实最好的方式就是把原生的内建数据读出来,对日期来说就是一个数字,然后自己转换。
许多程序导出的excel在数据的一致性方面还有不同。所以就会出现少读几行之类的情况。程序在读到这种情况的时候也只能打印警告信息。
ps excel在时间的表示方面还有一些bug
2 楼 开心就好 2009-01-26  
heqteyur 写道
POI确实很强大,但是当你的Excel文件里包含日期类型的字段时你会遇到麻烦的,比如说用PB把数据库导出来,然后直接用POI读取内容时,如果遇到有日期类型会报错,而且POI还没有解决这个问题,我用jxl读取同样的情况下只会报警搞,但是数据能读得出来的,其他方面还没有具体用过。。。

不怕你笑话,我还没有遇到过这样的情况,也才刚学习Java一年,没有经验,这次主要是Java读取Excel,把数据导入到MySQL中,所使用的数据不包含日期类型,所以没有碰到你所说的情况。

通过Google查到 HSSFDateUtil.isCellDateFormatted(cell) 可以判断出单元格的值是否为日期

读取日期的话,我感觉可以通过读取文本的方式来实现,在程序中实现转换成日期类型。

不知道 对不对
1 楼 heqteyur 2009-01-25  
POI确实很强大,但是当你的Excel文件里包含日期类型的字段时你会遇到麻烦的,比如说用PB把数据库导出来,然后直接用POI读取内容时,如果遇到有日期类型会报错,而且POI还没有解决这个问题,我用jxl读取同样的情况下只会报警搞,但是数据能读得出来的,其他方面还没有具体用过。。。

相关推荐

    Java操作Excel详解

    详细介绍Java操作Excel,包括对Excel的读、写、更新等操作,并附加例子.

    Java操作Excel.rar

    Java操作Excel.rar java Excel 操作Excel

    java 导入Excel 文件,支持xls、xlsx、csv格式

    java 导入Excel 文件,兼容Excel 2003(后缀名:xls)及 2007(后缀名:xlsx)的文件,同时还支持csv格式的文件

    java操作EXCEL表格及开发包jxl.zip

    JAVA读/写EXCEL表格以及其实例,运用时只要先导入jxl.zip开发包即可

    java poi excel读写demo

    java poi excel操作demo 支持xls和xlsx两个格式的excel文件的读写操作。读取模式包含用户模式和事件驱动模式 ,事件驱动模式能够支持大数据量的读操作,写操作xlsx使用sxssf方式支持大数据量的写入操作。 demo 基于...

    java excel操作 poi-3.17 可用于jdk1.70

    附件是java poi 3.17的lib库及其依赖库,全部下载引用后,可以进行excel的读写操作,无需引用其他lib库。poi-3.17适用于jdk1.7。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft ...

    Java操作Excel

    Java操作Excel常用的两种组件,分别是Apache的POI和阿里巴巴的EasyExcel。本文主要概括了这两种方法的读和写操作,还附上了许多的实示例,大部分来自于官网。

    通过java操作excel表格的工具类库jxl

     通过java操作excel表格的工具类库  支持Excel 95-2000的所有版本  生成Excel 2000标准格式  支持字体、数字、日期操作  能够修饰单元格属性  支持图像和图表  应该说以上功能已经能够大致满足我们的需要。最...

    jxl的excel读写操作

    jxl的excel读写操作 java操作excel的读写。

    java对excel文件的操作

    解开压缩包有两个文件夹: 1 jexcelapi文件夹是我从网上下载的,由于能力有限,我只看懂了其中一小部分其中jar包在根目录...工程目录下excel/src/help中read.java是读excel文件例子,write.java是写excel文件例子

    JAVA 对CSV和Excel文件格式的读写

    利用Java swing 对csv和excel文件进行读写;并且可以同时读取5个文件的数量;通过关键字配置来读文件,还有就是通过POI CSVWriter等类的使用来对excel和csv等文件进行操作

    java操作csv文件(读、写)

    在做项目的时候,发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来...

    java的POI操作excel

    poi对excel操作,包括生成excel,读excel,从数据库中读取数据产生excel等

    Java利用JXL读写Excel

    Java利用JXL读和写操作Excel表格示例代码,可直接导入MyEclipse使用

    JAVA导出数据到excel中大数据量的解决方法

    web项目中需要有将数据导出excel的操作需求 使用html格式导出方法,但在导出时,根据最大行数重新建立新的excel文件; 数据从数据库取出使用纯jdbc方式读数据,边读边向文件中写; 待所有数据写完,将各个小excel...

    读取百万级数据量的xlsx文件的java代码

    xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大excel文件,本例子从这点出发,组装excel里读取的单条数据为list,在根据需求操作list,即单条读取,单条操作,下载下来...

    java读写excel源码-pyexcel:用于在csv、ods、xls、xlsx和xlsm文件中读取、操作和写入数据的单一API

    java读写excel源码pyexcel - 让你专注于数据,而不是文件格式 支持项目 如果贵公司已将 pyexcel 及其组件嵌入到创收产品中,请在 github 上支持我,或维护该项目并进一步开发。 如果您是个人,也欢迎您支持我,无论...

    基于POI之后封装Excel直接转Object的List

    自己封装的java 读Excel的jar包,省去了传统的poi的复杂操作,用一种类似于Hibernate的注解形式,实现Excel数据直接转list对象

    POI操作Excel常用方法总结.docx

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 二、 HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取...

    poi导出excel的使用

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。...Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。

Global site tag (gtag.js) - Google Analytics