当前位置: 首页 > 后端技术 > Java

【小小风之SpringBoot系列】【十五】SpringBoot根据模板生成Word

时间:2023-04-01 20:50:08 Java

骞堕€氳繃maven寮曞叆鎵€闇€渚濊禆org.springframework.bootspring-boot-starter-freemarker鍒涘缓瀵煎嚭妯℃澘1.棣栧厛鍒涘缓涓€涓獁ord妯℃澘鏂囨。锛屾ā鏉垮涓嬪浘word妯℃澘鍦板潃锛歨ttp://file.xiaoxiaofeng.site/files/word.doc鏀粯娉ㄦ剰word涓殑鍗犱綅绗︽牸寮忥紝鏄痜reemaker鐨勬牸寮忥紝璇︾粏瑙i噴濡備笅锛氭枃瀛楀鐞嗭細鐩存帴鎶婂瓧娈靛悕鏇挎崲鎴愪腑闂寸殑${}銆傚鏋滅洿鎺ュ湪word涓畾涔?{title}锛岃浆鎹㈡垚xml鐨勬椂鍊欏彲鑳戒細琚竴浜涗唬鐮侀殧寮€銆傝繖鏃跺€欎綘鍙渶瑕佺敤word鎵撳紑xml锛岄噸鏂拌緭鍏ヨ繖浜涘唴瀹瑰嵆鍙€傚己鐑堝缓璁敤IDE鎵撳紑锛岀劧鍚庢牸寮忓寲銆傛牳瀵瑰鐞嗗悗锛屽彲浠ヤ娇鐢╯earch灏藉彲鑳藉鐨勬悳绱€倄ml鏍煎紡浠g爜澶锛屼笉瑕佺敓纭煒傚浘鐗囧鐞嗭細闇€瑕佸湪word鏂囨。妯℃澘涓彃鍏ュ浘鐗囷紝灏唚ord杞垚xml鍚庯紝鎵撳紑xml锛屾妸鎴戜滑鐨勫浘鐗囪浆鎴愰暱闀跨殑base64銆傛垜浠彲浠ョ敤鎴戜滑鐨?{pic}鏇挎崲base64锛宲ic鏄瓧娈靛悕锛宭ist鍙互浠绘剰鏇挎崲銆傚鐞嗭細闇€瑕佸湪word鏂囨。妯℃澘涓彃鍏ヨ〃鏍硷紝鎵惧埌绗簩涓?w:tr>锛岀涓€琛屾槸鎴戜滑鐨凾itle锛屽湪瀹冨墠闈㈠姞涓?#listpeopleListaslist>鍏朵腑peopleList鏄闆嗗悎鐨勫悕绉癷ncominglist鍜宭ist鏄竴涓埆鍚嶃€傚弬鏁板€兼槸锛?{list.name}杩欐牱鐨勩€傚湪涓?w:tr>閰嶅鐨?/w:tr>涔嬪悗娣诲姞銆傝娉曚笌freemaker鐨刦or寰幆璇硶鐩稿悓銆傚垱寤轰竴涓猣tl妯℃澘銆傚皢涓婇潰鐨剋ord鏂囨。淇濆瓨涓簍est.xml鏍煎紡銆備繚瀛樺悗锛屽彲浠ョ敤娴忚鍣ㄦ墦寮€test.xml鏂囦欢锛屾煡鐪嬫垜浠殑鍗犱綅绗︽槸鍚﹁鑼冦€傛敞鎰忥細鏈夋椂鍊欏崰浣嶇鏄細鍑虹幇琚垎寮€鐨勬儏鍐碉紝濡備笅鍥撅細鍥剧墖鐨勬浛鎹㈠拰涓婇潰鐨勬弿杩颁竴鏍凤紝鍥剧墖鏄竴闀夸覆base64锛屽涓嬪浘锛氱劧鍚庢妸鏂囦欢鏀惧埌resources/templates鐩綍涓嬨€傛斁鍦╮esource鐩綍鍗冲彲锛屽叾浣欑洰褰曞彲鏍规嵁闇€瑕佽嚜瀹氫箟銆傛敞鎰忚瀵瑰簲WordUtil.java涓殑鐩綍銆傜紪鍐欑▼搴忛€氱敤瀵煎嚭宸ュ叿绫诲湪util鍖呬笅鍒涘缓WordUtil.java宸ュ叿绫伙紝馃憞packagecom.maple.demo.util;importfreemarker.template.Configuration;importfreemarker.template.Template;importfreemarker.template銆俆emplateException;importjava.io.*;importjava.nio.charset.StandardCharsets;importjava.util.Map;importstaticfreemarker.template.Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS;/***@authorXiaoXiaofeng*@date2022/7/27*@seehttps://www.xiaoxiaofeng.com*/publicclassWordUtil{privatefinalConfiguration閰嶇疆;publicWordUtil(){configuration=newConfiguration(DEFAULT_INCOMPATIBLE_IMPROVEMENTS);閰嶇疆.setDefaultEncoding("UTF-8");}publicvoidcreateWord(MapdataMap,StringtemplateName,StringfileName){//妯℃澘鏂囦欢璺緞configuration.setClassForTemplateLoading(this.getClass(),"/templates");妯℃澘t=null锛泃ry{//鑾峰彇妯℃澘鏂囦欢t=configuration.getTemplate(templateName,"UTF-8");}catch(IOExceptione){e.printStackTrace();}//瀵煎嚭鏂囦欢FileoutFile=newFile(fileName);try(Writerout=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(outFile),StandardCharsets.UTF_8))){if(t!=null){//鐢ㄥ~鍏呮暟鎹~鍏呮ā鏉挎枃浠跺苟杈撳嚭鍒扮洰鏍囨枃浠秚.澶勭悊锛堟暟鎹槧灏勶紝杈撳嚭锛夛紱}}catch(IOException|TemplateExceptione1){e1.printStackTrace();}}}璇锋眰鎺ュ彛鍦╟ontroller鍖呬笅鍒涘缓TestWordController.java锛屼娇鐢ㄤ笂绡囨枃绔犵殑鏂囦欢浼犺緭base64锛屽弬鑰冩枃绔燵15.Base64涓庢枃浠朵簰鎹()packagecom.maple.demo.controller;importcom.maple.demo.util.Base64Util锛涘鍏om.maple.demo.util.WordUtil锛涘鍏o.swagger.annotations.Api锛涘鍏ラ緳鐩矝銆侫llArgsConstructor锛涘鍏rg.springframework.web.bind.annotation.GetMapping锛涘鍏rg.springframework.web.bind.annotation.Request鏄犲皠锛涘鍏rg.springframework.web.bind.annotation.RestController锛涘鍏avax.servlet.ServletOutputStream锛涘鍏avax.servlet.http.HttpServletRequest锛涘鍏avax.servlet.http.HttpServletResponse锛涘鍏ava.io.File锛涘鍏ava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.URLEncoder;importjava.util.*;/***@authorXiaoXiaofeng*@date2022/7/27*@鍙傝https://www.xiaoxiaofeng.com*/@RestController@AllArgsConstructor@RequestMapping("/example")@Api(tags="绀轰緥婕旂ず-鏍规嵁妯℃澘鐢熸垚word")publicclassTestWordController{/***鏂囧瓧澶勭悊:*鐩存帴浣跨敤涓棿鐨?{}浣滀负鏇挎崲鐨勫瓧娈靛悕*濡傛灉鐩存帴鍦╳ord涓畾涔?{title}锛屽垯杞垚xml鏈夋椂鍙兘浼氳涓€浜涗唬鐮侀殧寮€銆傝繖鏃跺€欏彧闇€瑕佺敤word鎵撳紑xml锛岄噸鏂拌緭鍏ヤ竴閬嶅唴瀹瑰嵆鍙€?鍙互鐢ㄦ祻瑙堝櫒鎵撳紑xml鏌ョ湅鑷繁瀹氫箟鐨?{}鐨勫唴瀹规槸鍚﹂兘鍦ㄤ竴璧凤紝鏄惁鐢ㄧ紪鐮佸垎闅斻€?鍥剧墖澶勭悊锛?闇€瑕佸湪word鏂囨。妯℃澘涓彃鍏ヤ竴寮犲浘鐗?word杞瑇ml鍚庯紝鎵撳紑xml锛屾垜浠殑鍥剧墖浼氳浆鎴愪竴闀挎鐨刡ase64銆?鎴戜滑鍙互鐢ㄦ垜浠殑${pic}鏇挎崲base64锛宲ic鏄瓧娈靛悕锛屽彲浠ヤ换鎰忔浛鎹?鍒楄〃澶勭悊锛?闇€瑕佸湪word鏂囨。妯℃澘涓彃鍏ヤ竴涓〃鏍?鎵惧埌绗簩涓?w:tr>锛屽湪鍦ㄥ墠闈㈡坊鍔?#listpeopleListaslist>锛屽叾涓璸eopleList涓轰紶鍏ュ垪琛ㄧ殑闆嗗悎鍚嶏紝list涓哄埆鍚嶃€?鍙傛暟鍊间负锛?{list.name}鍍忚繖鏍枫€?鍦?/w:tr>涓?w:tr>閰嶅鍚庢坊鍔?/#list>銆傝娉曞悓freemaker*/鐨刦or寰幆璇硶涓€鏍稝GetMapping("/exportWord")publicvoidexportWord(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{//1.鍒涘缓涓存椂鏂囦欢澶筍tringrootPath=request.getSession().getServletContext().getRealPath("/");StringfileName=UUID.randomUUID().toString().replace("-","");//澶勭悊鍥剧墖淇℃伅锛屽皢鍥剧墖杞负base64瀛楃涓睩ileimageFile=newFile("D:\\xiaoxiaofeng.jpg");Stringbase64=Base64Util.fileToBase64(imageFile);//澶勭悊琛ㄧ殑鏁版嵁淇℃伅List>list=newArrayList<>();鏁存暟澶у皬=5;for(inti=0;imap=newHashMap<>(16);map.put("鏄电О","灏忓皬宄?+i);鍦板浘銆俻ut("璁块棶鏃堕棿","2022-07-27");map.put("isLike","Yes");map.put("isAttention","Yes");list.add(鍦板浘);}//鍔犺浇word涓殑鏁版嵁淇℃伅WordUtilword=newWordUtil();MapdataMap=newHashMap<>(16);dataMap.put("title","璁板緱鍏虫敞鎴?);dataMap.put("閭","1150640979@qq.com");dataMap.put("濮撳悕","灏忓皬宄?);dataMap.put("鍒涘缓鏃ユ湡","2022-07-27");dataMap.put("鍥剧墖",base64);dataMap.put("peopleList",list);word.createWord(dataMap,"word.xml",rootPath+"/"+fileName+".doc");StringexportName="娴嬭瘯璇?;response.setCharacterEncoding("utf-8");response.setContentType("application/msword");//璁剧疆娴忚鍣ㄩ€氳繃涓嬭浇澶勭悊鏂囦欢鍚峳esponse.setHeader("Content-Disposition","attachment;filename=".concat(String.valueOf(URLEncoder.encode(exportName+".doc","UTF-8"))));鏂囦欢file=newFile(rootPath+"/"+鏂囦欢鍚?".doc");try(InputStreamfin=newFileInputStream(file);ServletOutputStreamout=response.getOutputStream()){//缂撳啿byte[]buffer=newbyte[512];intbytesToRead;//寰幆璇诲彇璇诲叆鐨刉ord鏂囦欢鍐呭杈撳嚭鍒版祻瑙堝櫒while((bytesToRead=fin.read(buffer))!=-1){out.write(buffer,0,bytesToRead);}}catch(IOExceptione){e.printStackTrace();}finally{//鍒犻櫎涓存椂鏂囦欢file.delete();}}}娴嬭瘯鍦ㄦ祻瑙堝櫒涓緭鍏ttp://localhost:6666/example/exportWord灏卞彲浠ョ湅鍒颁綘鐨勫崟璇嶅嚭鏉ヤ簡锛佸鍑烘晥鏋滃浘濡備笅锛氬叧浜庡皬灏忔灚馃挄鏈珷鍒版缁撴潫锛屽枩娆㈢殑鏈嬪弸璇峰叧娉ㄦ垜鍝︷煒橉煒橈紝澶у鐨勬敮鎸佹槸鎴戠户缁啓涓嬪幓鐨勫姩鍔涖€傚井淇″叕浼楀彿锛氬皬灏忛灏忓皬椋庝釜浜哄崥瀹細https://www.xiaoxiaofeng.com鏈枃婧愮爜锛歨ttps://github.com/hack-feng/maple-demo