Java之Poi导出Excel文档

一、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类似

三、效果图

我们先看以下最后的效果图

Java之Poi导出Excel文档

以上是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

上一篇:玩转Web之servlet(一)---怎样创建一个servlet


下一篇:C. Arithmetic Progression(细节模拟)