用Apache POI读取Excel并下载

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值