由于工作的需要,需要用java将数据库中的数据导出为Excel表格,这就用到了Apache的POI组件,该组件让我们能够自定义创建Excel工作薄,然后导出文件即可。
1.首先准备好POI的包,使用maven导入或者直接加载jar都可以。
我是下载了poi-3.11-20141221.jar,poi-ooxml-3.11-20141221.jar,poi-ooxml-schemas-3.11-20141221.jar这三个包,添加到项目中即可。
使用maven的依赖如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
2.创建excel的工作簿
POI创建excel的步骤就是:创建工作簿----->在工作簿中创建表格------>往表格中填入数据。
(1)对于Excel2007之前的版本(exce文件后缀是xls)
用到的对象是HSSFWorkbook
创建语句如下:
Workbook wb = new HSSFWorkbook();
(2)对于Excel2007以后(excel文件后缀是xlsx)
用到的对象是XSSFWorkbook
创建语句如下:
Workbook wb = new XSSFWorkbook();
以下示例用第二种方式,对于Excel2007之前的版本,所有的对象前缀XSS改为HSS即可。
(3)创建工作簿之后是创建工作页面(sheet):
XSSFSheet sheet = wb.getSheetAt(0);
这条语句是创建excel的第一个页面,也就是一个sheet。
(4)创建sheet之后是创建行,其中index是行索引。
XSSFRow row = sheet.createRow(index);
(5)最后是在行中创建单元格
Cell cell = row.createCell(index);
其中index是列索引。然后为该单元格设置值。
cell.setCellValue(cellValue);
(6)也可以为单元格设置样式:
先创建样式对象
CellStyle bodyRowStyle = wb.createCellStyle(); bodyRowStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); bodyRowStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED); //下边框 bodyRowStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框 bodyRowStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上边框 bodyRowStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);//右边框 XSSFFont font = wb.createFont(); font.setFontName("Arial"); font.setFontHeightInPoints((short) 9);//设置字体大小 bodyRowStyle.setFont(font);
最后为单元格设置样式:
cell.setCellStyle(cellStyle);
(7)到这一步之后Excel的工作簿已经创建完毕,下一步是将其导出,以下是javaweb中的方法。
protected void export(HttpServletRequest request,HttpServletResponse response,Workbook hwb,String fileName) throws IOException{ OutputStream os = null; try { os = response.getOutputStream(); response.reset(); String userAgent = request.getHeader("User-Agent"); if (userAgent.toLowerCase().indexOf("msie") > 0) { fileName = URLEncoder.encode(fileName, "UTF-8"); } else { fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); } response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); response.setContentType("application/x-download; charset=utf-8"); hwb.write(os); os.flush(); } finally { if (os != null) { os.close(); } } }
将我们的工作簿引用wb传入该函数即可。
至此,excel导出已经完成。
ps:有时因为excel的表头过于复杂,纯粹用程序创建太麻烦,我们可以先创建一个表头的excel模板文件,然后向该模板中写入单元格即可。具体方式如下:
File file=new File("C:\\Users\\Michael\\Desktop\\header.xlsx"); OPCPackage opcPackage=OPCPackage.open(file); wb = new XSSFWorkbook(opcPackage);
再写入行的时候记得跳过表头的那几行。
更多的POI API可以去官网看一看:http://poi.apache.org/spreadsheet/quick-guide.html