基于hutoolt的ExcelWriter导出复杂表格

11 篇文章 0 订阅

hutool的ExcelWriter导出复杂表格

1.效果图如下
在这里插入图片描述

平常导出请参考官方文档:https://hutool.cn/docs/#/poi/Excel生成-ExcelWriter

Page page = this.getList(new Page(1, 9999), orderQuery);
    List<OrderVO> orderVOList = page.getRecords();
    ExcelWriter writer = ExcelUtil.getWriter();
    List<List<Object>> rows = new LinkedList<>();
    //首先创建表头
    List<String> rowHead = CollUtil.newArrayList("订单编号", "订单类型", "买家名称", "卖家名称", "所属端", "订单总金额", "支付总金额", "订单状态", "订单创建时间"
            ,"商品名称","规格","品牌","商品价格","商品数量","明细商品总金额");
    //写入表头
    writer.writeHeadRow(rowHead);
    // 定义起始行
    AtomicInteger num = new AtomicInteger(1);
    orderVOList.stream().forEach(result->{
     if(result.getDetails().size() == 1 ){
                // 只有一条数据时不合并
                num.set(num.get()+1);
      }else(result.getDetails().size() > 1){
            // 创建合并规则    result.getDetails().size()-1 如果不减去1则会造成数据紊乱,下一条数据会合并到上一条中
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 0, 0, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 1, 1, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 2, 2, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 3, 3, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 4, 4, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 5, 5, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 6, 6, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 7, 7, null, true);
            writer.merge(num.get(), num.get() + result.getDetails().size()-1, 8, 8, null, true);
            // 明细占据的总行数
            num.set(num.get() + result.getDetails().size()+1);
        }
        result.getDetails().stream().forEach(item->{
            List<Object> rowA = CollUtil.newArrayList(
                    result.getOrderNo()
                    , result.getOrderType() == 1?"自费订单":"代付订单"
                    , result.getBuyer()
                    , result.getSeller()
                    , result.getBelongType() == 1 ? "客户端" : "平台端"
                    , result.getTotalAmount()
                    , result.getPayTotalAmount()
                    , OrderStatusEnum.findDescByCode(result.getOrderStatus())
                    , result.getCreateTime()
                    , item.getProductName()
                    , item.getSpecifications()
                    , item.getBrandName()
                    , item.getProductPrice()
                    , item.getProductNum()
                    , item.getTotalAmount()
            );
            rows.add(rowA);
        });
    });
    // 一次性写出内容,使用默认样式,强制输出标题
    writer.write(rows, true);
    //设置宽度自适应
    writer.setColumnWidth(-1, 30);
    //中文编码,没用到,使用中文还是乱码
    String fileName = null;
    try {
        fileName = URLEncoder.encode("客户订单" + new Date().toString(), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
    ServletOutputStream out = null;
    try {
        out = response.getOutputStream();
        writer.flush(out, true);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 关闭writer,释放内存
        writer.close();
    }
    //关闭输出Servlet流
    IoUtil.close(out);
}
存
        writer.close();
    }
    //关闭输出Servlet流
    IoUtil.close(out);
}

vue前端

<el-col :span="6" style="margin-bottom:8px">
            <el-button @click="exportList()">导出</el-button>
 </el-col>



 exportList() {
      this.getNowDate()
      this.loading = true
      this.$axios({
        url: '你的后端url',
        method: 'post',
        params: {
          orderNo: this.form.orderNo,
          consumerCompanyName: this.form.consumerCompanyName,
          companyName: this.form.companyName,
          belongType: 1,
          orderType: 2,
          orderWay: -1,
        },
        responseType: 'blob',
      }).then((res) => {
        this.loading = false
        let blob = new Blob([res.data], {
          type: 'application/vnd.ms-excel;charset=utf-8;',
        })
        // 组装a标签
        let elink = document.createElement('a')
        elink.style.display = 'none'
        //下载文件名
        elink.download = '订单表' + this.nowDate
        elink.href = URL.createObjectURL(blob)
        document.body.appendChild(elink)
        elink.click()
        document.body.removeChild(elink)
      })
    },
    //获取年月日时间
    getNowDate() {
      var date = new Date()
      this.year = date.getFullYear() //年
      this.month = date.getMonth() + 1 //月
      this.strDate = date.getDate() //日
      if (this.month >= 1 && this.month <= 9) {
        this.month = '0' + this.month
      }
      if (this.strDate >= 0 && this.strDate <= 9) {
        this.strDate = '0' + this.strDate
      }
      this.nowDate =
        this.year +
        '-' +
        this.month +
        '-' +
        this.strDate +
        Math.floor(Math.random() * 100)
    },
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值