(Apache POI) 入门案例 P164
使用POI需要导入下面2个坐标:
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId>
</dependency>
在sky-server\src\test\java\com\sky\test下面创建一个POITest类,写入如下代码:
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("张三");//创建单元格写入内容row.createCell(2).setCellValue("厦门");row = sheet.createRow(3);//第4行row.createCell(1).setCellValue("李四");//创建单元格写入内容row.createCell(2).setCellValue("南京");//上面写的都是在内存,现在想在磁盘看到FileOutputStream out = new FileOutputStream(new File("C://software/info.xlsx"));//设置文件excel.write(out);//写入到文件//关闭资源out.close();excel.close();}
}
最终效果如下:
3.7 (Apache POI) 入门案例 P165
把文本读取出来。
在sky-server\src\test\java\com\sky\test下面的POITest类,写入如下代码:
@Test
public void readTest() throws IOException{FileInputStream in = new FileInputStream(new File("C://software/info.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();}
3.8 (导出Excel表) 分析设计 P166
导出Excel形式的报表文件;导出最近30天的运营数据。
接口没有返回数据,导出报表本底是文件下载。服务端会通过输出流将Excel文件下载到客户端浏览器。
一般是先创建原始的Excel文件,这个文件被称为模板文件,先设置好包括颜色和字体等。
步骤:①设计Excel模板文件②查询近30天的运营数据③将查询到的运营数据写入模板文件④通过输出流将Excel文件下载到客户端浏览器。下面这个是模板文件
在sky-server的service层的ReportService接口,写入如下代码:
先在resources下面创建一个template包,然后把运营数据报表模块.xlsx复制进去。
3.9 (导出Excel表) 代码开发 P167 P168 P169
在sky-server的controller层的admin下的ReportController类,写入如下代码:
//导出运营数据报表
@GetMapping("/export")
@ApiOperation("导出运营数据报表")
public void export(HttpServletResponse response){reportService.exportBusinessData(response);
}
在sky-server的service层的ReportService接口,写入如下代码:
void exportBusinessData(HttpServletResponse response);
在sky-server的service层的Impl下的ReportServiceImpl类,写入如下代码:
@Autowired
private WorkspaceService workspaceService;
//统计指定时间区间内的销量排名前10
public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(end,LocalTime.MAX);List<GoodsSalesDTO> salesTop10 = orderMapper.getSalesTop10(beginTime, endTime);List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());String nameList = StringUtils.join(names, ",");List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());String numberList = StringUtils.join(numbers, ",");return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build();
}
@Autowired
private WorkspaceService workspaceService;
//导出运营数据报表
public void exportBusinessData(HttpServletResponse response){//1.查询数据库,获取营业数据--查询最近30天的运营数据LocalDate dateBegin = LocalDate.now().minusDays(30); //减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);//获得第4行XSSFRow row = sheet.getRow(3);row.getCell(2).setCellValue(businessDatavo.getTurnover()); //第3个单元格row.getCell(4).setCellValue(businessDatavo.getOrderCompletionRate());row.getCell(6).setCellValue(businessDatavo.getNewUsers());//获得第5行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);//查询某一天的营业数据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(businessDatavo.getTurnover());row.getCell(3).setCellValue(businessDatavo.getValidOrderCount());row.getCell(4).setCellValue(businessDatavo.getOrderCompletionRate());row.getCell(5).setCellValue(businessDatavo.getUnitPrice());row.getCell(6).setCellValue(businessDatavo.getNewUsers());}//3.通过输出流将Excel文件下载到客户端浏览器ServletOutputStream out = response.getOutputStream();excel.write(out);//关闭资源out.close();excel.close();} catch (IOException e) {throw new RuntimeException(e);}}
3.12 (导出Excel表) 功能测试 P170
点击数据导出后会有一个xlsx文件被下载下来