成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

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

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

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

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

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

不多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>

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

2.定義模板文件

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

新建一個excel文件,后綴名為.xlsx,在resources目錄下新增一個jxls的文件夾,把模板文件放在這個文件夾下,便于后續(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()); // 啟動新的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; } } } /** * 格式化時間 */ 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); }}

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

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ù)實現(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(); //文件夾不存在時創(chuàng)建文件夾 if(dFile.isDirectory()){if(!dFile.exists()){ dFile.mkdir();} } //文件不存在時創(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)出的實現(xiàn)方法

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

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

5.編輯jxls模板

這里為方便導(dǎo)出最好定義與模板匹配的實體類,便于數(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)注定義模板,定義迭代對象jx:each

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

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

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

填寫范圍jx:area

jx:area(lastCell='G3')

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

6.代碼測試使用

導(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)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
主站蜘蛛池模板: 久久成人在线 | 欧美日韩另类国产 | 日韩欧美在 | freesex寂寞老妇hd | 亚洲国产影院 | 精品国产一区在线观看 | 久久久久久久国产a∨ | 欧美福利一区二区三区 | 亚洲成a人一区二区三区 | 99久久精品免费国产一区二区三区 | 欧美在线播放成人a | 亚洲一区二区三区免费看 | 久久99国产亚洲高清观看首页 | 国产东北色老头老太性视频 | 欧美xxxx色视频在线观看 | 久草热草| 2022国产精品网站在线播放 | 久久黄色一级视频 | 国产精品国产三级国产a | 日韩美女视频在线观看 | 91理论片午午伦夜理片久久 | 亚洲视频在线观看一区 | 成年女人毛片免费播放人 | 久草在线中文视频 | 国产亚洲精品精品国产亚洲综合 | 男人躁女人躁的好爽免费视频 | 亚洲最新网址 | 波多野结衣在线免费视频 | 一区三区三区不卡 | 亚洲黄区| 国产综合视频在线观看一区 | 久久精品国产这里是免费 | 欧美性色高清生活片 | 久久频这里精品99香蕉久 | 91欧美激情一区二区三区成人 | 成年人在线网站 | 国产午夜一级淫片 | 免费一级毛片女人图片 | 2022免费国产精品福利在线 | 国产99久久久久久免费看 | 欧美3p精品三区 |