用Apache POI读取Excel并下载

2/22/2017来源:ASP.NET技巧人气:1704

POI提供API给java程序对Microsoft Office格式档案读和写的功能。今天写个读取execl并下载的demo。

Demo

//使用POI,将数据转换生成Excel(.xls格式) //1.创建一个新的空白工作簿Excel HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); //2.在工作簿中创建一个新的工作表 HSSFSheet sheet = hssfWorkbook.createSheet(); //3.在工作表中创建第一行,作为标题行 HSSFRow headRow = sheet.createRow(0); //给标题行的每一格写入数据 headRow.createCell(0).setCellValue("分区编号"); headRow.createCell(1).setCellValue("区域编码"); headRow.createCell(2).setCellValue("关键字"); headRow.createCell(3).setCellValue("起始号"); headRow.createCell(4).setCellValue("结束号"); headRow.createCell(5).setCellValue("单双号"); headRow.createCell(6).setCellValue("位置信息"); //4.在工作表中写入其他数据行,每一个分区对应一行数据 for (Subarea subarea : subareaList) { HSSFRow subareaRow = sheet.createRow(sheet.getLastRowNum()+1);//从第二行开始写入 subareaRow.createCell(0).setCellValue(subarea.getId()); subareaRow.createCell(1).setCellValue(subarea.getRegion().getId()); subareaRow.createCell(2).setCellValue(subarea.getAddresskey()); subareaRow.createCell(3).setCellValue(subarea.getStartnum()); subareaRow.createCell(4).setCellValue(subarea.getEndnum()); subareaRow.createCell(5).setCellValue(subarea.getSingle().toString()); subareaRow.createCell(6).setCellValue(subarea.getPosition()); } //设置客户端浏览器用于识别附件的两个参数Content-Type和Content-Disposition //文件名 String downloadFileName = "分区数据.xls"; //获取文件的MIME类型: String mimeType = ServletActionContext.getServletContext().getMimeType(downloadFileName); //将MIME类型放入响应 ServletActionContext.getResponse().setContentType(mimeType); //浏览器类型 String agent = ServletActionContext.getRequest().getHeader("user-agent"); //附件名编码,解决中文乱码问题(用工具类) downloadFileName = FileUtils.encodeDownloadFilename(downloadFileName, agent); //获取附件的名字和下载方式 String contentDisposition = "attachment;filename="+downloadFileName; //将附件名字和下载方式放入响应头信息中 ServletActionContext.getResponse().setHeader("Content-Disposition", contentDisposition); //将Excel的文件流写入到客户端响应中 hssfWorkbook.write(ServletActionContext.getResponse().getOutputStream());

解决浏览器兼容工具类

public class FileUtils { /** * 下载文件时,针对不同浏览器,进行附件名的编码 * * @param filename * 下载文件名 * @param agent * 客户端浏览器 * @return 编码后的下载附件名 * @throws IOException */ public static String encodeDownloadFilename(String filename, String agent) throws IOException { if (agent.contains("Firefox")) { // 火狐浏览器 filename = "=?UTF-8?B?" + new BASE64Encoder().encode(filename.getBytes("utf-8")) + "?="; filename = filename.replaceAll("\r\n", ""); } else { // IE及其他浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+"," "); } return filename; } }