Java开发项目中经常会碰到处理Excel文件中数据的情况,这里通过一个例子来看一下实现方法:从Excel文件orders.xls中读取订单信息,从中找出2010年1月1日(含)之后,并且SELLERID等于18的订单。找到的数据写入order_result.xls文件。

Excel文件orders.xls的内容如下:

ORDERIDCLIENTSELLERIDAMOUNTORDERDATE

1UJRNP173922008/11/2 15:28

2SJCH648022008/11/9 15:28

3UJRNP16135002008/11/5 15:28

4PWQ9261002008/11/8 15:28

5PWQ1144102008/11/12 15:28

6HANAR1861742008/11/7 15:28

7EGU2178002008/11/6 15:28

8VILJX721562008/11/9 15:28

9JAYB14174002008/11/12 15:28

10JAXE19192002008/11/12 15:28

11SJCH7137002008/11/10 15:28

12QUICK11212002008/11/13 15:28

13HL12214002008/11/21 15:28

14JAYB176442008/11/16 15:28

15MIP1632342008/11/19 15:28

16AYWYN465662008/11/21 15:28

Java程序的编写思路是

1、从Excel文件逐行读入数据保存到List对象sourceList中。

2、遍历List对象sourceList,如果满足条件就保存到结果List对象resultList中。

3、遍历reslutList,逐行保存到输出Excel文件中。

其中包含一些处理不同数据类型的语句,具体代码如下:

publicstatic void myExcel() throws Exception {

//读excel数据

HSSFWorkbookworkbook=

newHSSFWorkbook(new FileInputStream(newFile("d:/file/orders.xls")));

Sheet sheet=workbook.getSheetAt(0);//读取第一个sheet

List>sourceList= newArrayList>();

List>resultList=new ArrayList>();

SimpleDateFormatformat = new SimpleDateFormat("yyyy-M-ddHH:mm:ss");

for(int i = 1; i

Row row=sheet.getRow(i);

Map order=newHashMap();

Cell cell0 = row.getCell(0);

cell0.setCellType(Cell.CELL_TYPE_STRING);

//整数数据要转为txt,否则会变成浮点数

Cellcell1 = row.getCell(1);

cell1.setCellType(Cell.CELL_TYPE_STRING);

Cellcell2 = row.getCell(2);

cell2.setCellType(Cell.CELL_TYPE_STRING);

order.put("ORDERID",cell0.toString());

order.put("CLIENT",cell1.toString());

order.put("SELLERID",cell2.toString());

order.put("AMOUNT",row.getCell(3).toString());

//处理日期类型的数据

order.put("ORDERDATE",

HSSFDateUtil.getJavaDate(row.getCell(4).getNumericCellValue()));

sourceList.add(order);

}

for(int i = 0, len = sourceList.size(); i

Maporder =(Map) sourceList.get(i);

System.out.println("1order.get(\"SELLERID\")="+order.get("SELLERID"));

if( Integer.parseInt(order.get("SELLERID").toString())==18 &&

((Date)order.get("ORDERDATE")).after(format.parse("2009-12-3123:59:59")) )

{//判断是否符合条件

resultList.add(order);//符合条件的加入List对象resultList

}

}

//写excel文件

HSSFWorkbookworkbook1 = new HSSFWorkbook();//创建excel文件对象

Sheetsheet1 = workbook1.createSheet();//创建sheet对象

Rowrow1;

row1= sheet1.createRow(0);//第一行,标题

row1.createCell(0).setCellValue("ORDERID");

row1.createCell(1).setCellValue("CLIENT");

row1.createCell(2).setCellValue("SELLERID");

row1.createCell(3).setCellValue("AMOUNT");

row1.createCell(4).setCellValue("ORDERDATE");

for(int i = 1, len = resultList.size(); i

row1= sheet1.createRow(i);

row1.createCell(0).setCellValue(resultList.get(i).get("ORDERID").toString());

row1.createCell(1).setCellValue(resultList.get(i).get("CLIENT").toString());

row1.createCell(2).setCellValue(resultList.get(i).get("SELLERID").toString());

row1.createCell(3).setCellValue(resultList.get(i).get("AMOUNT").toString());

row1.createCell(4).setCellValue(format.format((Date)resultList.get(i).get("ORDERDATE")));

}

FileOutputStreamfos = newFileOutputStream("d:/file/orders_result.xls");

workbook1.write(fos);//写文件

fos.close();

}

程序执行后生成的excel文件数据如下:

ORDERIDCLIENTSELLERIDAMOUNTORDERDATE

432ERNSH186272.02010-1-13 15:28:05

444SJCH184312.02010-1-25 15:28:05

452HP184312.02010-2-01 15:28:05

492HP1827900.02010-3-07 15:28:05

512BTMMU1818000.02010-3-27 15:28:05

524PJIPE1815600.02010-4-09 15:28:05

637HP189114.02010-8-01 15:28:05

638JOPO18294.02010-8-01 15:28:05

myExcel函数中有一多半代码是读写和处理Excel文件和数据类型的,比较复杂。条件过滤的代码虽然不多,但是却不够通用。过滤条件是固定的,如果有变化,就必须要改代码。如果希望变成动态过滤条件,那么就要写动态表达式解析程序了。理论上可以实现类似SQL那样灵活的过滤条件,但是程序比较难写,调试也比较复杂。

如果考虑采用集算器esProc作为辅助来实现Excel数据的处理,将会使这个程序的开发容易很多。esProc是专门为结构化(半结构化)数据设计的编程语言,可以写出比较简单的Excel文件处理程序。Java程序调用esProc脚本也非常简单。

程序员可以将条件“2010年1月1日(含)之后,并且SELLERID等于18的订单。”作为参数where传递给esProc程序,如下图:

Where的值是:ORDERDATE>=date(2010,1,1)&& SELLERID==18。esProc的程序代码如下:

A1:定义一个file对象,导入数据,第一行是标题。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。如果访问xlsx文件,可以写成=file("D:/file/orders.xlsx").importxls@xt()。

A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(ORDERDATE>=date(2010,1,1) && SELLERID==18)。

A3:将符合条件的结果集写入excel文件。

过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:2010年1月1日(含)之后,并且SELLERID等于18的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT=="PWQ"||ORDERDATE>=date(2010,1,1) && SELLERID==18。执行之后,A2中的结果集如下图:

我们可以在Java程序中调用这段esProc程序,使用esProc提供的jdbc即可完成。将上述esProc程序保存为test.dfx文件的话,Java调用的代码如下:

//建立esProcjdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc程序(存储过程),其中test是dfx的文件名

com.esproc.jdbc.InternalCStatementst=(com.esproc.jdbc.InternalCStatement)con.createStatement();

//设置参数

st.setObject(1,"ORDERDATE>=date(2010,1,1)&& SELLERID==18|| CLIENT==\"PWQ\"");//参数就是动态的过滤条件

//执行esProc存储过程

st.execute();

对于这种代码较简单的脚本,还可以直接把集算器代码写在调用集算器JDBC的Java程序中,而不必专门编写集算器脚本文件(test.dfx):

String where="CLIENT==\"PWQ\"||ORDERDATE>=date(2010,1,1)&& SELLERID==18 ";

String resultpath="D:/file/orders_result.xls ";

String sourcepath=" D:/file/orders.xls";

ResultSet set =st.executeQuery("=file(\""+resultpath+"\").exportxls@t(file(\""+sourcepath+"\").importxls@t().select("+where+"))");

这段Java代码直接调用了集算器的一句脚本:从Excel文件中取得数据,并按照指定的条件过滤。结果集写入结果Excel文件。

java读取excel数据的方法是_Java读写Excel文件中数据的简便方法相关推荐

  1. java 取数组的前90位_java 从int数组中获取最大数的方法

    java 从int数组中获取最大数的方法 首先要有数组的概念吧,知道什么是数组,简单讲就是存放一组数据的一个组合,就是一个数组....哈哈 已知一个int数组, 编程从数组中获取最大数. 思路分析: ...

  2. python两个表格相同数据筛选_python筛选出两个文件中重复行的方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. java读取带格式word文档_Java读取word文档解决方案

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java ...

  4. qt 从文件中读出数据显示在表格中_java如何从文件中读取数据存在数组再显示在表格中!!...

    再谢谢你昨天帮我解决了那个读数据再显示在JTextArea中,现在我想显示在表格中啦!而且对应显示!数据一行一行读,再存在arraylist中数据:何子杨13580130150652150计算机丁香维 ...

  5. python文件读取输出-Python 读写文件中数据

    1 需求 在文件 h264.txt 中的数据如图1,读入该文件中的数据,然后将第1列的地址删除,然后将数据输出到h264_out.txt中: 图1 h264.txt 数据截图 图2 输出文件 h264 ...

  6. Python webdriver 读取本地csv文件中数据 提示:IOError: [Errno 2] No such file or directory

    创建本地文件  打开excel,创建数据,另存为 XXX.csv 编写代码并调式 #-*-coding:utf-8-*- import os import csv #导入csv包files = fil ...

  7. python怎么打开h5文件_python中利用h5py模块读取h5文件中的主键方法

    如下所示: import h5py import numpy as np #HDF5的写入: imgData = np.zeros((2,4)) f = h5py.File('HDF5_FILE.h5 ...

  8. python如何逐行读取文件_Python逐行读取文件中内容的简单方法

    项目开发中文件的读写是必不可少的 下面来简单介绍一下文件的读 读文件,首先我们要有文件 那我首先自己创建了一个文本文件password.txt 内容如下: 下面先贴上代码,然后对其进一步解释: # c ...

  9. python读取raw数据文件_Python 读写文件中数据

    1 需求 在文件 h264.txt 中的数据如图1,读入该文件中的数据,然后将第1列的地址删除,然后将数据输出到h264_out.txt中: 图1 h264.txt 数据截图 图2 输出文件 h264 ...

  10. c++ 按行读取txt文件并赋值_python操作txt文件中数据教程[3]python读取文件夹中所有txt文件并将数据转为csv文件...

    觉得有用的话,请点击右下角 推荐给更多小伙伴 neoken_xuAsurada2015Evacloud 参考文献 python 操作 txt 文件中数据教程[1]-使用 python 读写 txt 文 ...

最新文章

  1. 4.3.7 ARP协议
  2. linux下安装sniffit
  3. java常用技术栈,HR的话扎心了
  4. h3c服务器 raid 型号,H3C服务器创建Raid
  5. 【Python】from __future__ import absolute_import的作用
  6. MySQL-MMM如何调用远程管理卡命令去fence?
  7. JavaScript 中的 window onload 应该什么时候写
  8. Emacspeak,Linux的声音界面
  9. python 取字符串的最后一位_python中获得一个字符串最后出现位置 | 学步园
  10. [Music]乡村摇滚:Any man of mine
  11. 超强PCB布线设计经验
  12. 心海软件学心理测试系统,心海软件-心理测试、心理档案、心理咨询室管理系统...
  13. 迅雷11抢先体验版,免费2T空间可离线不限速取回
  14. word文档中删除空行(段落空行与缩进空行)
  15. selenium模拟登陆拉勾网
  16. Android 音乐APP(五)音乐通知栏、后台播放音乐
  17. 广电网络宽带电视网关简介与优化设置
  18. 提升网站关键词排名的技巧
  19. 无线华为能连苹果不能连接到服务器,华为手机连苹果Mac,连不上?手把手教你...
  20. python学习笔记之爬虫框架scrapy(十七)

热门文章

  1. swf播放器air android 版,网极SWF播放器安卓版
  2. 完整的支付系统整体架构
  3. SAP - MM - 第3篇 - 供应商主数据
  4. 函数重载 overload
  5. 深入了解Spring IoC
  6. 健康生活 - 四季水果参考
  7. 0723函数的递归以及模块的初识
  8. 教你利用腾讯云cdn加速网站静态资源
  9. samba 指定的网络名不再可用
  10. android投屏功能开发,Android DLNA投屏-基于CyberGarage开发投屏功能