日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

瀏覽:50日期:2023-04-27 16:11:19

在項(xiàng)目持續(xù)集成的過程中,有時(shí)候需要實(shí)現(xiàn)報(bào)表導(dǎo)出和文檔導(dǎo)出,類似于excel中這種文檔的導(dǎo)出,在要求不高的情況下,有人可能會(huì)考慮直接導(dǎo)出csv文件來簡(jiǎn)化導(dǎo)出過程。但是導(dǎo)出xlsx文件,其實(shí)過程相對(duì)更復(fù)雜。解決方案就是使用poi的jar包。使用源生的poi來操作表格,代碼冗余,處理復(fù)雜,同時(shí)poi的相關(guān)聯(lián)的依賴還會(huì)存在版本兼容問題。所以直接使用poi來實(shí)現(xiàn)表格導(dǎo)出,維護(hù)成本大,不易于拓展。

我們需要學(xué)會(huì)站在巨人的肩膀上解決問題,jxls-poi這個(gè)就很好解決這個(gè)excel表格導(dǎo)出的多樣化的問題。類似jsp和thymealf的模板定義,使得表格導(dǎo)出變得簡(jiǎn)單可控。

不多BB上代碼

1.引入關(guān)鍵依賴包

<!-- jxls-api依賴 --><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>1.0.15</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.4.6</version></dependency>

這里只需要兩個(gè)依賴便操作excel表格了。

2.定義模板文件

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

新建一個(gè)excel文件,后綴名為.xlsx,在resources目錄下新增一個(gè)jxls的文件夾,把模板文件放在這個(gè)文件夾下,便于后續(xù)的spring-boot的集成。

3.導(dǎo)出工具類

/** * @author machenike */public class ExcelUtils { /*** * excel導(dǎo)出到response * @param fileName 導(dǎo)出文件名 * @param templateFile 模板文件地址 * @param params 數(shù)據(jù)集合 * @param response response */ public static void exportExcel(String fileName, InputStream templateFile, Map<String, Object> params, HttpServletResponse response) throws IOException { response.reset(); response.setHeader('Accept-Ranges', 'bytes'); OutputStream os = null; response.setHeader('Content-disposition', String.format('attachment; filename='%s'', fileName)); response.setContentType('application/octet-stream;charset=UTF-8'); try { os = response.getOutputStream(); exportExcel(templateFile, params, os); } catch (IOException e) { throw e; } } /** * 導(dǎo)出excel到輸出流中 * @param templateFile 模板文件 * @param params 傳入?yún)?shù) * @param os 輸出流 * @throws IOException */ public static void exportExcel(InputStream templateFile, Map<String, Object> params, OutputStream os) throws IOException { try { Context context = new Context(); Set<String> keySet = params.keySet(); for (String key : keySet) {//設(shè)置參數(shù)變量context.putVar(key, params.get(key)); } Map<String, Object> myFunction = new HashMap<>(); myFunction.put('fun', new ExcelUtils()); // 啟動(dòng)新的jxls-api 加載自定義方法 Transformer trans = TransformerFactory.createTransformer(templateFile, os); JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator(); evaluator.getJexlEngine().setFunctions(myFunction); // 載入模板、處理導(dǎo)出 AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans); List<Area> areaList = areaBuilder.build(); areaList.get(0).applyAt(new CellRef('sheet1!A1'), context); trans.write(); } catch (IOException e) { throw e; } finally { try {if (os != null) { os.flush(); os.close();}if (templateFile != null) { templateFile.close();} } catch (IOException e) {throw e; } } } /** * 格式化時(shí)間 */ public Object formatDate(Date date) { if (date != null) { SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); String dateStr = sdf.format(date); return dateStr; } return '--'; } /** * 設(shè)置超鏈接方法 */ public WritableCellValue getLink(String address, String title) { return new WritableHyperlink(address, title); }}

這個(gè)工具類中我定義兩個(gè)導(dǎo)出用的方法一個(gè)是直接是HttpServletResponse 導(dǎo)出在線下載文件一個(gè)使用輸入流導(dǎo)出同時(shí)模板中還支持方法傳入。

4.定義導(dǎo)出服務(wù)類

全局配置jxls模板的基礎(chǔ)路徑

#jxls模板的基礎(chǔ)路徑j(luò)xls.template.path: classpath:jxls/

定義服務(wù)接口

/** * excel用service */public interface ExcelService { /** * 導(dǎo)出excel,寫入輸出流中 * @param templateFile * @param params * @param os * @return */ boolean getExcel(String templateFile,Map<String,Object> params, OutputStream os); /** * 導(dǎo)出excel,寫入response中 * @param templateFile * @param fileName * @param params * @param response * @return */ boolean getExcel(String templateFile,String fileName, Map<String,Object> params, HttpServletResponse response); /** * 導(dǎo)出excel,寫入文件中 * @param templateFile * @param params * @param outputFile * @return */ boolean getExcel(String templateFile, Map<String,Object> params, File outputFile);}

excel導(dǎo)出用服務(wù)實(shí)現(xiàn)類

/** * excel用serviceImpl */@Servicepublic class ExcelServiceImppl implements ExcelService { private static final Logger logger = LoggerFactory.getLogger(ExcelServiceImppl.class); /** * 模板文件的基礎(chǔ)路徑 */ @Value('${jxls.template.path}') private String templatePath; @Override public boolean getExcel(String templateFile, Map<String, Object> params, OutputStream os) { FileInputStream inputStream = null; try { //獲取模板文件的輸入流 inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile)); //導(dǎo)出文件到輸出流 ExcelUtils.exportExcel(inputStream, params, os); } catch (IOException e) { logger.error('excel export has error' + e); return false; } return true; } @Override public boolean getExcel(String templateFile, String fileName, Map<String, Object> params, HttpServletResponse response) { FileInputStream inputStream = null; try { //獲取模板文件的輸入流 inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile)); //導(dǎo)出文件到response ExcelUtils.exportExcel(fileName,inputStream,params,response); } catch (IOException e) { logger.error('excel export has error' + e); return false; } return true; } @Override public boolean getExcel(String templateFile, Map<String, Object> params, File outputFile) { FileInputStream inputStream = null; try { //獲取模板文件的輸入流 inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile)); File dFile = outputFile.getParentFile(); //文件夾不存在時(shí)創(chuàng)建文件夾 if(dFile.isDirectory()){if(!dFile.exists()){ dFile.mkdir();} } //文件不存在時(shí)創(chuàng)建文件 if(!outputFile.exists()){outputFile.createNewFile(); } //導(dǎo)出excel文件 ExcelUtils.exportExcel(inputStream, params, new FileOutputStream(outputFile)); } catch (IOException e) { logger.error('excel export has error' + e); return false; } return true; }}

如上,服務(wù)類提供了,三種導(dǎo)出的實(shí)現(xiàn)方法

導(dǎo)出excel寫入response中 導(dǎo)出excel寫入輸出流中 導(dǎo)出excel寫入文件中

這三種方法足以覆蓋所有的業(yè)務(wù)需求

5.編輯jxls模板

這里為方便導(dǎo)出最好定義與模板匹配的實(shí)體類,便于數(shù)據(jù)的裝載和導(dǎo)出

public class UserModel { private Integer id; private String name; private String sex; private Integer age; private String remark; private Date date; private String link; }

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

插入標(biāo)注定義模板,定義迭代對(duì)象jx:each

jx:each(items='list' var='item' lastCell='G3')

上面G3 模板中迭代的結(jié)束位置,然后用類似EL表達(dá)式的方式填充到模板當(dāng)中

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

填寫范圍jx:area

jx:area(lastCell='G3')

模板編輯完成后保存即可,

6.代碼測(cè)試使用

導(dǎo)出為本地文件

@SpringBootTestclass BlogJxlsApplicationTests { @Autowired ExcelService excelService; @Test void contextLoads() { Map<String, Object> params = new HashMap(); List<UserModel> list = new ArrayList<>(); list.add(new UserModel(1, 'test01', '男', 25, 'tttttttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(2, 'test02', '男', 20, 'tttttttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(3, 'test04', '女', 25, 'ttttddddasdadatttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(4, 'test08', '男', 20, 'ttttttdasdatttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(5, 'test021', '女', 25, 'ttttdatttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(7, 'test041', '男', 25, 'ttdadatttttttt',new Date(),'htpp://wwww.baidu.com'));params.put('list', list); excelService.getExcel('t1.xlsx', params, new File('D:test05.xlsx')); }}

導(dǎo)出成功

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

在線導(dǎo)出文件

@RestControllerpublic class TestController { @Autowired ExcelService excelService; @RequestMapping('test') public void testFile(HttpServletResponse response){ Map<String, Object> params = new HashMap(); List<UserModel> list = new ArrayList<>(); list.add(new UserModel(1, 'test01', '男', 25, 'tttttttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(2, 'test02', '男', 20, 'tttttttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(3, 'test04', '女', 25, 'ttttddddasdadatttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(4, 'test08', '男', 20, 'ttttttdasdatttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(5, 'test021', '女', 25, 'ttttdatttttt',new Date(),'htpp://wwww.baidu.com')); list.add(new UserModel(7, 'test041', '男', 25, 'ttdadatttttttt',new Date(),'htpp://wwww.baidu.com')); params.put('list', list); excelService.getExcel('t1.xlsx',System.currentTimeMillis()+'.xlsx', params,response); }}

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

導(dǎo)出成功

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

源碼地址https://github.com/DavidLei08/BlogJxls.git

到此這篇關(guān)于SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)的文章就介紹到這了,更多相關(guān)SpringBoot集成jxls-poi內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本一区二区高清不卡| 亚洲欧洲美洲国产香蕉| 欧美亚洲国产日韩| 亚洲精品日韩久久| 亚洲人亚洲人色久| 日韩免费精品| 国产日韩在线观看视频| 国产精品久一| 麻豆一区在线| 国产一区二区三区亚洲| 日韩一区欧美| 性欧美精品高清| 国产精品日本| 亚洲精品1区2区| 美女黄网久久| 亚洲精品在线国产| 欧美日一区二区三区在线观看国产免| 天堂久久一区| 国产欧美一区二区三区米奇| 国产精品.xx视频.xxtv| 精品资源在线| 久久精品观看| 视频一区中文字幕国产| 日韩和欧美一区二区| 国产精品一区高清| 精品一区视频| 国产精品毛片久久| 99热精品久久| 视频一区二区三区中文字幕| 日韩福利视频网| 精品网站999| 欧美 日韩 国产一区二区在线视频| 日本大胆欧美人术艺术动态| 欧美天堂一区| 97精品视频在线看| 亚洲欧洲一区二区天堂久久| 日韩欧乱色一区二区三区在线| 国产精品3区| 亚洲a一区二区三区| 欧美日本不卡| 久久亚洲资源中文字| 一区二区三区四区日本视频| 午夜欧美理论片| 91欧美日韩在线| av资源中文在线天堂| 日韩视频久久| 久久99视频| 欧美日韩免费观看一区=区三区| 日本成人在线一区| 日韩国产一区二区三区| 亚洲免费婷婷| 精品三级久久久| 亚洲中字黄色| 国产不卡精品| 一区二区三区国产在线| 国产欧洲在线| 亚洲色图综合| 欧美片第1页| 日韩和欧美一区二区三区| 欧洲一级精品| 日韩av中文字幕一区| 亚洲韩日在线| 麻豆国产欧美一区二区三区 | 五月国产精品| 高清av不卡| 欧美日韩1区2区3区| 蜜桃成人av| 国产女人18毛片水真多18精品| 欧美va亚洲va日韩∨a综合色| 视频一区国产视频| 国产精品99在线观看| 午夜久久av| 午夜国产精品视频| 日韩成人免费| 日本午夜精品一区二区三区电影| 久久久久美女| 欧美激情在线精品一区二区三区| 99在线观看免费视频精品观看| 国产精品99一区二区三| 视频一区日韩| 亚洲精品a级片| 综合日韩av| 国产日韩一区二区三区在线 | 91精品精品| 国产精品一区二区美女视频免费看| 午夜精品网站| 日韩欧美一区二区三区在线观看 | 伊人久久国产| 91欧美精品| 亚洲深夜av| 亚洲成a人片| 国产日本久久| 亚洲色图国产| 精品一区在线| 精品久久免费| 国产精选久久| 日韩高清国产一区在线| 制服诱惑一区二区| 日本韩国欧美超级黄在线观看| 久久一区精品| 国产精品久久免费视频| 日精品一区二区三区| 亚洲欧美日韩在线观看a三区| 999国产精品| 蜜臀久久精品| 麻豆传媒一区二区三区| 日本成人精品| 鲁大师成人一区二区三区| 午夜国产一区二区| 99精品美女| 日韩一区二区在线免费| 国产精品国产一区| 精品三级在线观看视频| 欧美激情麻豆| 国产精品一级在线观看| 国产调教一区二区三区| 国产免费播放一区二区| 久久精品凹凸全集| 中文字幕中文字幕精品| 日韩精品网站| 日韩在线高清| 日韩欧美一区二区三区在线视频| 精品久久久亚洲| 里番精品3d一二三区| 久久精品日韩欧美| 精品视频高潮| 日韩av在线播放网址| 中文字幕人成乱码在线观看| 麻豆视频在线观看免费网站黄 | 日本少妇精品亚洲第一区| 亚洲91网站| 欧美亚洲三区| 老司机精品视频网| 久久精品一区| 国产拍在线视频| 欧洲一级精品| 今天的高清视频免费播放成人| 国户精品久久久久久久久久久不卡| 国产91精品对白在线播放| 亚洲成人一区| 亚洲视频国产精品| 91成人精品观看| 美日韩一区二区三区| 精品日产乱码久久久久久仙踪林| 成人精品久久| 婷婷综合网站| 日本亚洲欧美天堂免费| 欧美精品观看| 欧美国产专区| 最近高清中文在线字幕在线观看1| 久久精品二区三区| 亚洲一区欧美激情| 人人爱人人干婷婷丁香亚洲| 国产精品99久久免费| 亲子伦视频一区二区三区| 亚洲欧美久久| 欧美日韩一区二区三区四区在线观看 | 国产精品啊v在线| 国产精品videossex久久发布 | 久久免费大视频| 亚洲欧美网站| 亚洲狼人精品一区二区三区| 欧美精品中文字幕亚洲专区| 精品一区av| 91超碰国产精品| 91麻豆精品| 日韩国产一区二区| 男女激情视频一区| 青青青国产精品| 午夜影院一区| 日韩精品一卡二卡三卡四卡无卡| 日本在线视频一区二区| 美女视频免费精品| 国产主播一区| 日韩高清欧美激情| 亚洲啊v在线| 亚洲综合欧美| 国产极品模特精品一二| 香蕉精品视频在线观看| 国产午夜久久av| 欧美亚洲激情| 欧美一级一区| 亚洲手机视频| 欧美福利专区| 亚洲精选久久| jizzjizz中国精品麻豆| 免费成人在线观看| 精品理论电影在线| 老牛国产精品一区的观看方式| 精品伊人久久久| 亚洲在线久久| 成人在线观看免费视频| av不卡在线看| 日韩av免费大片| 亚洲精品欧美| 午夜欧美巨大性欧美巨大| 日韩精品欧美精品| 91精品国产成人观看| 国产精品久久久久久久久久妞妞| 欧美午夜不卡|