使用poi 导出Excel文件 并解决中文名乱码


使用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);

扫描二维码关注公众号,回复: 292989 查看本文章

                   //设置第一行的每一列的属性

                   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;
        }
}


   

猜你喜欢

转载自blog.csdn.net/qq_40521919/article/details/78211423