Maven 引入依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>RELEASE</version> </dependency>
导出 excel
导出 excel 比较重要的 api 有以下几个,其他的并无难点
- 创建一个 excel 文件工作薄;(HSSFWorkbook workbook = new HSSFWorkbook())
- 创建一张表;HSSFSheet sheet = workbook.createSheet("统计表")
- 创建一行;HSSFRow row = sheet.createRow(0)
- 填充一列数据; row.createCell(0).setCellValue("数据")
- 设置一个单元格样式;cell.setCellStyle(style)
注意!!! 如果文件没有提示下载 则不代表生成 EXCEL 失败 文件会在项目 根目录 中自动生成!!
public HSSFWorkbook createExcel(SearchParams params) { // 第一步创建workbook HSSFWorkbook wb = new HSSFWorkbook(); // 第二步创建sheet HSSFSheet sheet = wb.createSheet("列表"); // 设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度 sheet.setColumnWidth(0, 256 * 20); sheet.setColumnWidth(1, 256 * 20); sheet.setColumnWidth(2, 256 * 20); sheet.setColumnWidth(3, 256 * 10); sheet.setColumnWidth(4, 256 * 20); sheet.setColumnWidth(5, 256 * 20); // 第三步创建行row:添加表头0行 HSSFRow row = sheet.createRow(0); HSSFCellStyle style = wb.createCellStyle(); // 设置为居中加粗 // HSSFCellStyle style = workbook.createCellStyle(); // HSSFFont font = workbook.createFont(); // font.setBold(true); // style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // style.setFont(font); // 第四步创建单元格 int cellColumn = 0; // 第一个单元格 HSSFCell cell = row.createCell(cellColumn++); cell.setCellValue("ID"); cell.setCellStyle(style); // 第二个单元格 cell = row.createCell(cellColumn++); cell.setCellValue("用户"); cell.setCellStyle(style); // 第三个单元格 cell = row.createCell(cellColumn++); cell.setCellValue("时间"); cell.setCellStyle(style); // 第四个单元格 cell = row.createCell(cellColumn++); cell.setCellValue("符号"); cell.setCellStyle(style); // 第五个单元格 cell = row.createCell(cellColumn++); cell.setCellValue("数量"); cell.setCellStyle(style); AtomicInteger index = new AtomicInteger(); // 自增跳过表头 index.incrementAndGet(); fillData(params, index, sheet); return wb; } private void fillData(SearchParams params, AtomicInteger index, HSSFSheet sheet) { // 自定义分页查找数据 PageInfo<SearchListForm> pageInfo = this.service.getDataBySearch(params); List<SearchListForm> searchList = pageInfo.getList(); Optional.ofNullable(searchList).ifPresent(list -> list.stream().forEach(v -> { HSSFRow row = sheet.createRow(index.getAndIncrement()); // 设置日期格式 // HSSFCellStyle style = workbook.createCellStyle(); // style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); // HSSFCell cell = row.createCell(3); // cell.setCellValue(user.getCreate_time()); // cell.setCellStyle(style); int cellColumn = 0; row.createCell(cellColumn++).setCellValue(v.getId()); row.createCell(cellColumn++).setCellValue(v.getUsername()); row.createCell(cellColumn++).setCellValue(DateFormatUtils.format(v.getCreatetime(), "MM/dd/yyyy HH:mm:ss")); row.createCell(cellColumn++).setCellValue(v.getSymbol()); row.createCell(cellColumn++).setCellValue(v.getQuantity().setScale(8, RoundingMode.HALF_DOWN).stripTrailingZeros().toPlainString()); })); // 循环获取数据 if (pageInfo.isHasNextPage()) { params.setPage(pageInfo.getNextPage()); fillData(params, index, sheet); } }
@GetMapping(value = "downloadExcel") public void ( @RequestBody @ApiParam(required = false, name = "SearchParams", value = "参数") SearchParams params, HttpServletResponse response ) { params.setPage(1); params.setRows(1000); String fileName = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "_ExcelData" + ".xls"; response.setContentType("application/octet-stream"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setHeader("Content-disposition", "attachment;filename=" + fileName); OutputStream outputStream = null; HSSFWorkbook wb = null; try { outputStream = response.getOutputStream(); // 刷新缓冲 response.flushBuffer(); wb = createExcel(params); wb.write(outputStream); } catch (IOException e) { logger.info("IOException {}", e); } finally { IOUtils.closeQuietly(wb); IOUtils.closeQuietly(outputStream); } } // 生成excel文件 protected void buildExcelFile(String filename,HSSFWorkbook workbook) throws Exception{ FileOutputStream fos = new FileOutputStream(filename); workbook.write(fos); fos.flush(); fos.close(); } // 浏览器下载excel protected void buildExcelDocument(String filename,HSSFWorkbook workbook,HttpServletResponse response) throws Exception{ response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "utf-8")); OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); }
通过 swagger 直接下载可能会出现乱码
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于