一、Poi简介
在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持。
二、Workbook/HSSFWorkbook/XSSFWorkbook
1) Workbook是Poi模型中的工作簿的概念,等同于Excel文档,我们的一切操作都基于这个工作簿。不过Workbook只是定义了一个接口,它有两个实现类: HSSFWorkbook/XSSFWorkbook。
2)HSSFWorkbook是Workbook的实现类,它生成的是.xls格式的文档(Excel '97(-2007))
3)XSSFWorkbook是Workbook的新的实现类,它生成的是.xlsx格式的文档(Excel 2007以后)
我们以下示例将使用HSSFWorkbook实现类,XSSFWorkbook类似
三、效果图
我们先看以下最后的效果图
以上是Mac的numbers打开的样子,与window有所不同。
我们看到:
1)第一行,单元格数据(设置值);
2)单元格文本居中(设置样式);
3)第二行,单元格合并(合并操作);
四、代码示例
下面是实现代码,详细请看注解内容:
public static List<String> dataList; static { // 数据准备 dataList = new ArrayList<>(); dataList.add("星期一"); dataList.add("星期二"); dataList.add("星期三"); dataList.add("星期四"); dataList.add("星期五"); dataList.add("星期六"); dataList.add("星期七"); } /** * 下载Excel文档 * @param outputStream */ public void downloadExcel(OutputStream outputStream) { // 创建工作簿 Workbook wb = new HSSFWorkbook(); // 创建样式 CellStyle style = wb.createCellStyle(); // 文本居中 style.setAlignment(HorizontalAlignment.CENTER); // 创建工作表 Sheet sheet = wb.createSheet("sheet1"); // 合并单元格(开始行, 结束行, 开始列, 结束列) sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, dataList.size() - 1)); // 创建首行 Row row = sheet.createRow(0); // 创建首行各个列 for (int cellNum = 0; cellNum < dataList.size(); cellNum++) { String cellValue = dataList.get(cellNum); // 创建单元格 Cell cell = row.createCell(cellNum); // 设置单元格的值 cell.setCellValue(cellValue); cell.setCellStyle(style); } try { // 输出为文件 wb.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { wb.close(); } catch (IOException e) { e.printStackTrace(); } } }
以上代码,传入一个OutputStream输出流,通过Workbook创建相关内容后,最后将workbook的内容写入输出流。
五、下载
如果你想通过web请求下载,那么可以将workbook写入response的输出流,例如:
@RequestMapping(value = "download") public void downloadExcel(HttpServletResponse response){ try { String fileName = String.valueOf(new Date().getTime()); fileName += ".xls"; // 浏览器直接下载 response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1")); response.setContentType("application/ynd.ms-excel;charset=UTF-8"); poiService.downloadExcel(response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } }
注意,这里设置了头:Content-Disposition:attachment...这里头信息,将使得浏览器直接将该内容做为文件直接下载。
前端JS代码可以简单这么写即可:
window.open("/download")
具体内容可以参考官网文档:https://poi.apache.org/spreadsheet/quick-guide.html