美文网首页
使用Java导出Excel表格并由浏览器直接下载——基于POI框

使用Java导出Excel表格并由浏览器直接下载——基于POI框

作者: 墨色尘埃 | 来源:发表于2020-04-13 17:43 被阅读0次

使用Java导出Excel表格并由浏览器直接下载——基于POI框架

非异步方法

    /**
     * 使用Java导出Excel表格并由浏览器直接下载——基于POI框架
     *
     * @param response
     * @return
     * @throws IllegalAccessException
     * @throws IOException
     */
    @RequestMapping(value = "/export2", method = RequestMethod.GET)
    public ResponseObj<Boolean> export2(HttpServletResponse response) throws IllegalAccessException, IOException {

        //文件名
        String fileName = "活动报名情况一览表";
        //sheet名
        String sheetName = "sheet";

        List<String> titleList = new ArrayList<>();
        titleList.add("name");
        titleList.add("address");


        List<Student> dataList = new ArrayList<>();
        dataList.add(new Student("张三", "连云港"));
        dataList.add(new Student("李四", "连云港"));

//        //如果我不想设置任何列为下拉选项,那我调用的时候将最后一个参数传入null即可。如果想设置某一列或某几列为下拉选项,那我调用的时候只需要这样(省略其他代码):
//        String[] params = new String[]{"是","否"};
//        //从第一行开始,到最后一行结束,设置第4列为下拉选项
//        OutExcelQuery outExcelQuery = new OutExcelQuery(1,-1,3,3,params);

        OutExcelQuery outExcelQuery = null;
        HSSFWorkbook workbook = service.createExcel(sheetName, titleList, dataList, outExcelQuery);

        //输出Excel文件
        OutputStream output = response.getOutputStream();
        response.reset();
        //中文名称要进行编码处理
        response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"),
                "ISO-8859-1") + ".xls");
        response.setContentType("application/x-xls");
        workbook.write(output);
        output.close();
        return new ResponseObj<>(true, null);

    }

    /**
     *  生成Excel表格
     * @param sheetName sheet名称
     * @param titleList 表头列表
     * @param dataList 数据列表
     * @param outExcelQuery 下拉选项设置
     * @return HSSFWorkbook对象
     * */
    public static HSSFWorkbook createExcel(String sheetName, List<String> titleList,
                                           List dataList, OutExcelQuery outExcelQuery) throws IllegalAccessException {

        //创建HSSFWorkbook对象(excel的文档对象)
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建sheet对象(excel的表单)
        HSSFSheet sheet=wb.createSheet(sheetName);
        //在sheet里创建第一行,这里即是表头
        HSSFRow rowTitle=sheet.createRow(0);

        //写入表头的每一个列
        for (int i = 0; i < titleList.size(); i++) {
            //创建单元格
            rowTitle.createCell(i).setCellValue(titleList.get(i));
        }

        int count = 0;
        //写入每一行的记录
        if (dataList!=null){
            for (int i = 0; i < dataList.size(); i++) {
                count++;
                //创建新的一行,递增
                HSSFRow rowData = sheet.createRow(i+1);

                //通过反射,获取POJO对象
                Class cl = dataList.get(i).getClass();
                //获取类的所有字段
                Field[] fields = cl.getDeclaredFields();
                for (int j = 0; j < titleList.size(); j++) {
                    //设置字段可见,否则会报错,禁止访问
                    fields[j].setAccessible(true);
                    //创建单元格
                    rowData.createCell(j).setCellValue((String) fields[j].get(dataList.get(i)));
                }
            }
        }

        //如果开启了下拉选项
        if (outExcelQuery!=null){
            //如果表格中的记录数不是0
            if (count!=0){
                // 获取下拉列表数据
                String[] strs = outExcelQuery.getParams();
                //设置哪些行的哪些列为下拉选项
                CellRangeAddressList rangeList =
                        new CellRangeAddressList(outExcelQuery.getRowStart(),
                                //结束行为-1时,说明设置所有行
                                outExcelQuery.getRowEnd()==-1?count:outExcelQuery.getRowEnd(),
                                outExcelQuery.getColStart(),outExcelQuery.getColEnd());
                //绑定下拉数据
                DVConstraint constraint = DVConstraint.createExplicitListConstraint(strs);
                //绑定两者的关系
                HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList,constraint);
                //添加到sheet中
                sheet.addValidationData(dataValidation);
            }
        }
        return wb;
    }

相关文章

网友评论

      本文标题:使用Java导出Excel表格并由浏览器直接下载——基于POI框

      本文链接:https://www.haomeiwen.com/subject/nmynmhtx.html