/默认inline内联直接在窗口打开;attachment表示提供下载框共用户下载
<param name="inputName">downloadFile</param>
</result>
</action>
第二种方式,直接在内存中处理掉:(用线程的方式删掉)
在实现类中处理:
服务类的实现
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.bean.User;
import com.test.dao.UserDAO;
import com.test.service.UserService;
public class UserServiceImpl implements UserService
{
private UserDAO userDao;
public UserDAO getUserDao()
{
return userDao;
}
public void setUserDao(UserDAO userDao)
{
this.userDao = userDao;
}
public List<User> findAll()
{
return this.userDao.findAllUsers();
}
public InputStream getInputStream()
{
HSSFWorkbook wb = new HSSFWorkbook();//创建对象
HSSFSheet sheet = wb.createSheet("sheet1");//创建sheet
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> list = this.findAll();//得到说有用户信息
//把数值放到表格里面
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(i + 1);
cell = row.createCell((short) 1);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getFirstname());
cell = row.createCell((short) 2);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getLastname());
cell = row.createCell((short) 3);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getAge());
}
//设置导出文件
// String fileName = RandomStringUtils.randomAlphanumeric(10);
//
// fileName = new StringBuffer(fileName).append(".xls").toString();
//
// final File file = new File(fileName);
//
// try
// {
// OutputStream os = new FileOutputStream(file);
// wb.write(os);
// os.close();
// }
// catch (Exception e)
// {
// e.printStackTrace();
// }
//
// InputStream is = null;
// try
// {
// is = new FileInputStream(file);
// }
// catch (FileNotFoundException e)
// {
// e.printStackTrace();
// }
//
// new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// Thread.sleep(15000);
// }
// catch (InterruptedException e)
// {
// e.printStackTrace();
// }
//
// file.delete();//删除临时文件
// }
// }).start();
//
// return is;
}
}
上面存在的问题是,当服务器关掉时还不能关掉线程,那么文件依然保留
解决办法在服务器启动的时候,就删除存在类似文件名的文件
建立servlet:
package com.test.servlet;
import java.io.File;
import java.io.FileFilter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class DeleteFilesServlet extends HttpServlet
{
public void destroy()
{
}
public void init() throws ServletException
{
//第一种办法
// File file = new File(".");//当前文件
//
// File[] subFiles = file.listFiles();
//
// for(File f : subFiles)
// {
// if(f.getName().endsWith("xls"))
// {
// f.delete();
// }
// }
//第二种办法
File file = new File(".");
File[] subFiles = file.listFiles(new FileFilter()//遍历要过滤的文件
{
public boolean accept(File pathname)//实现里面的类
{
if(pathname.getName().endsWith("xls"))
{
return true;//将选对应的文件放入返回列表里面
}
return false;
}
}
);
for(File f : subFiles)
{
f.delete();
}
}
}
Web.xml
<servlet>
<servlet-name>DeleteFilesServlet</servlet-name>
<servlet-class>com.test.servlet.DeleteFilesServlet</servlet-class>
<load-on-startup>8</load-on-startup>
</servlet>//不需要mapping要把它删掉
第二种方式:推荐使用
实现类:
package com.test.service.impl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
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.bean.User;
import com.test.dao.UserDAO;
import com.test.service.UserService;
public class UserServiceImpl implements UserService
{
private UserDAO userDao;
public UserDAO getUserDao()
{
return userDao;
}
public void setUserDao(UserDAO userDao)
{
this.userDao = userDao;
}
public void delete(User user)
{
this.userDao.removeUser(user);
}
public List<User> findAll()
{
return this.userDao.findAllUsers();
}
public User findById(Integer id)
{
return this.userDao.findUserById(id);
}
public void save(User user)
{
this.userDao.saveUser(user);
}
public void update(User user)
{
this.userDao.updateUser(user);
}
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> list = this.findAll();
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(i + 1);
cell = row.createCell((short) 1);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getFirstname());
cell = row.createCell((short) 2);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getLastname());
cell = row.createCell((short) 3);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(user.getAge());
}
//第二种办法,直接输出到内存里面
ByteArrayOutputStream os = new ByteArrayOutputStream();
try
{
wb.write(os);//写到数组里面
}
catch (IOException e)
{
e.printStackTrace();
}
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
return is;
//第一种办法 ,会导致部分内容缺失,和excel出问题
// byte[] content = wb.getBytes();
// InputStream is = new ByteArrayInputStream(content);
//
// return is;
}
}
版权归------------向先函-----------------所有
结束日期2010-1-24