壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17948|回复: 74

[OAF] OAF实现Excel导入导出的方法

  [复制链接]
发表于 2007/12/13 22:32:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
OAF实现Excel导入导出的功能,导入的功能主要做的是,如何读取Excel数据,并且通用什么样的方法导入到底表里面;导入的功能主要做的是从哪里获得数据,并且如何生成Excel文件,导出给用户。下面,讨论一下如何实现的方法,具体的代码,有需要的,留下Mail。

    首先介绍一下,读取Excel的方法。众所周知,Jakata项目是一个开源的工程,其中子项目POI就是用来读取MS Office文档的项目。POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包,hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。
   这里只对部分例程的实现做介绍。


   先看poi的examples包中提供的最简单的例子,建立一个空xls文件。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class NewWorkbook

{

public static void main(String[] args)

throws IOException

{

HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象

FileOutputStream fileOut = new FileOutputStream("workbook.xls");

wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中

fileOut.close();

}

}

通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。


import org.apache.poi.hssf.usermodel.*;

import java.io.FileOutputStream;

import java.io.IOException;

public class CreateCells

{

public static void main(String[] args)

throws IOException

{

HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象

HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象


// Create a row and put some cells in it. Rows are 0 based.

HSSFRow row = sheet.createRow((short)0);//建立新行

// Create a cell and put a value in it.

HSSFCell cell = row.createCell((short)0);//建立新cell

cell.setCellValue(1);//设置cell的整数类型的值


// Or do it on one line.

row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值

row.createCell((short)2).setCellValue("test");//设置cell字符类型的值

row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值

HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式

cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式

HSSFCell dCell =row.createCell((short)4);

dCell.setCellValue(new Date());//设置cell为日期类型的值

dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式

HSSFCell csCell =row.createCell((short)5);

csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断

csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串

row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell


// Write the output to a file

FileOutputStream fileOut = new FileOutputStream("workbook.xls");

wb.write(fileOut);

fileOut.close();

}

}






[ 本帖最后由 Michael 于 2007-12-15 14:46 编辑 ]
 楼主| 发表于 2007/12/15 11:53:02 | 显示全部楼层
接下来,介绍一下,如果将POI子项目如何在OAF使用起来。
    在Oracle EBS的一些标准功能里,已经提供了一些使用Excel导入的功能,比如iExpense, Web ADI, 在Core HR中有一些导出功能,但这些功能是无法进行客户化的,因为,Oracle并没有提供出使用这些方法的API,所以,这些功能大部分都不能很好的应用起来。基于此,我们可以实现一种利用开源的读取Office文件的方法,来实现客户化导入导出的功能。闲话少说,进入正题,以导入功能为例。
    第一,OAF提供了上传下载文件的方法,可以参考这二个类oracle.apps.fnd.framework.webui.beans.message.OAMessageFileUploadBean, oracle.apps.fnd.framework.webui.beans.message.OAMessageDownloadBean。请注意,这二个类仅在11.5.10或者更高版本才能够应用。
    第二,使用OAF创建一下上传页面,实现此页面的要点就是创建一个VO,其中包含一个BLOB的属性列,这个属性列就是用来存储Excel数据的;
    第三,当用户上传好文件后,就可以使用POI子项目的读取Excel数据的方法,对上传的文件进行读取了。
 楼主| 发表于 2007/12/15 12:28:01 | 显示全部楼层
继续:
    对比Web ADI实现Excel数据上传功能,可以考虑如何来实现批量导入数据到底表的方法。EBS标准功能中,有些模块实现了一些导入Excel数据的方法,如iExpense中导入费用报表的模板;Core HR模块中实现了一些导出信息的方法。但这些功能一般都不能满足业务需求,所以得不到很好的应用。主要的原因还是在于,这些功能是无法客户化的,因为Oracle并没有提供这些API。基于此,可以考虑,使用上面的方法来实现一些功能。闲话少谈,进入正题,以批量导入员工信息为例。

    第一:客户化接口表;(根据需求自己定义接口表)
    第二:上传Excel文件;(利用上面实现的方法)
    第三:读取Excel数据到接口表;(此时可以验证数据的类型,比如数字,日期等)
    第四:调用存储过程对接口表数据的处理;(此时可以验证数据的有效性,值集或者Lookup等)
    第五:验证完成后,调用API将数据导入到业务表里面。(对应于员工信息的是hr_cn_employee.create_employee)

   如此,即可以实现读取Excel数据到业务表的功能。

PS:出于对API效率的考虑,可以使用并发请求来实现数据从接口表到业务表的导入。呵呵,看上去,是不是很像标准功能。
 楼主| 发表于 2007/12/15 14:51:01 | 显示全部楼层
朋友们有空来捧个场
发表于 2007/12/19 09:04:44 | 显示全部楼层
不错好东西
发表于 2007/12/19 15:25:23 | 显示全部楼层

回复 3楼 的帖子

如果有源代码就好了,我的邮箱RAISUN4@HOTMAIL.COM,大虾能不能发给学习一下呀
发表于 2007/12/24 09:18:44 | 显示全部楼层
嗯,个人感觉好像有点麻烦,

前期我们是通过WEB ADI来实现数据成批上载的,感觉还是不错的,不过11i上所支持的web adi比较简单,比如不能控制最终在excel内的一些单元格的属性,这个是有些不方便的地方,不过可以将就

到了r12版本里,就支持了,期待中...
发表于 2007/12/24 12:13:40 | 显示全部楼层
好啊,这个比较好的解决了用户可以自己根据魔板输入数据到excel,然后自己上传到数据库。
发表于 2008/1/6 06:49:24 | 显示全部楼层
可否也給我源代码學習,謝謝!,我的邮箱matiz0000@gmail.com
发表于 2008/1/6 21:53:43 | 显示全部楼层
michael,方便将源码发给我看看吗?这个技术我没有接触过,想看看!
我的邮箱是:jarden08@gmail.com
谢谢你了!
发表于 2008/2/21 10:09:58 | 显示全部楼层
非常不错,值得一看
发表于 2008/3/3 12:39:31 | 显示全部楼层
如果不考虑做成接口,而只是手工按照模板,将数据批量导入后台接口表的话,可以使用PLSQL Developer7.1中的ODBC Importer工具,可以直接读取Excel文件的,很方便的说。

[ 本帖最后由 atomic79 于 2008-3-3 12:45 编辑 ]
发表于 2008/3/3 12:43:29 | 显示全部楼层
刚才浏览器报错,还担心回复没有成功,发觉保存上了啊,^_^,数据导出的操作,从Micheal又学了一招。再标记一下。
 楼主| 发表于 2008/3/3 20:55:52 | 显示全部楼层
嘿嘿,互相学习。
发表于 2008/4/16 23:34:46 | 显示全部楼层
POI的用途很广的,不仅仅限制于OAF的开发。

J2EE项目上经常都会使用,具体使用也很简单。到官网上有STEP BY STEP的代码!
发表于 2008/8/20 09:19:21 | 显示全部楼层

回复 楼主 Michael 的帖子

Hello,Michael.
很高兴看到你写的文章,目前手头上有个项目在EBS11i基础上客户化开发了一个报表管理平台,采用的是OAF中嵌入OWC控件来解决报表填报工作,最近用户提出EXCEL报表导入的功能,希望你能共享下你的代码,供我参考下。谢谢!期待更多大作~
sumongh@gmail.companxk@dfl.com.cn

[ 本帖最后由 Scott.Pan 于 2008-8-20 14:56 编辑 ]
发表于 2008/8/20 10:11:13 | 显示全部楼层

支持

学习中
发表于 2008/8/26 09:45:26 | 显示全部楼层

正在开发OAF,可否给一份

正在开发OAF,需要将查询结果导出到excel,可否给一份
leeeg@126.com
 楼主| 发表于 2008/8/26 13:59:55 | 显示全部楼层
楼上的,导出查询结果有标准的方法可以做,查一下开发手册先
发表于 2008/8/27 09:01:02 | 显示全部楼层
楼主说的这个功能令人非常感兴趣,能不能可以把主要代码给参照以下,咱也学习学习:),谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 21:47 , Processed in 0.022045 second(s), 17 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表