Java读写Excel文件中数据的简便方法

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

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

ORDERID CLIENT SELLERID AMOUNT ORDERDATE

1 UJRNP 17 392 2008/11/2 15:28

2 SJCH 6 4802 2008/11/9 15:28

3 UJRNP 16 13500 2008/11/5 15:28

4 PWQ 9 26100 2008/11/8 15:28

5 PWQ 11 4410 2008/11/12 15:28

6 HANAR 18 6174 2008/11/7 15:28

7 EGU 2 17800 2008/11/6 15:28

8 VILJX 7 2156 2008/11/9 15:28

9 JAYB 14 17400 2008/11/12 15:28

10 JAXE 19 19200 2008/11/12 15:28

11 SJCH 7 13700 2008/11/10 15:28

12 QUICK 11 21200 2008/11/13 15:28

13 HL 12 21400 2008/11/21 15:28

14 JAYB 1 7644 2008/11/16 15:28

15 MIP 16 3234 2008/11/19 15:28

16 AYWYN 4 6566 2008/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<Map<String,Object>>sourceList= newArrayList<Map<String,Object>>();

List<Map<String,Object>>resultList=new ArrayList<Map<String,Object>>();

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

for(int i = 1; i <sheet.getPhysicalNumberOfRows(); i++) {//逐行处理excel数据

Row row=sheet.getRow(i);

Map<String,Object> order=newHashMap<String,Object>();

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 <len; i++) {//按照条件过滤

Map<String,Object>order =(Map<String,Object>) 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 <len; 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文件数据如下:

ORDERID CLIENT SELLERID AMOUNT ORDERDATE

432 ERNSH 18 6272.0 2010-1-13 15:28:05

444 SJCH 18 4312.0 2010-1-25 15:28:05

452 HP 18 4312.0 2010-2-01 15:28:05

492 HP 18 27900.0 2010-3-07 15:28:05

512 BTMMU 18 18000.0 2010-3-27 15:28:05

524 PJIPE 18 15600.0 2010-4-09 15:28:05

637 HP 18 9114.0 2010-8-01 15:28:05

638 JOPO 18 294.0 2010-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")[email protected]()。

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+"\")[email protected](file(\""+sourcepath+"\")[email protected]().select("+where+"))");

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

时间: 2024-10-13 12:38:24

Java读写Excel文件中数据的简便方法的相关文章

R读写Excel文件中数据的方法

用R语言读写Excel的方法有很多,但每种方法都有让人头疼的地方,比如xlsx包的代码复杂,只支持Excel2007:RODBC不易理解,限制太多,程序不稳定,会出各种怪毛病.另存为csv格式的方法倒是比较通用比较稳定,但又存在操作麻烦,无法程序化处理多个文件的问题.提取xml也是个办法,但步骤太多代码太复杂,令人望而生畏.用剪贴板转换也不好,这同样需要人工参与,还不如存为csv. 相比之下,用gdata包来读取,配合WriteXLS写入Excel则可以很好的避开上述麻烦.这两个包都支持Exce

java读写excel文件

需求:利用Java读写excel文件 利用jexcelapi实现Java读写excel文件的功能 首先下载并安装jexcelapi JExcelApi v2.6.12 (1911kbytes) 解压后把jxl.jar文件添加到Java Build Path中 Java读取excel文件 Java写入excel文件

java向Excel文件写入数据

/*使用之前要记得导入第三的jar包这个是我之前使用的时候那别人的东西自己修改了一下 还没来得及好好地封装一下还望见谅,注释我感觉写的挺清楚的就在不进行解释代码了*/ package com.zzp.ExcelParse; import jxl.Workbook;import jxl.format.*;import jxl.format.Alignment;import jxl.format.Border;import jxl.format.BorderLineStyle;import jxl.

JExcel入门,JAVA读写Excel文件

(本人下的是jexcelapi_2_6_12.tar.gz,解压后将里面的jxl.jar复制到WEB-INF/lib目录下面即可) Java Excel API的jar包可以通过以下URL获得:(推荐) http://sourceforge.net/projects/jexcelapi/files/jexcelapi/2.6.6/jexcelapi_2_6_6.zip/download (包括所有版本):http://sourceforge.net/projects/jexcelapi/file

Java读写Excel文件DEMO

下载一定格式的Excel文件: @RequestMapping("/xxxx/xxxx/xxxx/copyfiledownload") @ResponseBody public void copyfiledownload(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception{ response.setContentType("text/html; char

Java读写Excel文件示例

在Linux中,按键.触摸屏.鼠标等等输入设备都可以依靠输入子系统提供的接口函数来实现他们的设备驱动,在输入子系统中,系统已经完成了这些输入设备的共性,所以根据子系统提供的接口,只需要完成各自的独特性即可完成一个输入设备的设备驱动. Linux中,输入子系统由设备驱动层.核心层.事件处理层这三层组成.设备驱动层讲底层输入设备的响应转化为标准的输入事件,事件处理层就为应用程序提供统一的设备访问接口来跟底层交互数据,核心层则是连接驱动层和事件处理层的桥梁. 在输入子系统中重要的结构体就是input_

Java操作Excel之POI:java读写excel文件以及打印设置

开发步骤: * 1.创建一个工作簿 * 2.创建一个工作表 * 3.创建一个行对象 * 4.创建一个单元格对象,指定它的列 * 5.给单元格设置内容 * 6.样式进行修饰(跳过) * 7.保存,写文件 * 8.关闭对象 public void testHSSF_base() throws IOException{ Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet(); Row nRow = sheet.createRow

php获取excel表格中数据的小方法 然后就可以放到数据库了

现在又一个product.xml的表格文件,要求取出其中数据 数据如下: 商品名 价格 iphone4s 4199 note2 3999 小米2 1999 iphone5 4899 1,将product.xml另存为product.csv文件 2,用fgetcsv函数取出其中的数据放到一个数组中(fgetcsv — 从文件指针中读入一行并解析 CSV 字段) 代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2

java 写入数据到Excel文件中_Demo

=======第一版:基本功能实现======= import com.google.common.collect.Maps; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io