開心一笑
謝師宴上,某同學對老師說:“好老師,我必須敬您一杯!
您對我真好啊,每次講完題都第一個問我聽明白了沒有。
”老師說:“其實我是覺得,你要是明白了,大家都明白了……”
提出問題
在excel導出中如何解決導出亂碼問題,包括excel名稱亂碼問題???
解決問題
看下面代碼,有一種似曾相識的感覺,如果沒有,說明你沒看看之前的文章:
/**
* 描述:導出任務書
* @return
* @throws Exception
*/
@RequestMapping(value = "/{id}/exportTaskBook", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResultData exportTaskBook(@PathVariable("id") String mainTaskId,Query query,HttpServletResponse response) throws Exception{
List<StageTaskNodeDTO> stageTaskNodeDTOs = pcsMainTaskService.findStagesTasksAndSubTaskTree(mainTaskId,query);
//主任務
PcsMainTask pcsMainTask = pcsMainTaskService.findById(mainTaskId);
//項目
PcsProject pcsProject = pcsProjectService.findById(pcsMainTask.getPmProjectId());
HSSFWorkbook excel = pcsMainTaskService.exportTaskBook(pcsProject,pcsMainTask,stageTaskNodeDTOs);
OutputStream os = null;
try{
if(pcsMainTask != null && pcsProject != null){
String fileName = pcsProject.getName() + pcsMainTask.getName() + ".xls";
//解決中文名亂碼問題
fileName = new String(fileName.getBytes("GBK"), "ISO8859_1");
//設置編碼、輸出文件格式
response.setContentType("application/msexcel");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
os = response.getOutputStream();
excel.write(os);
}else{
logger.info("任務書導出:項目或者主任務不存在");
}
}catch(Exception e){
logger.info("任務書導出異常" + e.getMessage());
}finally{
if(os != null){
os.close();
}
}
return new ResultData();
}
解釋:
在Java中,字符都是以Unicode進行存儲的,
fileName.getBytes("GBK"),getBytes("GBK")
getBytes方法返回的是一個GBK或者GB2312的中文編碼的字節數組,
其中中文字符,各占兩個字節。而在英文平臺中,一般的默認編碼是“ISO-8859-1”,
每個字符都只取一個字節(而不管是否非拉丁字符)
我們得到了正確的以GBK編碼的字節數組,以后需要還原為中文字串時,可以使用下面方法:
fileName = new String(fileName.getBytes("GBK"), "ISO8859_1")
獲取gbk編碼的字節流,并編碼成iso8859-1
讀書感悟
來自《30歲前的每一天》
- 著名廣告人李奧·貝納說過一句話:“伸手摘星,即使徒勞無功,亦不致滿手污泥。
- 想知道哪些書適合自己,路徑只有一條,那就是先“行動”。先看第一本,然后看第二本,
兩本一比較,你就知道哪一本比較好。只要看的書多了,對書的優劣自然就了然于心了。 - 10000小時能夠成就天才