今天集合了struts2+spring+hibernate三大框架来生成excel文件,个人感觉生成excel文件很重要也很实用,所以把它叙述了下来。
对于struts2和spring 、hibernate三者之间的基本的配置不用太多的介绍了。我想学过j2ee的基本都懂得如何配置了(在web.xml要添加spring 的监听器<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>,在struts2中添加<constant name="struts.objectFactory"value="org.apache.struts2.spring.StrutsSpringObjectFactory" />),接下来重要的是创建一个接口如:
public interface IUserService {
public List<User> getUsers();
public InputStream getInputStream();
}
然后创建一个类来实现它(在创建这个类之前我们必须先添加Spring包中的poi.jar包):
public class UserServiceDao implements IUserService {
@SuppressWarnings("deprecation")
@Override
public InputStream getInputStream() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("sheet1");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell((short) 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("密码");
cell = row.createCell((short) 3);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue("年龄");
List<User> users = this.getUsers();
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
row = sheet.createRow(i + 1);
cell = row.createCell((short) 0);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(i + 1);
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.getPassword());
cell = row.createCell((short) 3);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getAge());
}
//此代码它不会在硬盘上才生垃圾文件,它是在内存中完成的一系列的工作,不会才生垃圾文件
ByteArrayOutputStream bStream=new ByteArrayOutputStream();
try {
wb.write(bStream);
} catch (IOException e) {
e.printStackTrace();
}
byte[] context=bStream.toByteArray();
InputStream inputStream=new ByteArrayInputStream(context);
return inputStream;
// //此处将产生随机的字符串以区别不同的用户,会在硬盘中产生垃圾文件
// String filename=RandomStringUtils.randomAlphanumeric(10);
// filename=new StringBuffer(filename).append(".xls").toString();
//
// File file = new File(filename);
// try {
// OutputStream outputStream = new FileOutputStream(file);
//
// wb.write(outputStream);
// outputStream.close();
//
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//
// InputStream inputStream=null;
// try {
// inputStream=new FileInputStream(file);
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return inputStream;
}
@Override
public List getUsers() {
List users = (List) new HibernateDAO().getObjects();
return users;
}
}
这样基本上大功告成,还差一步就是如何在struts.xml配置action:
<action name="genexcel" class="generateExcelAction">
<result type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="contentDisposition">filename="allUsers.xls"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
要注意的是<param name="inputName">downloadFile</param>在相对应的action的中要有get方法如:
public class GenerateExcel extends ActionSupport {
private UserServiceDao userServiceDao;
public UserServiceDao getUserServiceDao() {
return userServiceDao;
}
public void setUserServiceDao(UserServiceDao userServiceDao) {
this.userServiceDao = userServiceDao;
}
public InputStream getDownloadFile() {
return userServiceDao.getInputStream();
}
@Override
public String execute() throws Exception {
return super.execute();
}
}