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

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

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

     该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.   
    5.     public void setUserService(UsersServiceInter userService) {  
    6.         this.userService = userService;  
    7.     }  
    8.   
    9.     @Override  
    10.     public String execute() throws Exception {  
    11.   
    12.         return SUCCESS;  
    13.     }  
    14.   
    15.     public InputStream <span style="color: #ff0000;">getDownloadFile</span>  
    16.   
    17. () {  
    18.         return userService.exportUsers();  
    19.     }  
    20. }  

    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.   
    10. </param>  
    11.             </result>  
    12.         </action>  

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

    Service中的方法如下:

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

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

  • 相关阅读:
    IntelliJ IDEA 2018.3 升级功能介绍
    Spring 自动装配及其注解
    在IDEA中实战Git-branch
    IntelliJ IDEA 新版发布:支持CPU火焰图,新增酷炫主题
    java中URL和File的相互转化
    写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
    输入一行字符,分别统计出其中英文 字母、空格、数字和其它字符的个数
    输入两个正整数m和n,求其最大公约数和最小公倍数。
    一个数如果恰好等于它的因子之和,这个数就称为 "完数 "
    判断101-200之间有多少个素数,并输出所有素数。
  • 原文地址:https://www.cnblogs.com/baobojun/p/4377014.html
Copyright © 2011-2022 走看看