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;
}
}