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会造成结果的不一致...解决办法待定..
转自: http://jingbo2759.blog.163.com/blog/static/98375315200962811936748/