更新時(shí)間:2023-08-17 來(lái)源:黑馬程序員 瀏覽量:
Apache POI 是一個(gè)處理Miscrosoft Office各種文件格式的開源項(xiàng)目。簡(jiǎn)單來(lái)說(shuō)就是,我們可以使用 POI 在 Java 程序中對(duì)Miscrosoft Office各種文件進(jìn)行讀寫操作。
一般情況下,POI 都是用于操作 Excel 文件,例如銀行網(wǎng)銀系統(tǒng)導(dǎo)出交易明細(xì)、各種業(yè)務(wù)系統(tǒng)導(dǎo)出Excel報(bào)表、批量導(dǎo)入業(yè)務(wù)數(shù)據(jù)等。
POI導(dǎo)出Excel報(bào)表的需求分析和設(shè)計(jì)
如下產(chǎn)品原型,我們要在導(dǎo)出的報(bào)表中包含各模塊的業(yè)務(wù)數(shù)據(jù)和明細(xì)。
導(dǎo)出的Excel報(bào)表格式:
導(dǎo)出Excel形式的報(bào)表文件和最近30天的運(yùn)營(yíng)數(shù)據(jù),接口可以如下設(shè)計(jì):
當(dāng)前接口沒(méi)有返回?cái)?shù)據(jù),因?yàn)閳?bào)表導(dǎo)出功能本質(zhì)上是文件下載,服務(wù)端會(huì)通過(guò)輸出流將Excel文件下載到客戶端瀏覽器。實(shí)現(xiàn)步驟如下:
①設(shè)計(jì)Excel模板文件
②查詢近30天的運(yùn)營(yíng)數(shù)據(jù)
③將查詢到的運(yùn)營(yíng)數(shù)據(jù)寫入模板文件
④通過(guò)輸出流將Excel文件下載到客戶端瀏覽器
根據(jù)接口定義,在ReportController中創(chuàng)建export方法:
/** * 導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表 * @param response */@GetMapping("/export") @ApiOperation("導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表") public void export(HttpServletResponse response){ reportService.exportBusinessData(response); }
在ReportService接口中聲明導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表的方法:
/** * 導(dǎo)出近30天的運(yùn)營(yíng)數(shù)據(jù)報(bào)表 * @param response */ void exportBusinessData(HttpServletResponse response);
在ReportService接口中聲明導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表的方法:
/** * 導(dǎo)出近30天的運(yùn)營(yíng)數(shù)據(jù)報(bào)表 * @param response */ public void exportBusinessData(HttpServletResponse response) { LocalDate begin = LocalDate.now().minusDays(30); LocalDate end = LocalDate.now().minusDays(1); //查詢概覽運(yùn)營(yíng)數(shù)據(jù),提供給Excel模板文件 BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX)); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/運(yùn)營(yíng)數(shù)據(jù)報(bào)表模板.xlsx"); try { //基于提供好的模板文件創(chuàng)建一個(gè)新的Excel表格對(duì)象 XSSFWorkbook excel = new XSSFWorkbook(inputStream); //獲得Excel文件中的一個(gè)Sheet頁(yè) XSSFSheet sheet = excel.getSheet("Sheet1");
在ReportServiceImpl實(shí)現(xiàn)類中實(shí)現(xiàn)導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表的方法(第2部分):
sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end); //獲得第4行XSSFRow row = sheet.getRow(3); //獲取單元格row.getCell(2).setCellValue(businessData.getTurnover()); row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); row.getCell(6).setCellValue(businessData.getNewUsers()); row = sheet.getRow(4);row.getCell(2).setCellValue(businessData.getValidOrderCount()); row.getCell(4).setCellValue(businessData.getUnitPrice()); for (int i = 0; i < 30; i++) { LocalDate date = begin.plusDays(i); //準(zhǔn)備明細(xì)數(shù)據(jù) businessData = workspaceService.getBusinessData(LocalDateTime.of(date,、 LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX)); row = sheet.getRow(7 + i);
在ReportServiceImpl實(shí)現(xiàn)類中實(shí)現(xiàn)導(dǎo)出運(yùn)營(yíng)數(shù)據(jù)報(bào)表的方法(第3部分):
row.getCell(1).setCellValue(date.toString()); row.getCell(2).setCellValue(businessData.getTurnover()); row.getCell(3).setCellValue(businessData.getValidOrderCount()); row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); row.getCell(5).setCellValue(businessData.getUnitPrice()); row.getCell(6).setCellValue(businessData.getNewUsers()); } //通過(guò)輸出流將文件下載到客戶端瀏覽器中 ServletOutputStream out = response.getOutputStream(); excel.write(out); //關(guān)閉資源 out.flush(); out.close(); excel.close(); } catch (IOException e) { e.printStackTrace(); } }
ElasticSearch安裝教程,ElasticSearch使用方法介紹
2023-08-17關(guān)系代數(shù)運(yùn)算中的集合運(yùn)算符和關(guān)系運(yùn)算符
2023-08-16用wait-notify寫一段代碼來(lái)解決生產(chǎn)者-消費(fèi)者問(wèn)題?
2023-08-16Elasticsearch在部署時(shí),對(duì)Linux的設(shè)置有哪些優(yōu)化方法?
2023-08-15服務(wù)上線怎么不影響舊版本?
2023-08-14SpringApplication實(shí)例的初始化和項(xiàng)目初始化啟動(dòng)
2023-08-11