导入/导出 Excel 的基本方法 JAVA EXCEL API简介
2011年06月09日
转载自:http://hi.baidu.com/lewutian/blog/item/d8166af239d15418b17ec546.htmlJAVA EXCEL API简介使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用 日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到 Excel文件,但是还不能真正的操纵Excel文件,本文将给大家一个惊喜,向大家介绍一个开放源码项目,Java Excel API,使用它大家就可以方便地操纵Excel文件了。JAVA EXCEL API简介Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该 API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。现在发布的稳定版本是V2.0,提供以下功能:从Excel 95、97、2000等格式的文件中读取数据; 读取Excel公式(可以读取Excel 97以后的公式); 生成Excel数据表(格式为Excel 97); 支持字体、数字、日期的格式化; 支持单元格的阴影操作,以及颜色操作; 修改已经存在的数据表; 现在还不支持以下功能,但不久就会提供了:不能够读取图表信息; 可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出;*********************继续转载*********************应用示例1 从Excel文件读取数据表Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术 语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java)import java.io.*;import jxl.*;… … … …try{//构建Workbook对象, 只读Workbook对象//直接从本地文件创建Workbook//从输入流创建WorkbookInputStream is = new FileInputStream(sourcefile);jxl.Workbook rwb = Workbook.getWorkbook(is);}catch (Exception e){e.printStackTrace();}一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。参考下面的代码片段://获取第一张Sheet表Sheet rs = rwb.getSheet(0);我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段://获取第一行,第一列的值Cell c00 = rs.getCell(0, 0);String strc00 = c00.getContents();//获取第一行,第二列的值Cell c10 = rs.getCell(1, 0);String strc10 = c10.getContents();//获取第二行,第二列的值Cell c11 = rs.getCell(1, 1);String strc11 = c11.getContents();System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());如 果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell (0, 0)是文本型,Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。如果有需要知道Cell内容的确切类型,API也提供了一系列的方法。参考下面的代码片段:String strc00 = null;double strc10 = 0.00;Date strc11 = null;Cell c00 = rs.getCell(0, 0);Cell c10 = rs.getCell(1, 0);Cell c11 = rs.getCell(1, 1);if(c00.getType() == CellType.LABEL){LabelCell labelc00 = (LabelCell)c00;strc00 = labelc00.getString();}if(c10.getType() == CellType.NUMBER){NmberCell numc10 = (NumberCell)c10;strc10 = numc10.getValue();}if(c11.getType() == CellType.DATE){DateCell datec11 = (DateCell)c11;strc11 = datec11.getDate();}System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());在 得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值 方法getXXX(),就可以得到确定类型的值。API提供了以下基本类型,与Excel的数据格式相对应,如下图所示:每种类型的具体意义,请参见Java Excel API Document。当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。参考如下代码片段://操作完成时,关闭对象,释放占用的内存空间rwb.close();Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel API Document。Jakata Poi HSSF/*=================== 导入/导出 Excel 的基本方法 ===================*/从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*===================================================================*/--如果接受数据导入的表已经存在insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)--如果导入数据并生成表select * into 表 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)/*===================================================================*/--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)select * from 表--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:--导出表的情况EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'--导出查询的情况EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'/*--说明:c:test.xls 为导入/导出的Excel文件名.sheet1$ 为Excel文件的工作表名,一般要加上$才能正常使用.--*/--上面已经说过,用BCP导出的是类Excel文件,其实质为文本文件,--要导出真正的Excel文件.就用下面的方法/*--数据导出EXCEL导出表中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性考虑,仅支持导出标准数据类型--邹建 2003.10--*//*--调用示例p_exporttb @tbname='地区资料',@path='c:',@fname='aa.xls'--*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[p_exporttb]GOcreate proc p_exporttb@tbname sysname, --要导出的表名@path nvarchar(1000), --文件存放目录@fname nvarchar(250)='' --文件名,默认为表名asdeclare @err int,@src nvarchar(255),@desc nvarchar(255),@out intdeclare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)--参数检测if isnull(@fname,'')='' set @fname=@tbname+'.xls'--检查文件是否已经存在if right(@path,1)'' set @path=@path+''create table #tb(a bit,b bit,c bit)set @sql=@path+@fnameinsert into #tb exec master..xp_fileexist @sql--数据库创建语句set @sql=@path+@fnameif exists(select 1 from #tb where a=1)set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READ'+';CREATE_DB=" +';DATABASE='+@sql+'"'--连接数据库exec @err=sp_oacreate 'adodb.connection',@obj outif @err0 goto lberrexec @err=sp_oamethod @obj,'open',null,@constrif @err0 goto lberr/*--如果覆盖已经存在的表,就加上下面的语句--创建之前先删除表/如果存在的话select @sql='drop table ['+@tbname+']'exec @err=sp_oamethod @obj,'execute',@out out,@sql--*/--创建表的SQLselect @sql='',@fdlist=''select @fdlist=@fdlist+',['+a.name+']',@sql=@sql+',['+a.name+'] '+case when b.name in('char','nchar','varchar','nvarchar') then'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'when b.name in('tynyint','int','bigint','tinyint') then 'int'when b.name in('smalldatetime','datetime') then 'datetime'when b.name in('money','smallmoney') then 'money'else b.name endFROM syscolumns a left join systypes b on a.xtype=b.xusertypewhere b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')and object_id(@tbname)=idselect @sql='create table ['+@tbname+']('+substring(@sql,2,8000)+')',@fdlist=substring(@fdlist,2,8000)exec @err=sp_oamethod @obj,'execute',@out out,@sqlif @err0 goto lberrexec @err=sp_oadestroy @obj--导入数据set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE='+@path+@fname+''',['+@tbname+'$])'exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)returnlberr:exec sp_oageterrorinfo 0,@src out,@desc outlbexit:select cast(@err as varbinary(4)) as 错误号,@src as 错误源,@desc as 错误描述select @sql,@constr,@fdlistgo--上面是导表的,下面是导查询语句的./*--数据导出EXCEL导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性考虑,仅支持导出标准数据类型--邹建 2003.10--*//*--调用示例p_exporttb @sqlstr='select * from 地区资料',@path='c:',@fname='aa.xls',@sheetname='地区资料'--*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[p_exporttb]GOcreate proc p_exporttb@sqlstr varchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent@path nvarchar(1000), --文件存放目录@fname nvarchar(250), --文件名@sheetname varchar(250)='' --要创建的工作表名,默认为文件名as declare @err int,@src nvarchar(255),@desc nvarchar(255),@out intdeclare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)--参数检测if isnull(@fname,'')='' set @fname='temp.xls'if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')--检查文件是否已经存在if right(@path,1)'' set @path=@path+''create table #tb(a bit,b bit,c bit)set @sql=@path+@fnameinsert into #tb exec master..xp_fileexist @sql--数据库创建语句set @sql=@path+@fnameif exists(select 1 from #tb where a=1)set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READ'+';CREATE_DB=" +';DATABASE='+@sql+'"'--连接数据库exec @err=sp_oacreate 'adodb.connection',@obj outif @err0 goto lberrexec @err=sp_oamethod @obj,'open',null,@constrif @err0 goto lberr--创建表的SQLdeclare @tbname sysnameset @tbname='##tmp_'+convert(varchar(38),newid())set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'exec(@sql)select @sql='',@fdlist=''select @fdlist=@fdlist+',['+a.name+']',@sql=@sql+',['+a.name+'] '+case when b.name in('char','nchar','varchar','nvarchar') then'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'when b.name in('tynyint','int','bigint','tinyint') then 'int'when b.name in('smalldatetime','datetime') then 'datetime'when b.name in('money','smallmoney') then 'money'else b.name endFROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertypewhere b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')and a.id=(select id from tempdb..sysobjects where name=@tbname)select @sql='create table ['+@sheetname+']('+substring(@sql,2,8000)+')',@fdlist=substring(@fdlist,2,8000)exec @err=sp_oamethod @obj,'execute',@out out,@sqlif @err0 goto lberrexec @err=sp_oadestroy @obj--导入数据set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE='+@path+@fname+''',['+@sheetname+'$])'exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')set @sql='drop table ['+@tbname+']'exec(@sql)returnlberr:exec sp_oageterrorinfo 0,@src out,@desc outlbexit:select cast(@err as varbinary(4)) as 错误号,@src as 错误源,@desc as 错误描述select @sql,@constr,@fdlistgo
评论这张
转发至微博
发表评论
-
Android arm linux kernel启动流程(二)
2012-01-20 08:38 971Android arm linux kernel启动流程(二) ... -
enum总结
2012-01-20 08:38 676enum总结 2011年03月11日 ... -
windows下进程间通信的
2012-01-20 08:38 732windows下进程间通信的 2010年09月04日 w ... -
solaris性能监控(all)
2012-01-20 08:38 1207solaris性能监控(all) 2010年11月14日 ... -
中小企业网络构建 样题
2012-01-17 03:34 682中小企业网络构建 样题 ... -
C# 路径,文件,目录,IO常见问题汇总 - wxbjs - 博客园
2012-01-17 03:33 773C# 路径,文件,目录,IO常 ... -
java.io 类 ObjectInputStream
2012-01-17 03:33 791java.io 类 ObjectInputStream 20 ... -
as3面试题
2012-01-17 03:33 1871as3面试题 2011年09月13日 ... -
关于时尚美古装摄影
2012-01-16 02:09 654关于时尚美古装摄影 20 ... -
民间美术与民俗的关系
2012-01-16 02:09 989民间美术与民俗的关系 2011年02月27日 ... -
古代武林术语词典
2012-01-16 02:09 708古代武林术语词典 2009 ... -
百 家 讲 坛目录
2012-01-16 02:09 740百 家 讲 坛目录 2010年04月11日 当茶遇到 ... -
拐个相公回未来(穿越到古代)
2012-01-16 02:08 1059拐个相公回未来(穿越到古代) 2009年08月29日 ...
相关推荐
java 导入导出excel的api,jar包,还有实例 java 导入导出excel的api,jar包,还有实例 java 导入导出excel的api,jar包,还有实例
导入导出Excel java实现实例。 本人自己学习jxl的程序实例,可运行。
一个实用的java导入导出Excel工具类,基于开源的Java Excel API(JXL)纯java类库实现,Windows和Linux系统下均可使用。 主要实现功能如下: 导出:将List转化为Excel(listToExcel)。 导入:将Excel转化为List...
本人工作中自己写的一个excel工具类,可以单独打包成jar,作为公共模块使用。 使用它可以直接不用关心poi的api。导入导出,轻轻松松。 使用方法请关注一下,cn.com.flaginfo.biz.excel.test 包下面的Test类。
EXCEL文件导入:JAVA+EXCEL+API简介 实现excel的导入导出
该文件用于在项目过程中导出Excel表格
一个实用的java导入导出Excel工具类,基于开源的Java Excel API(JXL)纯java类库实现。
该文件中包含了所有java项目中针对excel导入导出所需的jar包集合。 -------------------------------------- 将该zip解压后,将jar包加入到自己的项目中,可以直接通过poi的api在excel和项目数据进行导入导出。 应用...
在网上找的一个可以导出和导入Excel的包,里面还有源码,以及API文档,当你想要导出报表为Excel时,是一个很不错的工具!
java 导入导出Word、excel的Jar包+例子,函API,及部分Demo
它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet...
最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。 搭建环境 将下载后的文件解包...
适合各种java根据模板导入导出excel,代码已经做了封装,根据api设置条件导入导出各种各样的模板,也可以根据各种各样的模板进行导入数据
基于Java Excel API的数据库数据导入导出方法研究与实现.pdf
是一款基于 Java 平台,支持批量创建、导入/导出Excel文件的服务端表格组件API, 支持导出是自定义表格样式,合并单元格等操作,可以很方便的把数据库记录通过excel 表格导出。同时通过接口可以很方便的将excel 中的...
EXCEL文件导入:JAVA+EXCEL+API简介实现excel的导入导出
java Excel Api 为对excel的操作提供了方便的API,实现了java对excel的操作,可以实现将数据导入到excel表中。
java excel导入导出的示例代码,包括ImportExl.java ExportExl.java和api说明文档,以及用到的jar包
POI 提供API给Java程序对Microsoft Office格式档案读和写的功能,尤其是在操作Excel文档上面。本例采用javabean + 注解的方式,对POI进行了封装,旨在针对不同的Excel文档用同样的方法处理,已到达代码的重复利用。...
java程序对excel表格的导入和导出操作,以及对excel表格的字体、单元格格式的相关设置,合并行,合并列