前言
本篇文章是學習B站黑馬程序員蒼穹外賣的學習筆記📑。我的學習路線是Java基礎語法-JavaWeb-做項目,管理端的功能學習完之后,就進入到了用戶端微信小程序的開發,用戶端開發的流程大致為用戶登錄—商品瀏覽(其中涉及到緩存,之前寫過)—添加/查看/清空購物車—下單支付(到現在沒搞懂😵?💫)—地址簿—訂單查詢/超時/取消處理(巨多)…還有我沒學到的🤪🤪,統計功能實現之后,為了方便商家了解運營數據,我們一般以Excel表格的形式呈現出我們想要的數據,方便觀看。
🙌先來認識一個新工具—Apache POI?
Apache POI(Poor Obfuscation Implementation)是 Apache 軟件基金會的一個開源 Java 庫。它的主要功能是讀取、創建和操作 Microsoft Office 格式的文件,特別是:
Excel 文件(.xls 和 .xlsx)
Word 文件(.docx)
PowerPoint 文件(.pptx)
以及其他一些 Office 格式(如 Visio .vsd 等)
通過一個測試代碼來看一下怎么使用Apache POI來創建Excel表格🤔
👍通過POI創建Excel文件并且寫入文件指定內容
- 導入Maven
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId>
</dependency>
- 創建測試類:
package com.sky.test;...public class POITest {/** 通過POI創建Excel文件并且寫入文件內容* */@Testpublic void writeTest() throws IOException {//在內存中創建一個Excel文件XSSFWorkbook excel = new XSSFWorkbook();//在Excel文件中創建一個Sheet頁XSSFSheet sheet = excel.createSheet("info");//在Sheet中創建行對象,rownum編號從0開始XSSFRow row = sheet.createRow(1); //1代表第2行row.createCell(1).setCellValue("姓名");//創建單元格寫入內容row.createCell(2).setCellValue("城市");//創建一個新行row = sheet.createRow(2);//第3行row.createCell(1).setCellValue("hhh");//創建單元格寫入內容row.createCell(2).setCellValue("xxx");row = sheet.createRow(3);//第4行row.createCell(1).setCellValue("hhhh");//創建單元格寫入內容row.createCell(2).setCellValue("xxxx");//上面寫的都是在內存,現在想在磁盤看到FileOutputStream out = new FileOutputStream(new File("D://hhh/hhhh.xlsx"));//設置文件excel.write(out);//寫入到文件//關閉資源out.close();excel.close();}
}
來看看實現:
??將讀取磁盤上已經存在的Excel文件
@Test
public void readTest() throws IOException{FileInputStream in = new FileInputStream(new File("D://hhh/hhhh.xlsx"));//讀取磁盤上已經存在的Excel文件XSSFWorkbook excel = new XSSFWorkbook(in);//讀取Excel文件中的第一個Sheet頁XSSFSheet sheet = excel.getSheetAt(0);//獲取Sheet中最后一行行號int lastRowNum = sheet.getLastRowNum();for(int i=1;i<=lastRowNum;i++){//獲得某一行XSSFRow row = sheet.getRow(i);//獲得單元格對象String cellValue1 = row.getCell(1).getStringCellValue();String cellValue2 = row.getCell(2).getStringCellValue();System.out.println(cellValue1+" "+cellValue2);}//關閉資源in.close();}
來看看實現:
?我用ai總結了一下上面所用的Apache POI 組件,每個組件針對特定的 Office 格式或技術::
1. XSSFWorkbook:
用途: 代表一個 Excel .xlsx 格式的工作簿(整個文件)。它是所有操作的起點和容器。無論是讀還是寫,都需要先創建或加載一個 XSSFWorkbook 實例。
寫入: 使用 new XSSFWorkbook() 在內存中創建一個新的工作簿。
讀取: 使用 new XSSFWorkbook(InputStream) 從已存在的文件流加載一個現有的工作簿。
3. XSSFSheet:
用途: 代表工作簿中的一個工作表(Sheet)。
寫入: 使用 workbook.createSheet(“name”) 創建一個新的工作表。
讀取: 使用 workbook.getSheetAt(index) 或 workbook.getSheet(“name”) 獲取一個已存在的工作表。
4. XSSFRow:
用途: 代表工作表中的一行。
寫入: 使用 sheet.createRow(rowIndex) 在指定行號(從0開始)創建一個新行。
讀取: 使用 sheet.getRow(rowIndex) 獲取指定行號的行對象。
5. XSSFCell:
用途: 代表行中的一個單元格。
寫入: 使用 row.createCell(cellIndex) 在指定列號(從0開始)創建一個新單元格。
讀取: 使用 row.getCell(cellIndex) 獲取指定列號的單元格對象。
最后我們來看看項目中(導出Excel表) 代碼開發
首先還是來看看前端,來看功能:
在統計界面的右上角有一個小按鈕(數據導出),點擊后,我們的前端便可把要統計的數據傳給我們的后端,后端再返回一個Excel數據表。
🙌在寫代碼前,先做一個準備工作:
先設計一個運營數據報表模板:
再在resources下面創建一個template包,然后把運營數據報表模板.xlsx復制進去。
admin下的ReportController類:
/*** 導出Excel* @param response*/@GetMapping("/export")@ApiOperation("導出Excel")public void export(HttpServletResponse response) {reportService.exportBusinessData(response);}
ReportService類:
/*** 導出營業數據* @param response*/void exportBusinessData(HttpServletResponse response);
}
ReportServiceImpl類:
@Overridepublic void exportBusinessData(HttpServletResponse response) {//1.查詢數據庫,獲取數據 查詢最近30天的營業數據LocalDate dateBegin = LocalDate.now().minusDays(30);LocalDate dateEnd = LocalDate.now().minusDays(1);//查詢概覽 數據BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN),LocalDateTime.of(dateEnd, LocalTime.MAX));//2.通過POI將數據輸出到Excel文件中InputStream in =this.getClass().getClassLoader().getResourceAsStream("template/運營數據報表模板.xlsx");try {//基于模板文件創建一個Excel表格對象XSSFWorkbook excel = new XSSFWorkbook(in);//填充數據-表格文件的sheet標簽頁XSSFSheet sheet =excel.getSheet("Sheet1");//填充數據-“時間”列sheet.getRow(1).getCell(1).setCellValue("時間:"+dateBegin+"至"+dateEnd);//填充數據-“營業額”列XSSFRow row =sheet.getRow(3);row.getCell(2).setCellValue(businessDataVO.getTurnover());row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());row.getCell(6).setCellValue(businessDataVO.getNewUsers());//填充數據-“有效訂單數”列row = sheet.getRow(4);row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());row.getCell(4).setCellValue(businessDataVO.getUnitPrice());//填充明細數據for(int i = 0; i < 30; i++){LocalDate date = dateBegin.plusDays(i);//查詢某一天的營業數據BusinessDataVO businessData =workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN),LocalDateTime.of(date, LocalTime.MAX));//獲得某一行row = sheet.getRow(7+i);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());}//3.使用輸出流將Excel文件下載到客戶端ServletOutputStream out = response.getOutputStream();excel.write(out);//釋放資源out.close();excel.close();} catch (IOException e) {e.printStackTrace();}}
小白啊!!!寫的不好輕噴啊🤯如果覺得寫的不好,點個贊吧🤪(批評是我寫作的動力)
…。。。。。。。。。。。…
…。。。。。。。。。。。…