SSH 生成execl

来源:互联网 发布:java校招笔试题 编辑:程序博客网 时间:2024/06/05 22:57

struts2使用poi实现导出excel

SSH框架整合 2009-07-28 11:09:36 阅读851 评论2   字号: 订阅

我们根据上面的例子,将列表信息导出到excel..我们使用poi来实现

再次强调,不要将业务代码写到action里面.所以我们需要在service里面修改代码.

1 修改UserService.java.添加一个getInputStream方法.

package com.test.service;

import java.io.InputStream;
import java.util.List;

import com.test.model.User;

public interface UserService {
 
 public void saveUser(User user);
 
 public void delUser(User user);
 
 public void updateUser(User user);
 
 public User findById(int id);
 
 public List<User> findAll();
 
 public InputStream getInputStream();

}

2 在UserServiceImpl.java里面实现这个方法..实现其他方法的代码不写了..就将导入的包和这个方法放上来

package com.test.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.test.DAO.UserDAO;
import com.test.model.User;
import com.test.service.UserService;

方法如下

@Override
 public InputStream getInputStream() {
  HSSFWorkbook wb = new HSSFWorkbook();//创建一个工作间
  HSSFSheet sheet = wb.createSheet("sheet1");//创建一个sheet
  HSSFRow row = sheet.createRow(0);//创建一行
  
  HSSFCell cell = row.createCell((short) 0);//创建这行的第一个元素.从0开始
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置字符编码
  cell.setCellValue("序号");//写入内容
  
  cell = row.createCell((short) 1);//同上,不多解释了
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("姓名");
  
  cell = row.createCell((short) 2);
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("年龄");
  
  List<User> list = this.findAll();
  //循环,将下面几行的数据取出来放入这个sheet中
  for(int i = 0 ; i < list.size() ; i++)
  {
   User user = list.get(i);
   row = sheet.createRow(i+1);
   
   cell = row.createCell((short) 0);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getId());
   
   cell = row.createCell((short) 1);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getUsername());
   
   cell = row.createCell((short) 2);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getAge());
  }
  
  File file = new File("abc.xls");
  //创建一个File 拿来当缓存用.也就是先将内存中的excel写入File中.然后再将File转换成输出流
  try {
   OutputStream out = new FileOutputStream(file);
   wb.write(out);//写入File
   out.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  InputStream in = null;
  
  try {
   in = new FileInputStream(file);//将file转换成输入流
   //in.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return in;
 }

3 .编写action  这里开始就和文件下载没什么区别了.就把代码放上来.不解释了

package com.test.action;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.test.model.User;
import com.test.service.UserService;

public class DownloadExcelAction extends ActionSupport {
 private UserService service;
 
 
 
 public UserService getService() {
  return service;
 }

 

 public void setService(UserService service) {
  this.service = service;
 }
 
 public InputStream getExcelStream(){
  return service.getInputStream();
 }

 

 @Override
 public String execute() throws Exception {
  return SUCCESS;
 }

}
4 struts.xml 和下载部分一模一样的

<action name="DownloadExcelAction" class="ExcelClass" >
      <result  type="stream">
       <param name="ContentType">application/vnd.ms-excel</param>
       <param name="inputName">excelStream</param>                                      
    <param name="contentDisposition">filename="user.xls"</param>
      </result>
     </action>

5 配置spring配置文件applicationContext.xml 将service注入

<bean id="ExcelClass" class="com.test.action.DownloadExcelAction">
 <property name="service">
  <ref bean="UserService"/>
 </property>
</bean>

6 最后在页面上写一个连接就OK了

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
 
    <title>My JSP 'list.jsp' starting page</title>
   
  </head>
  
  <body> 
<h1><font color="red"><center>User List</center></font></h1>

<table align="center" border="1" width="80%">
 <tr>
  <td>序号
  </td>
  
  <td>名字
  </td>
  
  <td>年龄
  </td>
  
  <td>删除
  </td>
  
  <td>修改
  </td>
  </tr>
 <s:iterator value="#request.list" id="us">
 <tr>
  <td><s:property value="#us.id"/>
  </td>
  
  <td><s:property value="#us.username"/>
  </td>
  
  
  <td><s:property value="#us.age"/>
  </td>
  
  <td><s:a href="DelAction.action?user.id=%{#us.id}">删除</s:a>
  </td>
  
  <td><s:a href="updatePUser.action?user.id=%{#us.id}">修改</s:a>
  </td>
  </tr>
 </s:iterator> 
 <tr>
 <td align="center" colspan="4">
  <s:a href="DownloadExcelAction.action">导出到excel</s:a>
 </td>
 </tr>

</table>
  </body>
</html>

 

总结

使用Poi实现导出excel和文件下载唯一的不同就是在内存里创建excel上..可以说,这个就是一个特殊的文件下载.我们使用poi的HSSF创建一个excel.然后我们将这个内存中的excel写入到一个自定义的文件中.接下来就是将这个文件提供给struts下载.就是这样了...这里还有一个BUG..假如,一个用户创建好了一个abc.xls(这个就是一个缓存的excel文件)但是还没下载.另外一个用户刚好又创建了一个abc.xls.这个时候第一个用户来下载,那样得到的excel会造成结果的不一致...解决办法待定..

 

原创粉丝点击