简介
常见的使用场景
入门
导入maven依赖
<!-- poi -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId>
</dependency>
简单了解 基本元素
- 整个
excel
文件- excel分为多个
sheet
- 一个sheet分为
行
和列
代码(写excel的示例)
@Slf4j
public class ApachePoiTest {// 测试写入excel@Testpublic void testWriteExcel() {// 创建文件夹File directory = new File("src/testFile");if (!directory.exists()) {boolean mkdir = directory.mkdirs();if (!mkdir) {log.error("创建文件夹失败");}}try (// 1. 创建工作簿 excelWorkbook workbook = new HSSFWorkbook();// 创建输出流FileOutputStream fileOutputStream = new FileOutputStream("src/testFile/user.xlsx");) {// 2. 创建工作表 sheetSheet sheet = workbook.createSheet("用户信息");// 3. 创建行 0表示第一行Row row = sheet.createRow(0);// 4. 创建单元格 0表示第一列Cell cell = row.createCell(0);// 5. 设置单元格内容 0行0列的单元格内容为用户名cell.setCellValue("用户名");// 6. 输出到文件workbook.write(fileOutputStream);} catch (Exception e) {log.error("写入excel失败", e);}}}
代码(读excel的示例)
// 测试读取excel@Testpublic void testReadExcel() {try (FileInputStream fileInputStream = new FileInputStream("src/testFile/user.xlsx");// 1. 创建工作簿 excelWorkbook workbook = new HSSFWorkbook(fileInputStream);) {// 2. 读取文件workbook.getSheetAt(0);// 3. 获取工作表// Sheet sheet = workbook.getSheetAt(0);Sheet sheet = workbook.getSheet("用户信息");// 4. 获取文件最后一行的行号int lastRowNum = sheet.getLastRowNum();// 5. 获取行for (int i = 0; i <= lastRowNum; i++) {// 6. 获取此行的最后一列的列号Row row = sheet.getRow(i);short lastCellNum = row.getLastCellNum();for (int j = 0; j < lastCellNum; j++) {// 7. 获取单元格Cell cell = row.getCell(j);// 8. 判断单元格类型 获取单元格内容 根据单元格类型获取内容switch (cell.getCellTypeEnum()) {case STRING:log.info(cell.getStringCellValue());break;case NUMERIC:log.info(String.valueOf(cell.getNumericCellValue()));break;default:break;}}}} catch (Exception e) {log.error("读取excel失败", e);}}
需求分析
实现步骤
准备模板
代码
controller
// 导出数据 需要response的输出流@GetMapping("/export")@ApiOperation("导出数据")public void export(HttpServletRequest request, HttpServletResponse response) {// 1.获取数据// 2.导出数据reportService.exportBusinessData(response);}
service
/*** 导出营业数据* @param response 响应,用于获取输出流*/@Overridepublic void exportBusinessData(HttpServletResponse response) {// 1.查询数据库,获取数据 (概览数据和明细数据)LocalDate dateBegin = LocalDate.now().minusDays(30);LocalDate dateEnd = LocalDate.now().minusDays(1);LocalDateTime timeBegin = LocalDateTime.of(dateBegin, LocalTime.MIN);LocalDateTime timeEnd = LocalDateTime.of(dateEnd, LocalTime.MAX);BusinessDataVO businessDataVO = workspaceService.getBusinessData(timeBegin, timeEnd);// 2.通过poi将数据写入到excel中try(// 获取模板文件InputStream inputStream = this.getClass().getResourceAsStream("/template/运营数据报表模板.xlsx");// 读取模板文件// 创建工作簿XSSFWorkbook excel = new XSSFWorkbook(inputStream);// 获取输出流ServletOutputStream outputStream = response.getOutputStream();){//填充数据XSSFSheet sheet = excel.getSheet("Sheet1");// 第2行第2列 日期sheet.getRow(1).getCell(1).setCellValue("时间" + dateBegin + "至" + dateEnd);// 第4行XSSFRow row = sheet.getRow(3);// 第4行 第3列 营业额row.getCell(2).setCellValue(businessDataVO.getTurnover().doubleValue());// 第4行 5列 完成率row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());// 第4行 7列 新增用户row.getCell(6).setCellValue(businessDataVO.getNewUsers());// 第5行row = sheet.getRow(4);// 第5行 3列 有效订单数row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());// 第5行 5列 平均客单价row.getCell(4).setCellValue(businessDataVO.getUnitPrice().doubleValue());// 填充明细数据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().doubleValue());// 有效订单数row.getCell(3).setCellValue(businessData.getValidOrderCount());// 完成率row.getCell(4).setCellValue(businessData.getOrderCompletionRate());// 新增用户row.getCell(5).setCellValue(businessData.getNewUsers());}// 3.通过response将excel文件输出到浏览器excel.write(outputStream);}catch (Exception e){log.error("导出营业数据失败", e);}}