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. abap dec和curr的区别
  2. ICLR 2020 | 可提速3000倍的全新信息匹配架构(附代码复现)
  3. Angular自学笔记(二)显示数据 绑定属性
  4. java输入做参数需要close吗_JAX-RS和java.time.LocalDate作为输入参数
  5. 2005年3月9日笔记
  6. Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)...
  7. sublime html文件中php代码,sublime - 嵌套在html里面的php代码该遵循怎样的规范
  8. Python统计磁盘代码文件行数
  9. 解决idea使用jdbc连接数据库失败的方法(针对驱动导入失败)
  10. 中兴2021批笔试题解
  11. 2016年虾神公众号预告
  12. WOT 2017会议嘉宾名单提前看!
  13. 贾扬清担任阿里开源技术委员会负责人,开源升级为阿里技术战略之一
  14. 第二十一章 : 文本处理
  15. Visual Haze Removal by a Unified GenerativeAdversarial Network(基于生成式对抗网络的图像去雾IEEE2019)
  16. w ndows7管理员密码,Windows7默认管理员账户用户名和密码是什么
  17. 锁相放大器基础结构原理介绍
  18. c语言 操作ie文本框,IE控件一些高级使用方法
  19. The Twenty-first Of Word-Day
  20. dwg格式怎么转换成pdf?格式转换方法说明

热门文章

  1. 知识分享 | 卡方分析的入门小知识
  2. shell间接变量引用两种方式
  3. C语言差异化定价,双边市场中产品差异化与平台定价研究
  4. 为何国内“程序员”是秃头代名词?来看看国外程序员的一天
  5. php 背单词系统_网上背单词程序PHP
  6. 如何规划自己的人生未来
  7. oracle 的insert into的详解
  8. ITUNES更改备份保存路径(不放C盘,不占C盘)、C盘空间不够
  9. Android 原生插件开发步骤
  10. 硬件工程师成长之路(4)——元件焊接