POI之Excel導(dǎo)出編碼問題

開心一笑

謝師宴上,某同學(xué)對老師說:“好老師,我必須敬您一杯!
您對我真好啊,每次講完題都第一個問我聽明白了沒有。
”老師說:“其實我是覺得,你要是明白了,大家都明白了……”

提出問題

在excel導(dǎo)出中如何解決導(dǎo)出亂碼問題,包括excel名稱亂碼問題???

解決問題

看下面代碼,有一種似曾相識的感覺,如果沒有,說明你沒看看之前的文章:

/**
     *  描述:導(dǎo)出任務(wù)書
     * @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);
        //主任務(wù)
        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");
                //設(shè)置編碼、輸出文件格式
                response.setContentType("application/msexcel");
                response.setCharacterEncoding("UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
                os = response.getOutputStream();
                excel.write(os);
            }else{
                logger.info("任務(wù)書導(dǎo)出:項目或者主任務(wù)不存在");
            }

        }catch(Exception e){
            logger.info("任務(wù)書導(dǎo)出異常" + e.getMessage());
        }finally{
            if(os != null){
                os.close();
            }
        }
        return new ResultData();
    }

解釋:
在Java中,字符都是以Unicode進(jìn)行存儲的,

fileName.getBytes("GBK"),getBytes("GBK")

getBytes方法返回的是一個GBK或者GB2312的中文編碼的字節(jié)數(shù)組,
其中中文字符,各占兩個字節(jié)。而在英文平臺中,一般的默認(rèn)編碼是“ISO-8859-1”,
每個字符都只取一個字節(jié)(而不管是否非拉丁字符)

我們得到了正確的以GBK編碼的字節(jié)數(shù)組,以后需要還原為中文字串時,可以使用下面方法:

fileName = new String(fileName.getBytes("GBK"), "ISO8859_1")

獲取gbk編碼的字節(jié)流,并編碼成iso8859-1

讀書感悟

來自《30歲前的每一天》

  • 著名廣告人李奧·貝納說過一句話:“伸手摘星,即使徒勞無功,亦不致滿手污泥。
  • 想知道哪些書適合自己,路徑只有一條,那就是先“行動”。先看第一本,然后看第二本,
    兩本一比較,你就知道哪一本比較好。只要看的書多了,對書的優(yōu)劣自然就了然于心了。
  • 10000小時能夠成就天才
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容