jxls-poi 以導(dǎo)入的思路做Excel導(dǎo)出

一、分析

????????原生的poi導(dǎo)出匿垄,最麻煩的就是導(dǎo)出excel樣式的設(shè)置移宅,十分麻煩。于是有一種想法椿疗,就是以導(dǎo)入的思路做導(dǎo)出漏峰,就像我們知道的那樣,導(dǎo)入excel進(jìn)內(nèi)存也必然對(duì)象化了届榄,那么我們只要替換對(duì)應(yīng)的業(yè)務(wù)數(shù)據(jù)不就可以了嗎浅乔?

? ? ? ? 正如所想的那樣,可以實(shí)現(xiàn)的痒蓬,只是有人做到了童擎,也就是有現(xiàn)成的工具類可以使用,說(shuō)道本文的主角攻晒,那就是jxls-poi.看名字也知道必然依賴poi,沒(méi)錯(cuò)必須依賴poi班挖,只是poi的很多版本存在兼容的問(wèn)題鲁捏,略微有點(diǎn)坑。

? ? ? ? jxls是一個(gè)簡(jiǎn)單的萧芙、輕量級(jí)的excel導(dǎo)出庫(kù),使用特定的標(biāo)記在excel模板文件中來(lái)定義輸出格式和布局给梅,底層應(yīng)該是利用反射做的映射,這里本文不針對(duì)jxls的具體實(shí)現(xiàn)原理做探究双揪,本文重點(diǎn)在于記錄一下jxls的使用动羽。(有空再做研究,有空的話或者需要的話)渔期。

? ? ? ? jxls-poi的使用相對(duì)來(lái)說(shuō)运吓,是比較簡(jiǎn)單的渴邦,但是其功能是比較強(qiáng)大的。最關(guān)鍵的是對(duì)jxls的標(biāo)記語(yǔ)言的熟悉與使用拘哨,當(dāng)然不熟悉也沒(méi)關(guān)系谋梭,因?yàn)槲乙膊皇呛苁煜さ摹1疚挠涗浀氖褂冒咐腔緦?duì)導(dǎo)出excel來(lái)說(shuō)是通用的倦青,多sheet頁(yè)瓮床,當(dāng)然還沒(méi)用多行遍歷集合數(shù)據(jù)。重在在使用中進(jìn)行摸索产镐,不采坑不進(jìn)步~

二隘庄、導(dǎo)出模板

批注的使用

//指定模板的范圍

jx:area(lastCell="L56")?

//items對(duì)導(dǎo)出數(shù)據(jù)進(jìn)行遍歷,var遍歷出的每一項(xiàng)數(shù)據(jù)癣亚,lastCell指定模板的范圍峭沦,multisheet多sheet的對(duì)應(yīng)sheet名稱集合

jx:each(items="aiFormulaResultData", var="data", lastCell="L56" multisheet="aiFormulaResultDataSheetNames")

導(dǎo)出模板.xlsx
指定模板的范圍

三、業(yè)務(wù)代碼

@RequestMapping("/downloadExcel.action")

public void downloadExcel(HttpServletRequest request, HttpServletResponse response)throws IOException {

????List?data =dataService.getData();

????List dataSheetNames =new ArrayList<>(data?.size());

????//sheetName

????String templateSheetName1 = ConstVar.SHEET_DATA1;

????String templateSheetName2 = ConstVar.SHEET_DATA2;

????for (int i =0; i < data.size(); i++) {

????????dataSheetNames.add((String)data.get(i).get("code"));

????}

????Map bindDataMap =new HashMap<>();

????bindDataMap.put("aiChemicalDataSheetNames", aiChemicalDataSheetNames);

????bindDataMap.put("aiChemicalDataList", chemicalData);

????//獲取獲取模板? 國(guó)際化

????String templateFileName = RequestContextUtils.getLocale(request).equals(Locale.SIMPLIFIED_CHINESE) ? ConstVar.AI_EXCEL_CHINESE_NAME : ConstVar.AI_EXCEL_ENGLISH_NAME;

????File tempTargetFile =new File(CommonUtil.getGuid() +".xlsx");

????InputStream inputStreamClassPath =null;

????InputStream inputStream =null;

try {

????inputStreamClassPath =new ClassPathResource("downloadTemplateExcel/" + templateFileName).getInputStream();

????//讀取模板-寫(xiě)入數(shù)據(jù)-刪除模板sheet

????JxlsExportTemplateExcelUtils.exportExcelAndDeleteTemplateSheet(inputStreamClassPath, tempTargetFile, bindDataMap, templateSheetName1, templateSheetName2);

????inputStream =new FileInputStream(tempTargetFile);

????//設(shè)置response頭信息

????response.reset();

????String title = CommonUtil.encodingFileName(I18nUtils.getMessage("chemical.pdfTitleName"));

????response.setContentType("application/octet-stream");

????response.setHeader("Content-Length", String.valueOf(inputStream.available()));

????response.setHeader("Content-Disposition","attachment;filename=" + title + CommonUtil.getCurrentDate() +".xlsx");

????OutputStream out = response.getOutputStream();

????//創(chuàng)建緩沖區(qū)

????FileCopyUtils.copy(new BufferedInputStream(inputStream),new BufferedOutputStream(out));

}catch (Exception e) {

????logger.error("下載EXCEL出現(xiàn)異常 " + CommonUtil.getExceptionDetail(e));

}finally {

????if (inputStream !=null) {

????????inputStream.close();

????}

????if (inputStreamClassPath !=null) {

????????inputStreamClassPath.close();

????}

????if (tempTargetFile !=null && tempTargetFile.exists()) {

????????tempTargetFile.delete();

????}

}

}

四逃糟、工具類

JxlsExportTemplateExcelUtils

//對(duì)外提供

public static void exportExcelAndDeleteTemplateSheet(InputStream templateFileInputStreamn, File tempTargetFile, Map bindDataMap, String... templateSheetNames)throws FileNotFoundException, IOException {

exportExcel(templateFileInputStreamn, tempTargetFile, bindDataMap, templateSheetNames);

}

//多種重載

private static void exportExcel(InputStream is, File out, Map model, String... sheetNames)throws IOException {

? ? OutputStream os =new FileOutputStream(out);

Context context = PoiTransformer.createInitialContext();

if (model !=null) {

for (Map.Entry entry : model.entrySet()) {

context.putVar(entry.getKey(), entry.getValue());

}

}

JxlsHelper jxlsHelper = JxlsHelper.getInstance();


//必須要這個(gè)吼鱼,否者表格函數(shù)統(tǒng)計(jì)會(huì)錯(cuò)亂

? ?jxlsHelper.getInstance().setUseFastFormulaProcessor(false).processTemplate(context, jxlsHelper.createTransformer(is, os));

//刪除對(duì)應(yīng)的模板sheet頁(yè)

? ? deleteSheet(out, sheetNames);

}

//刪除對(duì)應(yīng)的模板sheet頁(yè)

public static void deleteSheet(File file, String... sheetNames) {

try {

FileInputStream fis =new FileInputStream(file);

XSSFWorkbook wb =new XSSFWorkbook(fis);

fileWrite(file, wb);

//刪除Sheet

? ? ? ? for (String sheetName : sheetNames) {

wb.removeSheetAt(wb.getSheetIndex(sheetName));

}

fileWrite(file, wb);

fis.close();

}catch (Exception e) {

//e.printStackTrace();

? ? }

}

五、maven依賴

<!--項(xiàng)目中已使用poi绰咽,此處排除-->

<dependency>

<groupId>org.jxls</groupId>

<artifactId>jxls-poi</artifactId>

<version>1.1.0</version>

<exclusions>

<exclusion>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

</exclusion>

<exclusion>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml</artifactId>

</exclusion>

</exclusions>

</dependency>

<!--POI-->

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

<version>3.17</version>

</dependency>

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml</artifactId>

<version>3.17</version>

</dependency>

六菇肃、總結(jié)

整體來(lái)說(shuō),是相對(duì)簡(jiǎn)單的取募,思路與想法很重要琐谤,只要你能想到的,一般就已經(jīng)有人做到了玩敏,而且做得還不錯(cuò)斗忌。但是需要在實(shí)踐中發(fā)現(xiàn)問(wèn)題,解決問(wèn)題旺聚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末织阳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砰粹,更是在濱河造成了極大的恐慌唧躲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碱璃,死亡現(xiàn)場(chǎng)離奇詭異弄痹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嵌器,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)肛真,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人爽航,你說(shuō)我怎么就攤上這事蚓让∏溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵凭疮,是天一觀的道長(zhǎng)饭耳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)执解,這世上最難降的妖魔是什么寞肖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮衰腌,結(jié)果婚禮上新蟆,老公的妹妹穿的比我還像新娘。我一直安慰自己右蕊,他們只是感情好琼稻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著饶囚,像睡著了一般帕翻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萝风,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天嘀掸,我揣著相機(jī)與錄音,去河邊找鬼规惰。 笑死睬塌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歇万。 我是一名探鬼主播揩晴,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贪磺!你這毒婦竟也來(lái)了硫兰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缘挽,失蹤者是張志新(化名)和其女友劉穎瞄崇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壕曼,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年等浊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腮郊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筹燕,死狀恐怖轧飞,靈堂內(nèi)的尸體忽然破棺而出衅鹿,到底是詐尸還是另有隱情,我是刑警寧澤过咬,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布大渤,位于F島的核電站,受9級(jí)特大地震影響掸绞,放射性物質(zhì)發(fā)生泄漏泵三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一衔掸、第九天 我趴在偏房一處隱蔽的房頂上張望烫幕。 院中可真熱鬧,春花似錦敞映、人聲如沸较曼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捷犹。三九已至,卻和暖如春冕末,著一層夾襖步出監(jiān)牢的瞬間萍歉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工栓霜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翠桦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓胳蛮,卻偏偏與公主長(zhǎng)得像销凑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仅炊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我們?cè)谧鲞@個(gè)項(xiàng)目的時(shí)候斗幼,需要導(dǎo)出一個(gè)excel文件,所以我就想到了使用poi導(dǎo)出數(shù)據(jù) 下面把代碼貼出來(lái)抚垄,供大家參考...
    Harry小哥哥閱讀 2,133評(píng)論 0 6
  • 首先添加依賴蜕窿。 <!--文件上傳組件--> <dependency> <groupId>commons-fileu...
    散過(guò)丶閱讀 1,092評(píng)論 0 2
  • Apache POI 是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的 Java API,Apache POI提供API給Ja...
    玩味Orz閱讀 2,614評(píng)論 0 0
  • java導(dǎo)出excel表格: 1呆馁、導(dǎo)入jar包 <dependency><groupId>org.apache.p...
    邱實(shí)_b532閱讀 1,896評(píng)論 0 0
  • A約我在學(xué)校的咖啡廳見(jiàn)面桐经,我到那里的時(shí)候他已經(jīng)坐在那里了,正不安的喝著茶浙滤。 我坐到他對(duì)面時(shí)他突然瘋了一...
    50ml閱讀 264評(píng)論 1 1