java生成excel文件,以及导出

需求:

1.公司需要实现导出Excel模板功能,以及传入该模板中的内容进行后台接收转换(业务代码均已删除,可能会出现业务代码报错情况删除既可,logger.info效果等同于systemm.out.println(“”))

注:1.该功能实现为ssm模式,出参直接为response。

       2.该功能导入excel数据解析仅支持xlsx格式,老版本格式不支持(能用但是有坑)

maven依赖为

	<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.12</version>
		</dependency>

1.生成excel模板前端下载

1.1前端代码为

 function toDown() {
        window.location.href = "${ctx}/excelReportManager/excelReport/download"
    }

1.2后端引入为(仅展示excel引包,没有输入输出流,仅供参考)

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;

1.3后端代码为

 /**
     * 导出模板
     *
     * @param response
     * @param request
     * @throws IOException
     */
    @RequestMapping(value = "/download", produces = "text/html;charset=UTF-8")
    public void download(HttpServletResponse response, HttpServletRequest request) {
        //创建HSSFWorkbook对象
        try (HSSFWorkbook wb = new HSSFWorkbook()) {
            LOGGER.info("进入导出模板方法");
            //创建HSSFSheet对象
            HSSFSheet sheet = wb.createSheet("导出模板");
            //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
            HSSFRow row1 = sheet.createRow(0);
            //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
            HSSFCell cell = row1.createCell(0);
            //合并单元格
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
            //向合并单元格中输入字段
            cell.setCellValue("客户支付流程跟踪导入和统计");
            //在sheet里创建第二行(下标为1)
            HSSFRow row2 = sheet.createRow(1);
            //创建单元格并设置单元格内容
            row2.createCell(0).setCellValue("渠道类型");
            row2.createCell(1).setCellValue("操作步骤");
            row2.createCell(2).setCellValue("操作总次数");
            row2.createCell(3).setCellValue("备用字段1");
            row2.createCell(4).setCellValue("备用字段2");
            row2.createCell(5).setCellValue("备用字段3");
            //输出Excel文件
            OutputStream output = response.getOutputStream();
            response.reset();
            //filename=后面跟文件名
            response.setHeader("Content-disposition", "attachment; filename=template.xlsx");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            LOGGER.info("即将输出文件流");
            wb.write(output);
            output.flush();
            output.close();
        } catch (Exception e) {
            LOGGER.error("导出统计模板生成excel异常", e);
        } finally {
            RequestContextLocal.bindUserOperation("下载模板", "客户支付流程跟踪导入和统计菜单");
        }
        LOGGER.info("方法运行结束");
    }

实现结果

 

2.导入数据

1.1前端代码为

1.1.1html部分

 <a href="javascript:;"  class="file" style="font-size: 18px;float: left;margin-left: 20px">导入数据
                                        <input type="file" id="file1" onclick="return yz()" onchange="sc()">
                                    </a>

1.1.2js部分 

function sc() {
        var file = document.getElementById("file1").value
        if (file == '') {
            alert("请选择excel,再导入");
        } else if (file.lastIndexOf(".xlsx") < 0 ||file.lastIndexOf(".xls") < 0) {
            alert("只能导入Excel文件");
        } else {
     
            var formData = new FormData();
                   formData.append("file",$("#file1")[0].files[0]);
                   $.ajax({
                       url:'${ctx}/excelReportManager/excelReport/upload',
                       type:'POST',
                       async:false,
                       dataType:'json',
                       data:formData ,
                         // 告诉jQuery不要去处理发送的数据
                               processData : false,
                               // 告诉jQuery不要去设置Content-Type请求头
                               contentType : false,
                               beforeSend:function(){
                                   console.log("正在进行,请稍候");
                               },
                                success : function(responseStr) {
                               }

                   })


                   }
    }

1.2后端代码为(引包为导入的引包)

 /**
     * 客户支付流程跟踪导入和统计
     *
     * @param file
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("upload")
    @ResponseBody
    public void upload(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException {
        JSONObject json = new JSONObject();
        //获取输入流
        InputStream is = file.getInputStream();
        LOGGER.info("获取输入流成功即将转换为excel");
        Workbook workbook = new HSSFWorkbook(is);
        //获取第一张工作表
        Sheet sheet = workbook.getSheetAt(0);
        //从第二行开始获取 getLastRowNum
        LOGGER.info("获取到的页面总行数为{}", sheet.getLastRowNum());
        //循环每一行(因前两行为固定代码,所以从第三行开始(从下标0开始第三个为2))
        for (int i = 2; i < sheet.getLastRowNum(); i++) {
            Row sheetRow = sheet.getRow(i);
            SpPayProcessTrackingBankRecord spPayProcessTrackingBankRecord = new SpPayProcessTrackingBankRecord();
            //循环获取每一列
            try {
                //获取i行第一列   Cell.CELL_TYPE_STRING为poi提供的枚举,该字段的类型  以下两行代码需组合调用
                sheetRow.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
                String appTp = sheetRow.getCell(0).getStringCellValue();
                //获取i行第二列
                sheetRow.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
                String name = (sheetRow.getCell(1).getStringCellValue());
                //获取i行第三列
                sheetRow.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
                String id = (sheetRow.getCell(2).getStringCellValue());

            } catch (NullPointerException e) {
                LOGGER.error((i - 1) + "行数据不合法,请重新导入,异常信息为", e);
                //如果单元格为空会爆出空指针
                json.put("hint", (i - 1) + "行数据不合法,请重新导入");
                response.getWriter().print(json.toString());

            }
        }

        workbook.close();
        //导出成功转为list后的增加操作
        LOGGER.info("执行添加操作成功,条数为{}", count);
        //进行下一步操作
        json.put("hint", "共有" + count + "条数据导入成功");
        response.getWriter().print(json.toString());


    }

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值