引言

datatables是基于jQuery的HTML表格插件,通过各种参数配置可以自定义出对应的表格功能。同时datatables有许多plug可以扩展功能。
表格导出Excel是很常见的需求,有两种实现方式,前端导出以及使用POI后台生成Excel文件返回文件流到前台下载。
前端导出有很多种,有ActiveX、flash、html5,兼容性各不相同。

下面分享实际使用POI和excelHtml5中遇到的问题及解决方法。

使用datatables插件excelHtml5导出Excel表格

excelHtml5是datatables的一个扩展插件,因为 html5 的特性,只支持IE10以上的浏览器,其他主流浏览器如Chrome、Firefox均可使用。
如果需要在IE10以下的浏览器可使用excelFlash扩展,与ActiveX类似,flash也是一种淘汰的标准。

使用excelHtml5需要引入对应js库,如下:

  • DataTables
  • Buttons
  • HTML5 export
  • JSZip

注意对于引入的js版本不一样会产生兼容性问题而无法使用,具体参考 https://datatables.net/download/

使用很简单,只需要为DataTable添加buttons参数即可,样例代码:

$('#myTable').DataTable( {
    buttons: [
        {
            extend: 'excelHtml5',
            text: 'Save current page',
            exportOptions: {
                modifier: {
                    page: 'current'
                }
            }
        }
    ]
} );

使用POI接口HSSF和XSSF导出Excel表格

HSSF和XSSF是实现不同Excel格式的工具类,分别是Excel '97(-2007)、Excel 2007 OOXML (.xlsx)。功能十分强大,可方便读写Excel文件。在实际Java Web的开发中需要将创建的文件以流的形式返回给浏览器,从而实现导出。

通过循环遍历可以把数据写入到对应行(Row)和单元格(Cell),样例代码如下:

public void createExcel() throws Exception {
	Workbook wb = new HSSFWorkbook();
	CreationHelper createHelper = wb.getCreationHelper();
	Sheet sheet = wb.createSheet("new sheet");
	// Create a row and put some cells in it. Rows are 0 based.
	Row row = sheet.createRow(0);
	// Create a cell and put a date value in it. 
	Cell cell = row.createCell(0);
	cell.setCellValue(new Date());
	cell = row.createCell(1);
	cell.setCellValue(new Date());
	// Write the output to a file
	try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
		wb.write(fileOut);
	}
}

用户导出时,用户可以发起下载的HTTP请求,后台服务可以将通过POI创建的Excel文件以流的形式返回,样例代码如下:

public void downLoad(HttpServletResponse response) throws Exception {
	//set respone
	response.setHeader("conent-type", "application/octet-stream");
	response.setContentType("application/octet-stream");
	response.addHeader("Content-Disposition", "attachment;filename="+file.getName());
	//get Excel File outputstream
	File file=new File("Test.xls");
	OutputStream outputStream=response.getOutputStream();
	BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));        
	//write outputstream to response
	byte[] b = new byte[1024];int n;
	while ((n = inputStream.read(b)) != -1) {
		outputStream.write(b, 0, n);
	}
	br.close();
	out.close();
}

总结

使用datatables插件excelHtml5浏览器端导出兼容性很差,以及在Excel的样式自定义中不如POI这样强大。但是使用方便简单快捷,不会对服务器产生压力。

POI导出则是借助HTTP请求下载Excel文件流,对浏览器没有任何要求。但是POI使用复杂,对服务器会产生一定压力,例如导入超过1W行以上的数据。

在实际开发中则因具体情况、具体需求而异,推荐在单页导出、高版本浏览器中使用浏览器端导出,在数据量大、浏览器版本要求较为严格的情况使用POI在服务器生成Excel文件导出。

参考