1. 程式人生 > >使用poi 匯出Excel檔案 並解決中文名亂碼

使用poi 匯出Excel檔案 並解決中文名亂碼

使用poi 匯出Excel檔案  並解決中文名亂碼

第一種方法:

@Action("subAreaAction_exportXLs")

public String exportXLs() throws IOException{

List<SubArea>list = subAreaService.findAll();//查詢資料庫獲取引數

//建立hssfworkbookExcel的文件物件

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