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