首頁技術(shù)文章正文

POI能用來做什么?利用POI導(dǎo)出運(yùn)營數(shù)據(jù)Excel報(bào)表

更新時間:2023-08-17 來源:黑馬程序員 瀏覽量:

Apache POI 是一個處理Miscrosoft Office各種文件格式的開源項(xiàng)目。簡單來說就是,我們可以使用 POI 在 Java 程序中對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ù)等。

1692264676620_讀寫文件.png

POI導(dǎo)出Excel報(bào)表的需求分析和設(shè)計(jì)

如下產(chǎn)品原型,我們要在導(dǎo)出的報(bào)表中包含各模塊的業(yè)務(wù)數(shù)據(jù)和明細(xì)。

1692265120722_產(chǎn)品原型.png

導(dǎo)出的Excel報(bào)表格式:

1692265744069_運(yùn)營數(shù)據(jù)報(bào)表.png
導(dǎo)出Excel形式的報(bào)表文件和最近30天的運(yùn)營數(shù)據(jù),接口可以如下設(shè)計(jì):
1692265872502_基本信息.png

當(dāng)前接口沒有返回?cái)?shù)據(jù),因?yàn)閳?bào)表導(dǎo)出功能本質(zhì)上是文件下載,服務(wù)端會通過輸出流將Excel文件下載到客戶端瀏覽器。實(shí)現(xiàn)步驟如下:

①設(shè)計(jì)Excel模板文件

②查詢近30天的運(yùn)營數(shù)據(jù)

③將查詢到的運(yùn)營數(shù)據(jù)寫入模板文件

④通過輸出流將Excel文件下載到客戶端瀏覽器
1692266113792_運(yùn)營數(shù)據(jù)1.jpg

根據(jù)接口定義,在ReportController中創(chuàng)建export方法:

/**
 * 導(dǎo)出運(yùn)營數(shù)據(jù)報(bào)表
 * @param response
 */@GetMapping("/export")
 @ApiOperation("導(dǎo)出運(yùn)營數(shù)據(jù)報(bào)表")
 public void export(HttpServletResponse response){
     reportService.exportBusinessData(response);
 }

在ReportService接口中聲明導(dǎo)出運(yùn)營數(shù)據(jù)報(bào)表的方法:

/** 
* 導(dǎo)出近30天的運(yùn)營數(shù)據(jù)報(bào)表
* @param response
*/
void exportBusinessData(HttpServletResponse response);

在ReportService接口中聲明導(dǎo)出運(yùn)營數(shù)據(jù)報(bào)表的方法:

/**
* 導(dǎo)出近30天的運(yùn)營數(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)營數(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)營數(shù)據(jù)報(bào)表模板.xlsx");  
   try {       
       //基于提供好的模板文件創(chuàng)建一個新的Excel表格對象
       XSSFWorkbook excel = new XSSFWorkbook(inputStream);  
       
       //獲得Excel文件中的一個Sheet頁
       XSSFSheet sheet = excel.getSheet("Sheet1");

在ReportServiceImpl實(shí)現(xiàn)類中實(shí)現(xiàn)導(dǎo)出運(yùn)營數(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)營數(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());        
    } 
           
    //通過輸出流將文件下載到客戶端瀏覽器中         
    ServletOutputStream out = response.getOutputStream();        
    excel.write(out); 
           
    //關(guān)閉資源         
    out.flush();        
    out.close();        
    excel.close();    
  } catch (IOException e) {       
  e.printStackTrace();    
 }
}


分享到:
在線咨詢 我要報(bào)名
和我們在線交談!