使用poi 导出Excel文件 并解决中文名乱码
第一种方法:
@Action("subAreaAction_exportXLs")
public String exportXLs() throws IOException{
List<SubArea>list = subAreaService.findAll();//查询数据库获取参数
//创建hssfworkbook Excel的文档对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建新的sheet
HSSFSheet sheet = wb.createSheet("分区数据");
//设置第一行
HSSFRow row = sheet.createRow(0);
//设置第一行的每一列的属性
row.createCell(0).setCellValue("分区编号");
row.createCell(1).setCellValue("分区名字");
row.createCell(2).setCellValue("关键字");
row.createCell(3).setCellValue("辅助关键字");
row.createCell(4).setCellValue("省市区");
//遍历集合
for (SubArea subArea : list) {
//添加属性到新的一行
//根据sheet的方法获得最后一行的行号+1作为下一行行号
HSSFRowrows = sheet.createRow(sheet.getLastRowNum()+1);
rows.createCell(0).setCellValue(subArea.getId());
rows.createCell(1).setCellValue(subArea.getStartNum());
rows.createCell(2).setCellValue(subArea.getKeyWords());
rows.createCell(3).setCellValue(subArea.getAssistKeyWords());
rows.createCell(4).setCellValue(subArea.getArea().getName());
}
//输出Excel文件
//本处使用的ssh框架,输出Excel需要一个输出流
//获取response
HttpServletResponseresponse = ServletActionContext.getResponse();
//获取输出流
OutputStream output = response.getOutputStream();
response.reset();
//设置分区中文名
String filename = "分区信息";
//设置响应的编码
response.setContentType("application/x-download");//下面三行是关键代码,处理乱码问题
response.setCharacterEncoding("utf-8");
//设置浏览器响应头对应的Content-disposition
response.setHeader("Content-disposition", "attachment;filename="+new String(filename.getBytes("gbk"), "iso8859-1")+".xls");
//wb输出
wb.write(output);
output.close();
returnNONE;
}
第二种方法:
使用工具类
//使用附件形式下载exel文件
//文件下载:一个流(文件输出流)两个头(内容格式MIME类型,文件的打开方式(浏览器内嵌方式开发,附件形式下载attachment))
String fileName = "分区数据.xls";
//处理中文问题
//通过获取请求头中浏览器信息
String agent = ServletActionContext.getRequest().getHeader("User-Agent");
//根据浏览器不同将文本进行编码
fileName = FileUtils.encodeDownloadFilename(fileName, agent);
HttpServletResponse response =ServletActionContext.getResponse();
//设置头信息
response.setHeader("contentType", "application/vnd.ms-excel");
response.setHeader("content-disposition", "attachment;fileName="+fileName);
OutputStream stream = response.getOutputStream();
workbook.write(stream);
returnNONE;
工具类代码:package cn.itcast.bos.utils;
import java.io.IOException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
public class FileUtils {
/**
* 下载文件时,针对不同浏览器,进行附件名的编码
*
* @param filename
* 下载文件名
* @param agent
* 客户端浏览器
* @return 编码后的下载附件名
* @throws IOException
*/
public static String encodeDownloadFilename(String filename, String agent)
throws IOException {
if (agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
} else { // IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
return filename;
}
}