﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-落叶归根-文章分类-Jakarta POI</title><link>http://www.blogjava.net/allan-oy/category/7089.html</link><description>一个人首先要尊重别人，然后才能得到别人的尊重；一个人首先要对自己负责，然后才有资格去对别人负责。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:09:55 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:09:55 GMT</pubDate><ttl>60</ttl><item><title>POI HSSF 操作MS Excel简述</title><link>http://www.blogjava.net/allan-oy/articles/28429.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Wed, 18 Jan 2006 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/28429.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/28429.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/28429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/28429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/28429.html</trackback:ping><description><![CDATA[<CENTER><B><FONT size=5>POI HSSF 操作MS Excel简述</FONT></B></CENTER><BR>POI HSSF是一个专门操作EXCEL的java包，可通过纯java操作xls文件。<BR>POI HSSF的类文件都放在在org.apache.poi.hssf包下，通过此包中的类就可实现用java操作Excel文件了。<BR>下面是用POI HSSF操作Excel文件的方法简述：<BR><BR>一， 建立Excel工作薄<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR><BR>二， 建立Excel工作表，每个工作表对应的是Excel界面左下角的一个标签sheet1，sheet2 …<BR>HSSFSheet sheet1 = wb.createSheet("new sheet");<BR><BR>三， 在工作表中建立单元格<BR><BR>//首先，建立行对像，行号作为参数传给createRow方法，第一行由0开始计算。<BR>HSSFRow row = sheet.createRow((short)0);<BR><BR>//建单元格<BR>HSSFCell cell = row.createCell((short)0);<BR><BR>//给单元格赋值<BR>cell.setCellValue(1);<BR><BR>//也可同一行内完成建立单元格和赋值<BR>row.createCell((short)1).setCellValue(1.2);<BR>row.createCell((short)2).setCellValue("This is a string");<BR>row.createCell((short)3).setCellValue(true);<BR><BR>//数据格式可通过创建单元格值时默认如上面所视<BR>//也可以创建单元格后调用setCellType指定<BR>cell.setCellType(CELL_TYPE_NUMERIC);<BR><BR>四， 向单元格插入日期值<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>HSSFSheet sheet = wb.createSheet("new sheet");<BR><BR>// 可通过Sheet.setSheetName(sheetindex,"SheetName",encoding)设定工作表名<BR><BR>// 创建新行并向其加入单元格，行号由0开始。<BR>HSSFRow row = sheet.createRow((short)0);<BR><BR>// 创建一个单元格并向其输入一日期值，但这第一个单元格并非是日期格式。<BR>HSSFCell cell = row.createCell((short)0);<BR>cell.setCellValue(new Date());<BR><BR>// 我们将这第二个单元格改成日期格式，这需要从工作薄创建一个新的单元格格式，这可// 以只影响当前建立的一个单元格。<BR>HSSFCellStyle cellStyle = wb.createCellStyle();<BR>cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));<BR>cell = row.createCell((short)1);<BR>cell.setCellValue(new Date());<BR>cell.setCellStyle(cellStyle);<BR><BR>五， 各种单元格样式<BR>HSSFCellStyle cellStyle = wb.createCellStyle();<BR>//对齐<BR>cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);<BR><BR>//带边框<BR>cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);<BR><BR>//颜色与填充样式<BR>cellStyle.setFillBackgroundColor(HSSFColor.AQUA.index);<BR>cellStyle.setFillPattern(HSSFCellStyle.BIG_SPOTS);<BR>cellStyle.setFillForegroundColor(HSSFColor.ORANGE.index);<BR>cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<BR><BR>六， 行高,列宽。<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>HSSFSheet sheet = wb.createSheet("new sheet");<BR>HSSFRow row = sheet.createRow((short)0);<BR><BR>//2是行高值<BR>row.setRowHeight(2);<BR><BR>//3是列号，4是列宽值<BR>sheet.setColumnWidth(3, 4);<BR><BR><BR>七，例程<BR><BR>首先调用一个方法将Oracle数据库中的数据取出，放到List实例中，这里我调用了srrd项目中ProductData类的listProductQuery()取得一个List实例。List中的对象是一系列名为ProductQuery实体类的实例。然后读List，将ProductQuery实例中的数据取出放到HSSFCell单元格中。最后将HSSFWorkbook中的数据输出到输出流，完成数据导出。<BR><BR>//建工作薄<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>//建名为example的工作表<BR>HSSFSheet sheet = wb.createSheet("example");<BR>//给工作表前8列定义列宽<BR>sheet.setColumnWidth((short)0,(short)2500);<BR>sheet.setColumnWidth((short)1,(short)6000);<BR>sheet.setColumnWidth((short)2,(short)3500);<BR>sheet.setColumnWidth((short)3,(short)9000);<BR>sheet.setColumnWidth((short)4,(short)8000);<BR>sheet.setColumnWidth((short)5,(short)8000);<BR>sheet.setColumnWidth((short)6,(short)20000);<BR>sheet.setColumnWidth((short)7,(short)8000);<BR>//在表中建行<BR>HSSFRow row = sheet.createRow(0);<BR>//建立单元格 <BR>HSSFCell cell[] = new HSSFCell[8];<BR>for (short i = 0; i &lt; 8; i++) {<BR>cell[i] = row.createCell(i);<BR>//将单元格定义成UTF_16编码，这样才能使输出数据不会乱码<BR>cell[i].setEncoding(HSSFCell.ENCODING_UTF_16);<BR>}<BR>//写单元格标题<BR>cell[0].setCellValue("登记ID");<BR>cell[1].setCellValue("登记号");<BR>cell[2].setCellValue("所在地市ID");<BR>cell[3].setCellValue("产品中文名");<BR>cell[4].setCellValue("产品英文名");<BR>cell[5].setCellValue("产品服务对象");<BR>cell[6].setCellValue("产品功能描述");<BR>cell[7].setCellValue("产品类别");<BR>//查询数据库，取得数据列表的List实例<BR>List list = new ArrayList();<BR>ProductDataManager mgr = new ProductDataManager();<BR>try {<BR>list = mgr.listProductQuery("","", "", "", "", "1999-2-1", "2004-2-1");<BR>} catch (SrrdException e) {<BR>e.printStackTrace(); <BR>}<BR>//从List中取出数据放入工作表中<BR>if (list != null &amp;&amp; list.size() &gt; 0) {<BR>for (int i = 0; i &lt; list.size() - 1; i++) {<BR>ProductQuery query = (ProductQuery) list.get(i);<BR>HSSFRow datarow = sheet.createRow(i + 1);<BR>HSSFCell data[] = new HSSFCell[8];<BR>for (short j = 0; j &lt; 8; j++) {<BR>data[j] = datarow.createCell(j);<BR>//将单元格定义成UTF_16编码，这样才能使输出数据不会乱码<BR>data[j].setEncoding(HSSFCell.ENCODING_UTF_16);<BR>}<BR>data[0].setCellValue(query.getCertId());<BR>data[1].setCellValue(query.getCertNum());<BR>data[2].setCellValue(query.getCityCode());<BR>data[3].setCellValue(query.getSoftWareCname());<BR>data[4].setCellValue(query.getSoftWareEname());<BR>data[5].setCellValue(query.getSoftwareFor());<BR>data[6].setCellValue(query.getSoftwareFuncDesc());<BR>data[7].setCellValue(query.getSoftwareType());<BR>}<BR>}<BR>//将工作薄输出到输出流<BR>ServletOutputStream sos=response.getOutputStream();<BR>wb.write(sos);<BR>sos.close();<BR><BR>//也可输出成xls文件<BR>File file = new File("workbook.xls");<BR>try {<BR>FileOutputStream fileOut = new FileOutputStream(file);<BR>wb.write(fileOut);<BR>fileOut.close();<BR>} catch (IOException e) {<BR>e.printStackTrace(); <BR>}<BR>摘自：<A href="http://java.mblogger.cn/elune/posts/15242.aspx">http://java.mblogger.cn/elune/posts/15242.aspx</A><img src ="http://www.blogjava.net/allan-oy/aggbug/28429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-01-18 10:04 <a href="http://www.blogjava.net/allan-oy/articles/28429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用POI中的HSSF创建Excel文件</title><link>http://www.blogjava.net/allan-oy/articles/28328.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Tue, 17 Jan 2006 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/28328.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/28328.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/28328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/28328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/28328.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD><FONT size=3>使用POI中的HSSF创建Excel文件</FONT><BR><FONT size=3>打印来源:http://www.cn-java.com</FONT> 
<HR>
</TD></TR>
<TR>
<TD><FONT size=2>作者:孤魂一笑(bingo_ge@hotmail.com) 日期：2003-05-05<BR><BR>介绍:<BR>Jakarta_POI 使用Java读写Excel(97-2002)文件，可以满足大部分的需要。<BR>因为刚好有一个项目使用到了这个工具，花了点时间顺便翻译了一下POI本身<BR>带的一个Guide.有一些节减和修改，希望给使用这个项目的人一些入门帮助。<BR>POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页<BR>http://jakarta.apache.org/poi/hssf/index.html<BR>下面的介绍是基于以下地址的翻译：<BR>http://jakarta.apache.org/poi/hssf/quick-guide.html<BR>目前的版本为1.51应该是很长时间之内的一个稳定版，但HSSF提供的Sample不是基于<BR>1.51所写，所以使用的时候需要适当的注意.<BR>其实POI下面的几个子项目侧重不同读写 Word 的HDF正在开发当中.<BR>XML下的FOP(http://xml.apache.org/fop/index.html)<BR>可以输出pdf文件，也是比较好的一个工具<BR>目录:<BR>创建一个workbook<BR>创建一个sheet<BR>创建cells<BR>创建日期cells<BR>设定单元格格式<BR><BR>说明：<BR>以下可能需要使用到如下的类<BR>import org.apache.poi.hssf.usermodel.HSSFCell;<BR>import org.apache.poi.hssf.usermodel.HSSFCellStyle;<BR>import org.apache.poi.hssf.usermodel.HSSFDataFormat;<BR>import org.apache.poi.hssf.usermodel.HSSFFont;<BR>import org.apache.poi.hssf.usermodel.HSSFRow;<BR>import org.apache.poi.hssf.usermodel.HSSFSheet;<BR>import org.apache.poi.hssf.usermodel.HSSFWorkbook;<BR>import org.apache.poi.hssf.util.HSSFColor;<BR><BR>创建workbook<BR><BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>//使用默认的构造方法创建workbook<BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR>//指定文件名<BR>wb.write(fileOut);<BR>//输出到文件<BR>fileOut.close();<BR><BR>创建一个sheet<BR><BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>HSSFSheet sheet1 = wb.createSheet("new sheet");<BR>//workbook创建sheet<BR>HSSFSheet sheet2 = wb.createSheet("second sheet");<BR>//workbook创建另外的sheet<BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR>wb.write(fileOut);<BR>fileOut.close();<BR><BR>创建cells<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>HSSFSheet sheet = wb.createSheet("new sheet");<BR>//注意以下的代码很多方法的参数是short 而不是int 所以需要做一次类型转换<BR>HSSFRow row = sheet.createRow((short)0);<BR>//sheet 创建一行<BR>HSSFCell cell = row.createCell((short)0);<BR>//行创建一个单元格<BR>cell.setCellValue(1);<BR>//设定单元格的值<BR>//值的类型参数有多中double ,String ,boolean,<BR>row.createCell((short)1).setCellValue(1.2);<BR>row.createCell((short)2).setCellValue("This is a string");<BR>row.createCell((short)3).setCellValue(true);<BR><BR>// Write the output to a file<BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR>wb.write(fileOut);<BR>fileOut.close();<BR><BR>创建日期cells<BR>HSSFWorkbook wb = new HSSFWorkbook();<BR>HSSFSheet sheet = wb.createSheet("new sheet");<BR><BR>HSSFRow row = sheet.createRow((short)0);<BR><BR>HSSFCell cell = row.createCell((short)0);<BR>//设定值为日期<BR>cell.setCellValue(new Date());<BR><BR>HSSFCellStyle cellStyle = wb.createCellStyle();<BR>//指定日期显示格式<BR>cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));<BR>cell = row.createCell((short)1);<BR>cell.setCellValue(new Date());<BR>//设定单元格日期显示格式<BR>cell.setCellStyle(cellStyle);<BR><BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR>wb.write(fileOut);<BR>fileOut.close();<BR><BR><BR>设定单元格格式<BR>单元格格式的设定有很多形式包括单元格的对齐方式，内容的字体设置，<BR>单元格的背景色等，因为形式比较多，只举一些例子.以下的例子在<BR>POI1.5中可能会有所改变具体查看API.<BR>..........<BR>// Aqua background<BR>HSSFCellStyle style = wb.createCellStyle();<BR>//创建一个样式<BR>style.setFillBackgroundColor(HSSFCellStyle.AQUA);<BR>//设定此样式的的背景颜色填充<BR>style.setFillPattern(HSSFCellStyle.BIG_SPOTS);<BR><BR>//样式的填充类型。<BR>//有多种式样如:<BR>//HSSFCellStyle.BIG_SPOTS<BR>//HSSFCellStyle.FINE_DOTS<BR>//HSSFCellStyle.SPARSE_DOTS等<BR>style.setAlignment(HSSFCellStyle.ALIGN_CENTER );<BR>//居中对齐<BR>style.setFillBackgroundColor(HSSFColor.GREEN.index);<BR>//设定单元个背景颜色<BR>style.setFillForegroundColor(HSSFColor.RED.index);<BR>//设置单元格显示颜色<BR>HSSFCell cell = row.createCell((short) 1);<BR>cell.setCellValue("X");<BR>cell.setCellStyle(style);<BR><BR></FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/allan-oy/aggbug/28328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-01-17 18:42 <a href="http://www.blogjava.net/allan-oy/articles/28328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakata Poi HSSF：纯java的Excel解决方案</title><link>http://www.blogjava.net/allan-oy/articles/28327.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Tue, 17 Jan 2006 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/28327.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/28327.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/28327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/28327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/28327.html</trackback:ping><description><![CDATA[<FONT size=5><STRONG>Jakata Poi HSSF：纯java的Excel解决方案</STRONG></FONT><BR>微软在桌面系统上的成功，令我们不得不大量使用它的办公产品，如：Word，Excel。时至今日，它的源代码仍然不公开已封锁了我们的进一步应用和开发。然而在要求更高的服务器领域，微软本身的产品移植性不好，&nbsp;&nbsp;<BR>性能不佳。在我们实际的开发中，表现层的解决方案虽然有多样，但是Ie浏览器已成为最多人使用的浏览器，因为大家都用Windows。在企业办公系统中，常常有客户这样子要求：你要把我们的报表直接用Excel打开。或者是：我们已经习惯用Excel打印。这样子如果用.net开发是没有问题的，但是有j2ee这个比.net更有前途的开放式的开发环境，难道我为了解决打印的要求去另写客户端的控件？或者在服务器端使用本地代码？第一种方案的问题是关键数据的处理有时候不能在客户端做，第2种方案的问题是牺牲了代码的可移植性和稳定性。如果让客户端只负责处理生成好的报表，那将是一种诱人的选择。<BR><BR>Apache的Jakata项目的POI子项目，目标是处理ole2对象。目前比较成熟的是HSSF接口，处理MS Excel（97-2002）对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西，而是真正的Excel对象，你可以控制一些属性如sheet,cell等等。这是一个年轻的项目，所以象HDF这样直接支持Word对象的好东西仍然在设计中。其它支持word格式的纯java方案还有itext，不过也是仍在奋斗中。但是HSSF已经成熟到能够和足够我们使用了。另外，无锡永中Office的实现方案也是纯java的解决方案，不过那也是完全商业的产品，并不是公开代码项目。其实，从开发历史的角度讲，在80年代中期starOffice的原作者在德国成立了StarOffice suite公司，然后到1999年夏天starOffice被sun收购，再到2000年6月starOffice5.2的发布；并且从starOffice6.0开始，starOffice建立在OpenOffice的api的基础上，这个公开代码的office项目已经进行了很长的时间。虽然那是由C++写的，但是POI的代码部分也是由openOffice改过来的。所以，应该对POI充满足够的信心。国内已经有部分公司在他们的办公自动化等Web项目中使用poi了，如日恒的ioffice，海泰的HTOffice等。<BR><BR>java当初把核心处理设成Unicode，带来的好处是另代码适应了多语言环境。然而由于老外的英语只有26个字母，有些情况下，一些程序员用8位的byte处理，一不小心就去掉了CJK的高位。或者是由于习惯在程序中采用硬编码，还有多种原因，使得许多java应用在CJK的处理上很烦恼。还好在POI HSSF中考虑到这个问题，可以设置encoding为双字节。<BR><BR>POI可以到www.apache.org下载到。编译好的jar主要有这样4个：poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时，需要有poi包就可以了。如果用Jakarta ant编译和运行，下载apache Jakarta POI的release中的src包，它里面已经为你生成好了build文件了。只要运行ant就可以了(ant 的安装和使用在此不说了)。如果是用Jbuilder 运行，请在新建的项目中加入poi包。以Jbuilder6为例，选择Tools菜单项的config libraries...选项，新建一个lib。在弹出的菜单中选择poi包，如这个jakarta-poi-1.5.1-final-20020820.jar，把poi添加到jbuilder中。然后，右键点击你的项目，在project的properties菜单中path的required Libraries中，点add，添加刚才加入到jbuilder中的poi到你现在的项目中。如果你仅仅是为了熟悉POI hssf的使用，可以直接看POI的samples包中的源代码，并且运行它。hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中，共有14个，生成的目标xls都是workbook.xls。如果你想看更多的例程，可以参考hssf的Junit test cases，在poi的包的源代码中有。hssf都有测试代码。<BR><BR>这里只对部分例程的实现做介绍。<BR><BR>HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象，样式和格式，还有辅助操作。有以下几种对象：<BR><BR>HSSFWorkbook excell的文档对象<BR><BR>HSSFSheet excell的表单<BR><BR>HSSFRow excell的行 <BR><BR>HSSFCell excell的格子单元<BR><BR>HSSFFont excell字体<BR><BR>HSSFName 名称<BR><BR>HSSFDataFormat 日期格式<BR><BR>在poi1.7中才有以下2项：<BR><BR>HSSFHeader sheet头<BR><BR>HSSFFooter sheet尾<BR><BR>和这个样式<BR><BR>HSSFCellStyle cell样式<BR><BR>辅助操作包括<BR><BR>HSSFDateUtil 日期<BR><BR>HSSFPrintSetup 打印 <BR><BR>HSSFErrorConstants 错误信息表<BR><BR>仔细看org.apache.poi.hssf包的结构，不难发现HSSF的内部实现遵循的是MVC模型。<BR><BR>这里我用Rose把org.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理，详见下面两图：<BR><BR><IMG onmouseover=javascript:imgShowTip(this); style="DISPLAY: inline" onclick=javascript:imgClick(this); alt=image src="http://www.matrix.org.cn/resource/article/upload/article/a2005512101549.jpg" onload=javascript:imgLoad(this); border=0><BR><BR>图1 基本对象 <BR><BR>从中不难可以发现每一个基本对象都关联了一个Record对象。Record对象是一个参考Office格式的相关记录。<BR><BR>&nbsp;&nbsp;<IMG onmouseover=javascript:imgShowTip(this); style="DISPLAY: inline" onclick=javascript:imgClick(this); alt=image src="http://www.matrix.org.cn/resource/article/upload/article/2005512101631.jpg" onload=javascript:imgLoad(this); border=0><BR><BR><BR>图2 HSSFWorkbook<BR><BR>HSSFWorkbook即是一个Excell对象。这幅类图体现的是HSSFWorkbook和基本对象的相互关系。可见，许多对象中也建立了Workbook的引用。还需要注意的是在HSSFWorkbook和HSSFSheet中建立了log机制POILogger，而且POILogger也是使用apache Log4J实现的。<BR><BR>先看poi的examples包中提供的最简单的例子，建立一个空xls文件。<BR><BR>import org.apache.poi.hssf.usermodel.HSSFWorkbook;<BR><BR>import java.io.FileOutputStream;<BR><BR>import java.io.IOException;<BR><BR>public class NewWorkbook<BR><BR>{<BR><BR>public static void main(String[] args)<BR><BR>throws IOException<BR><BR>{<BR><BR>HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象<BR><BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR><BR>wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中<BR><BR>fileOut.close();<BR><BR>}<BR><BR>}<BR><BR>通过这个例子，我们建立的是一个空白的xls文件（不是空文件）。在此基础上，我们可以进一步看其它的例子。<BR><BR><BR>import org.apache.poi.hssf.usermodel.*;<BR><BR>import java.io.FileOutputStream;<BR><BR>import java.io.IOException;<BR><BR>public class CreateCells<BR><BR>{<BR><BR>public static void main(String[] args)<BR><BR>throws IOException<BR><BR>{<BR><BR>HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象<BR><BR>HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象<BR><BR><BR>// Create a row and put some cells in it. Rows are 0 based.<BR><BR>HSSFRow row = sheet.createRow((short)0);//建立新行<BR><BR>// Create a cell and put a value in it.<BR><BR>HSSFCell cell = row.createCell((short)0);//建立新cell<BR><BR>cell.setCellValue(1);//设置cell的整数类型的值<BR><BR><BR>// Or do it on one line.<BR><BR>row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值<BR><BR>row.createCell((short)2).setCellValue("test");//设置cell字符类型的值<BR><BR>row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值 <BR><BR>HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式<BR><BR>cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式<BR><BR>HSSFCell dCell =row.createCell((short)4);<BR><BR>dCell.setCellValue(new Date());//设置cell为日期类型的值<BR><BR>dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式<BR><BR>HSSFCell csCell =row.createCell((short)5);<BR><BR>csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断<BR><BR>csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串<BR><BR>row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell<BR><BR><BR>// Write the output to a file<BR><BR>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<BR><BR>wb.write(fileOut);<BR><BR>fileOut.close();<BR><BR>}<BR><BR>}<BR><BR>我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子，我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。尤其要注意的是如果你想正确的显示非欧美的字符时，尤其象中日韩这样的语言，必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16，才能保证字符的高8位不被截断而引起编码失真形成乱码。<BR><BR>其他测试可以通过参考examples包中的测试例子掌握poi的详细用法，包括字体的设置，cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目，所以有些功能正在不断的扩充。如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的，而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。<BR><BR>另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现HSSFListener完成从普通流认知Xls中包含的内容，在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2是基于事件的，所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。<BR><BR>因为POI还不是一个足够成熟的项目，所以有必要做进一步的开发和测试。但是它已经为我们用纯java操作ole2对象提供了可能，而且克服了ole对象调用的缺陷，提供了服务器端的Excel解决方案。<BR>&nbsp;<STRONG>摘自</STRONG>：<A href="http://www.matrix.org.cn/resource/article/1/1528.html">http://www.matrix.org.cn/resource/article/1/1528.html</A><img src ="http://www.blogjava.net/allan-oy/aggbug/28327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-01-17 18:22 <a href="http://www.blogjava.net/allan-oy/articles/28327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA操作Excel电子表格</title><link>http://www.blogjava.net/allan-oy/articles/28317.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Tue, 17 Jan 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/28317.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/28317.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/28317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/28317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/28317.html</trackback:ping><description><![CDATA[<FONT size=5><STRONG>JAVA操作Excel电子表格</STRONG></FONT><BR>只要有表格，就会有Microsoft Excel，用Microsoft Excel处理数据已成为不少人的习惯。Jakarta POI API就为Java程序员提供了一条存取Microsoft文档格式的神奇之路，其中最成熟的就是能存取Microsoft Excel文档的HSSF API。<BR><BR>　　本篇文章就举例示范如何利用Java 创建和读取Excel文档，并设置单元格的字体和格式。 <BR><BR>　　为了保证示例程序的运行，必须安装Java 2 sdk1.4.0 和Jakarta POI，Jakarta POI的Web站点是: http://jakarta.apache.org/poi/ <BR><BR>　　创建Excel 文档<BR><BR>　　示例1将演示如何利用Jakarta POI API 创建Excel 文档。 <BR><BR>　　示例1程序如下：<BR><BR>import org.apache.poi.hssf.usermodel.HSSFWorkbook;<BR>import org.apache.poi.hssf.usermodel.HSSFSheet;<BR>import org.apache.poi.hssf.usermodel.HSSFRow;<BR>import org.apache.poi.hssf.usermodel.HSSFCell;<BR>import java.io.FileOutputStream;<BR>public class CreateXL {<BR><BR>　/** Excel 文件要存放的位置，假定在D盘JTest目录下*/<BR><BR>　public static String outputFile="D:/JTest/ gongye.xls";<BR><BR>　public static void main(String argv[]){<BR><BR>　try{<BR><BR>　　// 创建新的Excel 工作簿<BR><BR>　　HSSFWorkbook workbook = new HSSFWorkbook();<BR><BR>　　// 在Excel工作簿中建一工作表，其名为缺省值<BR>　　　　　　// 如要新建一名为"效益指标"的工作表，其语句为：<BR>　　　　　　// HSSFSheet sheet = workbook.createSheet("效益指标");<BR><BR>　　HSSFSheet sheet = workbook.createSheet();<BR><BR>　　// 在索引0的位置创建行（最顶端的行）<BR><BR>　　HSSFRow row = sheet.createRow((short)0);<BR><BR>　　//在索引0的位置创建单元格（左上端）<BR>　　HSSFCell cell = row.createCell((short) 0);<BR>　　// 定义单元格为字符串类型<BR>　　cell.setCellType(HSSFCell.CELL_TYPE_STRING);<BR>　　// 在单元格中输入一些内容<BR>　　cell.setCellValue("增加值");<BR>　　// 新建一输出文件流<BR>　　FileOutputStream fOut = new FileOutputStream(outputFile);<BR>　　// 把相应的Excel 工作簿存盘<BR>　　workbook.write(fOut);<BR>　　fOut.flush();<BR>　　// 操作结束，关闭文件<BR>　　fOut.close();<BR>　　System.out.println("文件生成...");<BR><BR>　}catch(Exception e) {<BR>　　System.out.println("已运行 xlCreate() : " + e );<BR>　}<BR>}<BR>}<BR>　　读取Excel文档中的数据<BR><BR>　　示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为gongye.xls的Excel文件。<BR><BR>　　示例2程序如下：<BR><BR>import org.apache.poi.hssf.usermodel.HSSFWorkbook;<BR>import org.apache.poi.hssf.usermodel.HSSFSheet;<BR>import org.apache.poi.hssf.usermodel.HSSFRow;<BR>import org.apache.poi.hssf.usermodel.HSSFCell;<BR>import java.io.FileInputStream;<BR>public class ReadXL {<BR>　/** Excel文件的存放位置。注意是正斜线*/<BR>　public static String fileToBeRead="D:/JTest/ gongye.xls";<BR>　public static void main(String argv[]){ <BR>　try{<BR>　　// 创建对Excel工作簿文件的引用<BR>　　HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));<BR>　　// 创建对工作表的引用。<BR>　　// 本例是按名引用（让我们假定那张表有着缺省名"Sheet1"）<BR>　　HSSFSheet sheet = workbook.getSheet("Sheet1");<BR>　　// 也可用getSheetAt(int index)按索引引用，<BR>　　// 在Excel文档中，第一张工作表的缺省索引是0，<BR>　　// 其语句为：HSSFSheet sheet = workbook.getSheetAt(0);<BR>　　// 读取左上端单元<BR>　　HSSFRow row = sheet.getRow(0);<BR>　　HSSFCell cell = row.getCell((short)0);<BR>　　// 输出单元内容，cell.getStringCellValue()就是取所在单元的值<BR>　　System.out.println("左上端单元是： " + cell.getStringCellValue()); <BR>　}catch(Exception e) {<BR>　　System.out.println("已运行xlRead() : " + e );<BR>　}<BR>}<BR>}<BR>　　设置单元格格式<BR><BR>　　在这里，我们将只介绍一些和格式设置有关的语句，我们假定workbook就是对一个工作簿的引用。在Java中，第一步要做的就是创建和设置字体和单元格的格式，然后再应用这些格式：<BR><BR>　　1、创建字体，设置其为红色、粗体：<BR><BR><FONT face="Times New Roman">HSSFFont font = workbook.createFont();<BR>font.setColor(HSSFFont.COLOR_RED);<BR>font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);<BR></FONT>　　2、创建格式<BR><BR>HSSFCellStyle cellStyle= workbook.createCellStyle();<BR>cellStyle.setFont(font);<BR>　　3、应用格式 <BR><BR>HSSFCell cell = row.createCell((short) 0);<BR>cell.setCellStyle(cellStyle);<BR>cell.setCellType(HSSFCell.CELL_TYPE_STRING);<BR>cell.setCellValue("标题 ");　　<BR><BR><STRONG>摘自</STRONG>：<A href="http://www.chinaitpower.com/2005September/2005-09-13/207206.html">http://www.chinaitpower.com/2005September/2005-09-13/207206.html</A><img src ="http://www.blogjava.net/allan-oy/aggbug/28317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-01-17 16:59 <a href="http://www.blogjava.net/allan-oy/articles/28317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java中读取Excel文件的内容和导出数据到Excel文件中</title><link>http://www.blogjava.net/allan-oy/articles/28310.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Tue, 17 Jan 2006 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/28310.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/28310.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/28310.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/28310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/28310.html</trackback:ping><description><![CDATA[转自www.chianjavaworld.net<BR><BR>原作者：SonyMusic<BR>读：rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr<BR>在Java中读取Excel文件的内容<BR>在这里，我使用的是一个叫Java Excel API的东西，类似的还有jakarta的POI，不过感觉那个<BR>太复杂了点儿。而且jxl对中文的支持相当的好，至少我在用的过程中一点问题没出。<BR><BR>一、下载地址<BR>http://www.andykhan.com/jexcelapi/<BR><BR>二、特性<BR>可以读取Excel 95, 97, 2000文件<BR>可以读或写Excel 97及其以后版本的的公式（不过我发现好像有bug）<BR>生成Excel 97格式的电子表格<BR>支持字体、数字和日期格式化<BR>支持单元格的颜色和阴影<BR>可以编辑现有的文件 <BR><BR>三、读文件<BR>//声明一下，记得后面要关闭哦。。<BR>Workbook workbook = null;<BR><BR>try {<BR>&nbsp;&nbsp; workbook = Workbook.getWorkbook(new File("d:\\temp\\TestRead.xls"));<BR>} catch (Exception e) {<BR>&nbsp;&nbsp; throw new Exception("file to import not found!");<BR>}<BR><BR>Sheet sheet = workbook.getSheet(0);<BR>Cell cell = null;<BR><BR>int columnCount=3;<BR>int rowCount=sheet.getRows();<BR>for (int i = 0; i &lt;rowCount; i++) {<BR>&nbsp;&nbsp; for (int j = 0; j &lt;columnCount; j++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意，这里的两个参数，第一个是表示列的，第二才表示行<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell=sheet.getCell(j, i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //要根据单元格的类型分别做处理，否则格式化过的内容可能会不正确<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cell.getType()==CellType.NUMBER){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(((NumberCell)cell).getValue());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(cell.getType()==CellType.DATE){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(((DateCell)cell).getDate());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(cell.getContents());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.print(cell.getContents());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("\t");<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; System.out.print("\n");<BR>}<BR>//关闭它，否则会有内存泄露<BR>workbook.close();<BR><BR><BR>写：wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww<BR>在Java中向Excel文件写入内容<BR><BR><BR>四、导出数据到Excel文件中<BR>下面的例子，设置了数字、日期的格式，还有字体，颜色等。<BR><BR>File tempFile=new File("d:/temp/output.xls");<BR>WritableWorkbook workbook = Workbook.createWorkbook(tempFile);<BR>WritableSheet sheet = workbook.createSheet("TestCreateExcel", 0); <BR><BR>//一些临时变量，用于写到excel中<BR>Label l=null;<BR>jxl.write.Number n=null;<BR>jxl.write.DateTime d=null;<BR><BR>//预定义的一些字体和格式，同一个Excel中最好不要有太多格式<BR>WritableFont headerFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLUE); <BR>WritableCellFormat headerFormat = new WritableCellFormat (headerFont); <BR><BR>WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.RED); <BR>WritableCellFormat titleFormat = new WritableCellFormat (titleFont); <BR><BR>WritableFont detFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLACK); <BR>WritableCellFormat detFormat = new WritableCellFormat (detFont); <BR><BR>NumberFormat nf=new NumberFormat("0.00000");&nbsp;&nbsp;//用于Number的格式<BR>WritableCellFormat priceFormat = new WritableCellFormat (detFont, nf); <BR><BR>DateFormat df=new DateFormat("yyyy-MM-dd");//用于日期的<BR>WritableCellFormat dateFormat = new WritableCellFormat (detFont, df); <BR><BR>//剩下的事情，就是用上面的内容和格式创建一些单元格，再加到sheet中<BR>l=new Label(0, 0, "用于测试的Excel文件", headerFormat);<BR>sheet.addCell(l);<BR><BR>//add Title<BR>int column=0;<BR>l=new Label(column++, 2, "标题", titleFormat);<BR>sheet.addCell(l);<BR>l=new Label(column++, 2, "日期", titleFormat);<BR>sheet.addCell(l);<BR>l=new Label(column++, 2, "货币", titleFormat);<BR>sheet.addCell(l);<BR>l=new Label(column++, 2, "价格", titleFormat);<BR>sheet.addCell(l);<BR><BR>//add detail<BR>int i=0;<BR>column=0;<BR>l=new Label(column++, i+3, "标题 "+i, detFormat);<BR>sheet.addCell(l);<BR>d=new DateTime(column++, i+3, new java.util.Date(), dateFormat);<BR>sheet.addCell(d);<BR>l=new Label(column++, i+3, "CNY", detFormat);<BR>sheet.addCell(l);<BR>n=new jxl.write.Number(column++, i+3, 5.678, priceFormat);<BR>sheet.addCell(n);<BR><BR>i++;<BR>column=0;<BR>l=new Label(column++, i+3, "标题 "+i, detFormat);<BR>sheet.addCell(l);<BR>d=new DateTime(column++, i+3, new java.util.Date(), dateFormat);<BR>sheet.addCell(d);<BR>l=new Label(column++, i+3, "SGD", detFormat);<BR>sheet.addCell(l);<BR>n=new jxl.write.Number(column++, i+3, 98832, priceFormat);<BR>sheet.addCell(n);<BR><BR>//设置列的宽度<BR>column=0;<BR>sheet.setColumnView(column++, 20);<BR>sheet.setColumnView(column++, 20);<BR>sheet.setColumnView(column++, 10);<BR>sheet.setColumnView(column++, 20);<BR><BR>workbook.write();<BR>workbook.close();<BR><img src ="http://www.blogjava.net/allan-oy/aggbug/28310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-01-17 16:04 <a href="http://www.blogjava.net/allan-oy/articles/28310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>