poi 制作 excel 并且以文件流的方式 传输到客户端下载

Posted aresblank

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poi 制作 excel 并且以文件流的方式 传输到客户端下载相关的知识,希望对你有一定的参考价值。

最近做了poi模块,总结一下。

poi是常用的报表导出工具,一般业务需求基本都可以满足,我们第一步导入基本的jar包,这里导入的是3.10的版本,不是最新的。

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.10-FINAL</version>
        </dependency>

然后基本的导出代码如下:

    public HSSFWorkbook export() throws Exception {
        // 创建新工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFCellStyle cellStyle = titlStyle(workbook);
        //bigdataip=192.168.100.104, qxname=wwwwwww, port=9595, totalNum=210217
        // 创建表头以及字段名称
        HSSFSheet sheet = workbook.createSheet(name);
        sheet.setColumnWidth(0, 256*15); 
        sheet.setColumnWidth(1, 256*30); 
        sheet.setColumnWidth(2, 256*18); 
        sheet.setColumnWidth(3, 256*18); 
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 10));
        HSSFRow row = sheet.createRow(0);
        HSSFCell cell = row.createCell(0);
        cell.setCellValue( "");
        cell.setCellStyle(cellStyle);
        
        HSSFCellStyle cellStyleNei = workbook.createCellStyle();
        // 新建font实体
        HSSFFont hssfFontNei = workbook.createFont();
        // 字体大小
        hssfFontNei.setFontHeightInPoints((short) 14);
        hssfFontNei.setFontName("宋体");
        // 粗体
        hssfFontNei.setBoldweight(Font.BOLDWEIGHT_BOLD);
        
        cellStyleNei.setFont(hssfFontNei);
        
        
        HSSFRow row1 = sheet.createRow(1);
        HSSFCell cell1 = row1.createCell(0);
        cell1.setCellValue("xxx");
        cell1.setCellStyle(cellStyleNei);
        HSSFCell cell2 = row1.createCell(1);
        cell2.setCellValue("xxx");
        cell2.setCellStyle(cellStyleNei);
        HSSFCell cell3 = row1.createCell(2);
        cell3.setCellValue("xxx");
        cell3.setCellStyle(cellStyleNei);
        HSSFCell cell4 = row1.createCell(3);
        cell4.setCellValue("xxx");
        cell4.setCellStyle(cellStyleNei);
        
        HSSFCellStyle cellStyleNeiR = workbook.createCellStyle();
        // 新建font实体
        HSSFFont hssfFontNeiR = workbook.createFont();
        // 字体大小
        hssfFontNeiR.setFontHeightInPoints((short) 12);
        hssfFontNeiR.setFontName("宋体");
        // 粗体
        hssfFontNeiR.setBoldweight(Font.BOLDWEIGHT_BOLD);
        
        cellStyleNeiR.setFont(hssfFontNeiR);
        
        for(int i =0 ;i<dataList.size();i++) {
            HSSFRow rowf = sheet.createRow(i+2);
            HSSFCell cellf1 = rowf.createCell(0);
            cellf1.setCellValue(dataList.get(i).get("key值"));
            cellf1.setCellStyle(cellStyleNeiR);
            HSSFCell cellf2 = rowf.createCell(1);
            cellf2.setCellValue(dataList.get(i).get("key值"));
            cellf2.setCellStyle(cellStyleNeiR);
            HSSFCell cellf3 = rowf.createCell(2);
            cellf3.setCellValue(dataList.get(i).get("key值"));
            cellf3.setCellStyle(cellStyleNeiR);
            HSSFCell cellf4 = rowf.createCell(3);
            cellf4.setCellValue(dataList.get(i).get("key值"));
            cellf4.setCellStyle(cellStyleNeiR);
        }
    

        // 输出到磁盘中 放开这段代码可以直接将excel导出到桌面
        /*String ip_yh = tools.getIpAddress(request);
        FileSystemView fsv = FileSystemView.getFileSystemView();
        File com=fsv.getHomeDirectory(); 
        String cdopt = com.getPath();
        cdopt =cdopt.replaceAll("\\","/");
        File file = new File(cdopt +"/"+ name +ip_yh+ "数据统计.xls" );
        FileOutputStream fos = new FileOutputStream(file);
        workbook.write(fos);
        fos.close();*/
        return workbook ;

    }

然后我们写servlet:

@RequestMapping(value = "/cprint")
    @ResponseBody
    public void download(HttpServletRequest request, HttpServletResponse response) {
      
        poiExcle poiexcle = new poiExcle();
        try {
            wb = poiexcle.export();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            String fileName = "数据统计.xls";
           

            response.setContentType("application/octet-stream");
            response.setHeader("name", fileName);
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setDateHeader("Expires", 0);
            response.setHeader("Content-disposition",
                    "attachment; filename="" + URLEncoder.encode(fileName, "UTF-8") + """);

            wb.write(response.getOutputStream()); // 输出流控制workbook

            response.getOutputStream().flush();

            response.getOutputStream().close();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

最主要的代码就是这一段:

  response.setContentType("application/octet-stream");
            response.setHeader("name", fileName);
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setDateHeader("Expires", 0);
            response.setHeader("Content-disposition",
                    "attachment; filename="" + URLEncoder.encode(fileName, "UTF-8") + """);

            wb.write(response.getOutputStream()); // 输出流控制workbook

            response.getOutputStream().flush();

            response.getOutputStream().close();

将  HSSFWorkbook 对象写到 response里的输出流,一定要记得将 filename 设置一下编码,不然会显示 ____.xls

ps.刚实习,时间不太够,先这样简单记录一下,后面慢慢整理。

以上是关于poi 制作 excel 并且以文件流的方式 传输到客户端下载的主要内容,如果未能解决你的问题,请参考以下文章

POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

我想用java poi 写个EXCEL导出工具,用啥设计模式写比较好,原因是啥?

java poi 提取txt文件内容添加到excel

Java中如何读取excel文件内容并且将内容以表格的形式显示在窗体里?

Java读取Hbase数据,使用POI操作Excel模板,并定时发送带有Excel附件的邮件

利用POi3.8导出excel产生大量xml临时文件怎么办?