更新時(shí)間:2023-08-17 來(lái)源:黑馬程序員 瀏覽量:
Apache POI 是一個(gè)處理Miscrosoft Office各種文件格式的開(kāi)源項(xiàng)目。簡(jiǎn)單來(lái)說(shuō)就是,我們可以使用 POI 在 Java 程序中對(duì)Miscrosoft Office各種文件進(jìn)行讀寫(xiě)操作。
一般情況下,POI 都是用于操作 Excel 文件,例如銀行網(wǎng)銀系統(tǒng)導(dǎo)出交易明細(xì)、各種業(yè)務(wù)系統(tǒng)導(dǎo)出Excel報(bào)表、批量導(dǎo)入業(yè)務(wù)數(shù)據(jù)等。
文件.png)
POI導(dǎo)出Excel報(bào)表的需求分析和設(shè)計(jì)
如下產(chǎn)品原型,我們要在導(dǎo)出的報(bào)表中包含各模塊的業(yè)務(wù)數(shù)據(jù)和明細(xì)。
品原型.png)
導(dǎo)出的Excel報(bào)表格式:
營(yíng)數(shù)據(jù)報(bào)表.png)
導(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ù)寫(xiě)入模板文件
④通過(guò)輸出流將Excel文件下載到客戶端瀏覽器營(yíng)數(shù)據(jù)1.jpg)
根據(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)類(lèi)中實(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)類(lèi)中實(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寫(xiě)一段代碼來(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