POI与Struts2的使用 poi-2.5.1.jar【转】

一.POI 简介 

Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API

目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

二.HSSF概况 

HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

三.开始编码

可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi / 最新的POI 工具包

HSSFWorkbook excell 文档对象介绍 
HSSFSheet excell的表单 
HSSFRow excell的行 
HSSFCell excell的格子单元 
HSSFFont excell字体 
HSSFName 名称 
HSSFDataFormat 日期格式 
在poi1.7中才有以下2项: 
HSSFHeader sheet头 
HSSFFooter sheet尾 
和这个样式 
HSSFCellStyle cell样式 
辅助操作包括 
HSSFDateUtil 日期 
HSSFPrintSetup 打印 
HSSFErrorConstants 错误信息表

(以上部分转自http://ltc603.iteye.com/blog/30184)

在我们在Service编写操作如下:

Java代码  

  1. package com.mengya.service.imple;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.util.List;
  10. import org.apache.commons.lang.RandomStringUtils;
  11. import org.apache.poi.hssf.usermodel.HSSFCell;
  12. import org.apache.poi.hssf.usermodel.HSSFRow;
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15. import com.mengya.dao.UsersDaoInter;
  16. import com.mengya.entity.Users;
  17. import com.mengya.service.UsersServiceInter;
  18. public class UsersService implements UsersServiceInter {
  19. private UsersDaoInter usersdao = null;
  20. public void setUsersdao(UsersDaoInter usersdao) {
  21. this.usersdao = usersdao;
  22. }
  23. @SuppressWarnings("unchecked")
  24. public InputStream exportUsers() {
  25. // 创建一个HSSFWorkbook
  26. HSSFWorkbook wb = new HSSFWorkbook();
  27. // 由HSSFWorkbook创建一个HSSFSheet
  28. HSSFSheet sheet = wb.createSheet();
  29. // 由HSSFSheet创建HSSFRow
  30. HSSFRow row = sheet.createRow(0);
  31. HSSFCell cell = row.createCell((short) 0);
  32. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  33. cell.setCellValue("序号");
  34. cell = row.createCell((short) 1);
  35. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  36. cell.setCellValue("姓");
  37. cell = row.createCell((short) 2);
  38. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  39. cell.setCellValue("名字");
  40. cell = row.createCell((short) 3);
  41. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  42. cell.setCellValue("年龄");
  43. List<Users> userList = this.findAll();
  44. for (int i = 0; i < userList.size(); i++) {
  45. Users user = userList.get(i);
  46. row = sheet.createRow(i + 1);
  47. cell = row.createCell((short) 0);
  48. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  49. cell.setCellValue(i+1);
  50. cell = row.createCell((short) 1);
  51. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  52. cell.setCellValue(user.getUfristName());
  53. cell = row.createCell((short) 2);
  54. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  55. cell.setCellValue(user.getUlastName());
  56. cell = row.createCell((short) 3);
  57. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  58. cell.setCellValue(user.getUage());
  59. }
  60. //方法一:生成xls文件到硬盘上,然后再删除该文件(启动一个线程或Servlet启动时删除)
  61. //自己的方法产生随机的字符串作为文件名
  62. //参见(http://zmx.iteye.com/admin/blogs/477460)
  63. //String fileName=RandomFileName2.getRandomString(10);
  64. //使用apache的commons-lang.jar产生随机的字符串作为文件名
  65. String fileName=RandomStringUtils.randomAlphanumeric(10);
  66. //生成xls文件名必须要是随机的,确保每个线程访问都产生不同的文件
  67. StringBuffer sb=new StringBuffer(fileName);
  68. final File file = new File(sb.append(".xls").toString());
  69. try {
  70. OutputStream os=new FileOutputStream(file);
  71. try {
  72. wb.write(os);
  73. os.close();
  74. } catch (IOException e) {
  75. }
  76. } catch (FileNotFoundException e) {
  77. e.printStackTrace();
  78. }
  79. InputStream is=null;
  80. try {
  81. is=new FileInputStream(file);
  82. } catch (FileNotFoundException e) {
  83. e.printStackTrace();
  84. }
  85. //生成一个线程,splee15秒删除该文件
  86. new Thread(new Runnable(){
  87. public void run() {
  88. try {
  89. Thread.sleep(15000);
  90. } catch (InterruptedException e) {
  91. e.printStackTrace();
  92. }
  93. file.delete();
  94. }
  95. }).start();
  96. return is;
  97. }
  98. }

对于上面的方法如果服务器停止可能导致有些文件没有删除可能会越来越多,对于tomcat该文件放在tomcat的bin目录中。故我们可以用一个Servlet在服务器启动时删除这些垃圾文件。Servlet如下:

Java代码  

  1. /**
  2. * 服务器启动时清除服务器中的垃圾文件
  3. *
  4. * @author 张明学
  5. *
  6. */
  7. @SuppressWarnings("serial")
  8. public class DeleteExlFileServlet extends HttpServlet {
  9. public void destroy() {
  10. super.destroy();
  11. }
  12. public void init() throws ServletException {
  13. /**第一种方式删除
  14. * File file = new File(".");对于tomcat得到的是bin目录
  15. File file = new File(".");
  16. File[] subFiles = file.listFiles();
  17. for (File f : subFiles) {
  18. if (f.getName().endsWith(".xls")) {
  19. f.delete();
  20. }
  21. }
  22. **/
  23. File file = new File(".");
  24. File[] subFiles = file.listFiles(new FileFilter() {
  25. public boolean accept(File pathname) {
  26. if (pathname.getName().endsWith(".xls")) {
  27. return true;
  28. }
  29. return false;
  30. }
  31. });
  32. for (File f : subFiles) {
  33. f.delete();
  34. }
  35. }
  36. }

该Servlet在web.xml中配置如下:

Java代码  

  1. <!-- 该serlvet不需用户访问服务启时执行init就可以了-->
  2. <servlet>
  3. <description>服务器启动时删除服务器中的垃圾文件</description>
  4. <servlet-name>DeleteExlFileServlet</servlet-name>
  5. <servlet-class>
  6. com.mengya.servlet.DeleteExlFileServlet
  7. </servlet-class>
  8. <!-- 指定服务器启动时执行的次序 -->
  9. <load-on-startup>10</load-on-startup>
  10. </servlet>

action中调用该service:

Java代码  

  1. @SuppressWarnings("serial")
  2. public class ExportUsersAction extends ActionSupport {
  3. private UsersServiceInter userService;
  4. public void setUserService(UsersServiceInter userService) {
  5. this.userService = userService;
  6. }
  7. @Override
  8. public String execute() throws Exception {
  9. return SUCCESS;
  10. }
  11. public InputStream <span style="color: #ff0000;">getDownloadFile</span>
  12. () {
  13. return userService.exportUsers();
  14. }
  15. }

struts.xml中的配置如下:

Xml代码  

  1. <!-- 将用户信息用Excel导出 -->
  2. <action name="exportUsers" class="exportUsersAction">
  3. <result name="success" type="stream">
  4. <!-- 指定文件下载类型 -->
  5. <param name="contentType">application/vnd.ms-excel</param>
  6. <!-- 对于第一个参数默认值为inline这样的话若在线打开的话会生成两个xls文件 -->
  7. <param name="contentDisposition">attachment;filename="allUsers.xls"</param>
  8. <param name="inputName"><span style="color: #ff0000;">downloadFile</span>
  9. </param>
  10. </result>
  11. </action>

到些第一种方法就写完了,还有一种方法可以不生成Excel文件而是返回一个该xls文件的InputStream

Service中的方法如下:

Java代码  

  1. import java.util.List;
  2. import org.apache.commons.io.output.ByteArrayOutputStream;
  3. import org.apache.poi.hssf.usermodel.HSSFCell;
  4. import org.apache.poi.hssf.usermodel.HSSFRow;
  5. import org.apache.poi.hssf.usermodel.HSSFSheet;
  6. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  7. import com.mengya.dao.UsersDaoInter;
  8. import com.mengya.entity.Users;
  9. import com.mengya.service.UsersServiceInter;
  10. public class UsersService implements UsersServiceInter {
  11. private UsersDaoInter usersdao = null;
  12. public void setUsersdao(UsersDaoInter usersdao) {
  13. this.usersdao = usersdao;
  14. }
  15. @SuppressWarnings("unchecked")
  16. public InputStream exportUsers() {
  17. // 创建一个HSSFWorkbook
  18. HSSFWorkbook wb = new HSSFWorkbook();
  19. // 由HSSFWorkbook创建一个HSSFSheet
  20. HSSFSheet sheet = wb.createSheet();
  21. // 由HSSFSheet创建HSSFRow
  22. HSSFRow row = sheet.createRow(0);
  23. HSSFCell cell = row.createCell((short) 0);
  24. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  25. cell.setCellValue("序号");
  26. cell = row.createCell((short) 1);
  27. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  28. cell.setCellValue("姓");
  29. cell = row.createCell((short) 2);
  30. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  31. cell.setCellValue("名字");
  32. cell = row.createCell((short) 3);
  33. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  34. cell.setCellValue("年龄");
  35. List<Users> userList = this.findAll();
  36. for (int i = 0; i < userList.size(); i++) {
  37. Users user = userList.get(i);
  38. row = sheet.createRow(i + 1);
  39. cell = row.createCell((short) 0);
  40. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  41. cell.setCellValue(i+1);
  42. cell = row.createCell((short) 1);
  43. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  44. cell.setCellValue(user.getUfristName());
  45. cell = row.createCell((short) 2);
  46. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  47. cell.setCellValue(user.getUlastName());
  48. cell = row.createCell((short) 3);
  49. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  50. cell.setCellValue(user.getUage());
  51. }
  52. /**
  53. * 方法二:在内存中返回该InputStream,不生成文件到硬盘上
  54. */
  55. ByteArrayOutputStream os=new ByteArrayOutputStream();
  56. try {
  57. wb.write(os);
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. byte[] bytes=os.toByteArray();
  62. InputStream is=new ByteArrayInputStream(bytes);
  63. return is;
  64. }
  65. }

action中的调用和struts.xml中配置同上面的一样。

时间: 2024-10-06 18:31:54

POI与Struts2的使用 poi-2.5.1.jar【转】的相关文章

java 使用poi 结合Struts2导出execl表格

第一步写action方法: public String exportActiveExcel() { String name ="活跃度列表.xls"; try { name = java.net.URLEncoder.encode(name, "UTF-8"); fileName = new String(name.getBytes(), "iso-8859-1"); } catch (UnsupportedEncodingException e

在Struts2中使用poi进行excel操作下载的时候报getOutputStream() has already been called for this response 错误 [转]

在项目中用到了poi这个开源的操作excel文件的jar. 项目中用到struts2容器管理servlet.不是单纯的直接用servlet.         workbook.write(os);           os.flush();            os.close();           return "SUCCESS";  在我的action中用是这样处理最后的传出.但是报出了: java.lang.IllegalStateException: getOutputS

struts2中利用POI导出Excel文档并下载

1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: 1 package com.tydic.eshop.action.feedback; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import

spring+struts2+mybatis中poi导出excel数据

1.html <div id="formDiv"> <form id="dynamicForm" target="_blank"> </form> </div> <a href="javascript:void(0);" id="exporExcel" class="easyui-linkbutton" iconCls="i

spring+struts2+mybatis中poi导入excel数据

1.html <td class="queryTdRight" style="width:22%;">  交易年度: <input id="dealYear" name="dealYear" style="width: 140px"/> </td> <td class="queryTdRight" style="width:40%;&q

【Java POI】1、Java POI的使用

很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据.例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Excel. 任何Java程序员愿意将MS Office文件的输出,可以使用预定义和只读API来做到. 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Mi

Spring3.1+Hibernate3+Struts2的最新整合所需要的jar包

方法/步骤 1 Spring的基本jar包: 1.org.springframework.web-3.1.4.RELEASE.jar: 在web.xml中配置启动Spring容器所需,包括上下文(参数contextConfigLocation)和监听器(类ContextLoaderListener) 2.com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar: 在spring配置文件中配置dataSource所需(类BasicDataSou

Struts2.3.16.3 基本9个jar包

实践证明,Struts2.3.16.3 至少要下面9个Jar包才能正常启动. commons-fileupload-1.3.1.jar commons-logging-1.1.3.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ognl-3.0.6.jar struts2-core-2.3.16.3.jar xwork-core-2.3.16.3.jar commons-io-2.2.jar commons-lang3-3.1.jar 少jav

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9