vue2文件下载和合计表格

vue2文件数据不多可以直接下载不需要后端的时候

1.首先,确保你已经安装了 docxfile-saver

npm install file-saver
npm install docx file-saver

2.全部代码如下

<template>
  <a-modal
    title="详情"
    width="80%"
    v-model="visible"
    :confirmLoading="confirmLoading"
  >
    <a-descriptions title="" bordered>
      <a-descriptions-item label="出租方">{{ form.rentOrg }}</a-descriptions-item>
      <a-descriptions-item label="承租方">{{ form.lesseeOrg }}</a-descriptions-item>
      <a-descriptions-item label="统一社会信息代码">{{ form.socialCode }}</a-descriptions-item>
      <a-descriptions-item label="合同时间">{{ form.startDate }}-{{ form.endDate }}</a-descriptions-item>
      <a-descriptions-item label="合同编号">{{ form.contractNo }}</a-descriptions-item>
      <a-descriptions-item label="合同名称">{{ form.contractName }}</a-descriptions-item>
    </a-descriptions>
    <div class="table-operator">
      <a-button type="primary" @click="generateDocx">下载缴费单</a-button>
    </div>
    <a-table
      ref="table"
      rowKey="id"
      :columns="columns"
      :dataSource="dataSource"
      :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
      bordered
    >
      <span slot="action" slot-scope="text, record">
        <a v-if="record.payStatus == 1" @click="payment(record, false)">缴费</a>
        <a v-else @click="payment(record, true)">详情</a>
      </span>
    </a-table>
    <costDeatil ref="costDeatil" @getBillDetail="getBillDetail"></costDeatil>
    <div slot="footer">
      <a-button type="dashed" @click="visible = false">关闭</a-button>
    </div>
  </a-modal>
</template>

<script>
import costDeatil from "./components/costDeatil.vue";
import { getBillDetail } from "@/api/assetrentplan";
import { JeecgListMixin } from "@/mixins/JeecgListMixin";
import { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, WidthType } from "docx";
import { saveAs } from "file-saver";

export default {
  components: { costDeatil },
  mixins: [JeecgListMixin],
  data() {
    return {
      visible: false,
      confirmLoading: false,
      columns: [
        {
          title: "费用周期",
          dataIndex: "date",
          align: "center",
          customRender: (text, record) => `${record.startDate}-${record.endDate}`,
        },
        {
          title: "租约到期日期",
          dataIndex: "rentEndDate",
          align: "center",
        },
        {
          title: "应收金额(元)",
          dataIndex: "shouldPayMoney",
          align: "center",
        },
        {
          title: "缴费状态",
          dataIndex: "payStatus",
          align: "center",
          customRender: (text) => `${text == 1 ? "待缴费" : "已缴费"}`,
        },
        {
          title: "实收金额",
          dataIndex: "realPayMoney",
          align: "center",
        },
        {
          title: "实收日期",
          dataIndex: "realPayDate",
          align: "center",
        },
        {
          title: "操作人",
          dataIndex: "operatePersonName",
          align: "center",
        },
        {
          title: "操作日期",
          dataIndex: "operateDate",
          align: "center",
        },
        {
          title: "操作",
          width: "150px",
          scopedSlots: { customRender: "action" },
          align: "center",
        },
      ],
      selectedRowKeys: [],
      disableMixinCreated: true,
      form: {},
      pagination: {
        current: 1,
        pageSize: 10,
        total: 0,
        showTotal: (total) => `共 ${total} 条数据`,
      },
    };
  },
  methods: {
    payment(record, disabled) {
      this.$refs.costDeatil.clickShowModal(record, disabled);
    },
    onSelectChange(row) {
      this.selectedRowKeys = row;
    },
    getBillDetail() {
      this.loading = true;
      getBillDetail(this.form.id)
        .then((res) => {
          this.loading = false;
          if (res.code == 0) {
            this.form = res.data;
            this.dataSource = res.data.assetRentBillList;
          }
        })
        .catch((err) => {
          this.loading = false;
        });
    },
    clickShowModal(record) {
      this.visible = true;
      this.dataSource = [];
      this.form = record;
      this.getBillDetail();
    },
    generateDocx() {
      const doc = new Document({
        sections: [
          {
            children: [
              new Paragraph({
                children: [
                  new TextRun({
                    text: "缴费单详情",
                    bold: true,
                    size: 24,
                  }),
                ],
              }),
              new Table({
                rows: [
                  new TableRow({
                    children: [
                      new TableCell({
                        children: [new Paragraph("费用周期")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("租约到期日期")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("应收金额(元)")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("缴费状态")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("实收金额")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("实收日期")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("操作人")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                      new TableCell({
                        children: [new Paragraph("操作日期")],
                        width: { size: 10, type: WidthType.PERCENTAGE },
                      }),
                    ],
                  }),



//在 docx 库中,确保你处理数据时避免出现空值或未定义的值是很重要的。你可以通过在构建文档时检查并处理这些空值来避免这种错误。
                  ...this.dataSource.map((item) =>
                    new TableRow({
                      children: [
                        new TableCell({
                          children: [new Paragraph(`${item.startDate || ''}-${item.endDate || ''}`)],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.rentEndDate || '')],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.shouldPayMoney != null ? item.shouldPayMoney.toString() : '')],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.payStatus == 1 ? "待缴费" : "已缴费")],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.realPayMoney != null ? item.realPayMoney.toString() : '')],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.realPayDate || '')],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.operatePersonName || '')],
                        }),
                        new TableCell({
                          children: [new Paragraph(item.operateDate || '')],
                        }),
                      ],
                    })
                  ),
                ],
              }),
            ],
          },
        ],
      });

      Packer.toBlob(doc).then((blob) => {
        saveAs(blob, "缴费单详情.docx");
      });
    },
  },
};
</script>

vue2数据很多的时候需要后端

 <a-button type="primary" style="margin-left: 8px" @click="getExport"
        >下载导入模板</a-button
      >
import { downloadFile } from "@/api/manage";

 

 api/manage代码如下

// import { axios } from '@/utils/request'
import axios from "@/utils/axios";
import signMd5Utils from "@/utils/encryption/signMd5Utils";

const api = {
  user: "/mock/api/user",
  role: "/mock/api/role",
  service: "/mock/api/service",
  permission: "/mock/api/permission",
  permissionNoPager: "/mock/api/permission/no-pager",
};

export default api;

//post
export function postAction(url, parameter) {
  let sign = signMd5Utils.getSign(url, parameter);
  //将签名和时间戳,添加在请求接口 Header
  let signHeader = {
    "X-Sign": sign,
    "X-TIMESTAMP": signMd5Utils.getDateTimeToString(),
  };

  return axios({
    url: url,
    method: "post",
    data: parameter,
    headers: signHeader,
  });
}

//post method= {post | put}
export function httpAction(url, parameter, method) {
  let sign = signMd5Utils.getSign(url, parameter);
  //将签名和时间戳,添加在请求接口 Header
  let signHeader = {
    "X-Sign": sign,
    "X-TIMESTAMP": signMd5Utils.getDateTimeToString(),
  };

  return axios({
    url: url,
    method: method,
    data: parameter,
    headers: signHeader,
  });
}

//put
export function putAction(url, parameter) {
  return axios({
    url: url,
    method: "put",
    data: parameter,
  });
}

//get
export function getAction(url, parameter) {
  let sign = signMd5Utils.getSign(url, parameter);
  //将签名和时间戳,添加在请求接口 Header
  let signHeader = {
    "X-Sign": sign,
    "X-TIMESTAMP": signMd5Utils.getDateTimeToString(),
  };

  return axios({
    url: url,
    method: "get",
    params: parameter,
    headers: signHeader,
  });
}

//deleteAction
export function deleteAction(url, parameter) {
  return axios({
    url: url,
    method: "delete",
    params: parameter,
  });
}

export function getUserList(parameter) {
  return axios({
    url: api.user,
    method: "get",
    params: parameter,
  });
}

export function getRoleList(parameter) {
  return axios({
    url: api.role,
    method: "get",
    params: parameter,
  });
}

export function getServiceList(parameter) {
  return axios({
    url: api.service,
    method: "get",
    params: parameter,
  });
}

export function getPermissions(parameter) {
  return axios({
    url: api.permissionNoPager,
    method: "get",
    params: parameter,
  });
}

// id == 0 add     post
// id != 0 update  put
export function saveService(parameter) {
  return axios({
    url: api.service,
    method: parameter.id == 0 ? "post" : "put",
    data: parameter,
  });
}

/**
 * 下载文件 用于excel导出
 * @param url
 * @param parameter
 * @returns {*}
 */
export function downFile(url, parameter, method) {
  return axios({
    url: url,
    params: parameter,
    method: method ? method : "get",
    responseType: "blob",
  });
}

/**
 * 下载文件
 * @param url 文件路径
 * @param fileName 文件名
 * @param parameter
 * @returns {*}
 */
export function downloadFile(url, fileName, parameter,method) {
  return downFile(url, parameter,method).then((data) => {
    // if (!data || data.size === 0) {
    //   Vue.prototype['$message'].warning('文件下载失败')
    //   return
    // }
    if (typeof window.navigator.msSaveBlob !== "undefined") {
      window.navigator.msSaveBlob(new Blob([data]), fileName);
    } else {
      let url = window.URL.createObjectURL(new Blob([data]));
      let link = document.createElement("a");
      link.style.display = "none";
      link.href = url;
      link.setAttribute("download", fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link); //下载完成移除元素
      window.URL.revokeObjectURL(url); //释放掉blob对象
    }
  });
}

/**
 * 文件上传 用于富文本上传图片
 * @param url
 * @param parameter
 * @returns {*}
 */
export function uploadAction(url, parameter) {
  return axios({
    url: url,
    data: parameter,
    method: "post",
    headers: {
      "Content-Type": "multipart/form-data", // 文件上传
    },
  });
}

/**
 * 获取文件服务访问路径
 * @param avatar
 * @param subStr
 * @returns {*}
 */
export function getFileAccessHttpUrl(avatar, subStr) {
  if (!subStr) subStr = "http";
  try {
    if (avatar && avatar.startsWith(subStr)) {
      return avatar;
    } else {
      if (avatar && avatar.length > 0 && avatar.indexOf("[") == -1) {
        return window._CONFIG["staticDomainURL"] + "/" + avatar;
      }
    }
  } catch (err) {
    return;
  }
}

 

  //导出模板
    getExport() {
      downloadFile(
        "/asset/entryrecord/exportTemplateXls",
        "财务信息模板.xlsx",
        {},
        "post"
      );
    },

合计

效果如图

代码

 columns: [
        {
          title: "序号",
          customRender: (text, record, index) => {
            if (record.isTotalRow) {
              return {
                children: "合计",
                attrs: { colSpan: 3 },
              };
            }
            return index + 1;
          },
          width: 70,
          align: "center",
        },
        {
          title: "企业名称",
          align: "center",
          dataIndex: "companyName",
          width: 150,
          customRender: (text, record, index) => {
            if (record.isTotalRow) {
              return {
                children: null,
                attrs: { colSpan: 0 },
              };
            }
            return text;
          },
        },
        {
          title: "转让资产名称",
          align: "center",
          dataIndex: "assetName",
          width: 150,
          customRender: (text, record, index) => {
            if (record.isTotalRow) {
              return {
                children: null,
                attrs: { colSpan: 0 },
              };
            }
            return text;
          },
        },
        {
          title: "账面净值(元)",
          align: "center",
          dataIndex: "bookMoney",
          width: 150,
        },
        {
          title: "转让方式",
          align: "center",
          dataIndex: "transferWay",
          width: 150,
          customRender: (text, record, index) => {
            switch (Number.parseInt(text)) {
              case 1:
                return "公开转让";
              case 2:
                return "协议转让";
              default:
                return "/";
            }
          },
        },
        {
          title: "转让行为最终审批单位",
          align: "center",
          dataIndex: "transferFinalOrg",
          width: 150,
          customRender: (text, record, index) => {
            switch (Number.parseInt(text)) {
              case 1:
                return "市政府";
              case 2:
                return "左海集团";
              case 3:
                return "二级企业";
              default:
                return "/";
            }
          },
        },
        {
          title: "受让方名称",
          align: "center",
          dataIndex: "receiveName",
          width: 150,
        },
        {
          title: "受让方性质",
          align: "center",
          dataIndex: "receiveType",
          width: 150,
          customRender: (text, record, index) => {
            switch (Number.parseInt(text)) {
              case 1:
                return "个人";
              case 2:
                return "私有企业";
              case 3:
                return "国有全资企业";
              case 4:
                return "国有控股企业";
              case 5:
                return "国有实际控制企业";
              case 6:
                return "国有参股企业";
              default:
                return "其他";
            }
          },
        },
        {
          title: "评估价值(元)",
          align: "center",
          dataIndex: "evaluateMoney",
          width: 150,
        },
        {
          title: "转让底价(元)",
          align: "center",
          dataIndex: "transferMinPrice",
          width: 150,
        },
        {
          title: "成交金额(元)",
          align: "center",
          dataIndex: "dealMoney",
          width: 150,
        },
        {
          title: "溢价(元)",
          align: "center",
          dataIndex: "moreMoney",
          width: 150,
        },
        {
          title: "转让合同签订日期",
          align: "center",
          dataIndex: "signDate",
          width: 150,
        },
        {
          title: "备注",
          align: "center",
          dataIndex: "remark",
          width: 150,
        },
      ],
  assetTransferAllCount() {
      this.loading = true;
      const meta = { companyName: this.queryParam.companyName };
      // console.log("this.queryParam", this.queryParam);
      assetTransferAllCount(meta)
        .then((res) => {
          this.loading = false;
          if (res.code == 0) {
            console.log("res", res);
            this.dataSource = res.data.list;
            // console.log(" this.dataSource", this.dataSource);
            // 使用解构赋值简化对象创建过程
            const {
              bookMoney,
              transferWay,
              transferFinalOrg,
              receiveName,
              receiveType,
              evaluateMoney,
              transferMinPrice,
              dealMoney,
              moreMoney,
              signDate,
              remark,
            } = res.data;

            const obj = {
              isTotalRow: true,
              bookMoney,
              transferWay: "/",
              transferFinalOrg: "/",
              receiveName: "/",
              receiveType: "/",
              evaluateMoney,
              transferMinPrice,
              dealMoney,
              moreMoney,
              signDate: "/",
              remark,
            };

            this.dataSource.push(obj);
            // console.log(" this.dataSource22", this.dataSource);
          }
        })
        .catch((error) => {
          this.loading = false;
          console.error("Error fetching data:", error);
        });
    },

重点是

  this.dataSource.push(obj);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【x264】变换量化模块的简单分析

【x264】变换量化模块的简单分析 1. 变换量化1.1 变换&#xff08;transform&#xff09;1.2 量化&#xff08;quant&#xff09; 2. 编码入口&#xff08;x264_macroblock_encode&#xff09;2.1 内部编码&#xff08;macroblock_encode_internal&#xff09;2.1.1 SKIP模式2.…

CSS 字体颜色渐变

CSS 字体颜色渐变 css 代码: 注意&#xff1a;background: linear-gradient&#xff08;属性&#xff09;&#xff0c;属性可以调整方向 例如&#xff1a;to bottom 上下结构&#xff0c;to right 左右结构font-family: DIN, DIN;font-weight: normal;font-size: 22px;color:…

索尼cfa卡格式化了怎么恢复数据?这2种方法请收好

在摄影和视频制作领域&#xff0c;索尼CFA卡作为一种高性能的存储介质&#xff0c;深受专业用户的喜爱。然而&#xff0c;有时我们可能会不小心对CFA卡进行格式化操作&#xff0c;导致重要数据丢失。当面对这种情况时&#xff0c;许多用户会感到焦虑和困惑。本文将介绍索尼CFA卡…

线性代数|机器学习-P13计算特征值和奇异值

文章目录 1. 特征值1.1 特征值求解思路1.1 相似矩阵构造 1. 特征值 1.1 特征值求解思路 我们想要计算一个矩阵的特征值&#xff0c;一般是用如下公式&#xff1a; ∣ ∣ A − λ I ∣ ∣ 0 → λ 1 , λ 2 , ⋯ , λ n \begin{equation} ||A-\lambda I||0\rightarrow \lamb…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网&#xff1a;https://github.com/zhang-tong-yao/wall 软件下载&#xff1a;https://github.com/zhang-tong-yao/wall/releases&#xff0c;推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址&#xff1a;https://demo-wall.ityao.cn …

Python酷库之旅-比翼双飞情侣库(02)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

盘点|AI大模型时代,2024医疗器械网络安全应对与挑战(上)

6月5日&#xff0c;以“AI驱动安全”为主题&#xff0c;2024全球数字经济大会数字安全高层论坛&#xff0c;暨北京网络安全大会战略峰会在北京国家会议中心开幕。 与会专家指出&#xff0c;攻击者可利用人工智能技术生成网络攻击和网络钓鱼工具&#xff0c;网络安全从人人对抗、…

多模态大模型:识别和处理图片与视频的技术详解

多模态大模型&#xff1a;识别和处理图片与视频的技术详解 多模态大模型&#xff1a;识别和处理图片与视频的技术详解1. 什么是多模态大模型&#xff1f;2. 多模态大模型的基本架构3. 识别和处理图片3.1 图像特征提取3.2 图像分类与识别3.3 图像生成与增强 4. 识别和处理视频4.…

【个人博客搭建】(25)做一个图形验证码功能

在系统的注册、登录等场景&#xff0c;都有很多类似的案例。也有类似于滑动验证、选字顺序验证等效果。今天带来的是文件流形式的&#xff0c;相当于动态图片吧 1、安装nuget包&#xff1a;Lazy.Captcha.Core 2、 在入口文件中注入&#xff1a; #region 图形验证码builder.Ser…

Spring对事务的支持

一、事务 事务防止进行操作时&#xff0c;数据库里面的数据丢失。 二、Spring事务注解方式 注解方式&#xff1a;在配置文件中配置事务管理器&#xff0c;利用注解&#xff0c;管理事务。 实例 银行转账&#xff1a;一个账户向另一个账户转账。 1&#xff09;先在数据库my…

串联谐振回路

等效电路 电感的损耗电阻&#xff0c;频率越高越大&#xff0c;与电感串联&#xff0c;会分走电压&#xff0c;不可忽略。 电容的漏电电阻&#xff0c;等效阻值大&#xff0c;与电容并联&#xff0c;高频时&#xff0c;电容容抗小&#xff0c;漏电电阻几乎分不走电流&#xf…

找不到libcef.dll是怎么回事?libcef.dll丢失的6种修复方法

在使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“电脑提示libcef.dll丢失”。这个问题可能让人感到困惑和烦恼&#xff0c;但通过了解其原因和解决方法&#xff0c;我们可以更好地应对类似的问题。在本文中&#xff0c;我将分享我对于“电…

QML Canvas 代码演示

一、文字阴影 / 发光 Canvas{id: root; width: 400; height: 400onPaint: //所有的绘制都在onPaint中{var ctx getContext("2d") //获取上下文// 绘制带阴影的文本ctx.fillStyle "#333" //设置填充颜色ctx.fillRect(0, 0, root.width, root.height…

Fluid 1.0 版发布,打通云原生高效数据使用的“最后一公里”

作者&#xff1a;顾荣 前言 得益于云原生技术在资源成本集约、部署运维便捷、算力弹性灵活方面的优势&#xff0c;越来越多企业和开发者将数据密集型应用&#xff0c;特别是 AI 和大数据领域应用&#xff0c;运行于云原生环境中。然而&#xff0c;云原生计算与存储分离架构虽…

【数字化转型,销售先行】销售的数字化转型需要做哪些工作?

引言&#xff1a;销售进行数字化转型的背景主要包括市场环境的快速变化、新技术发展的推动、企业发展的需求以及数据驱动决策的需求。这些背景因素共同促使企业加快数字化转型步伐&#xff0c;以适应市场变化、提升竞争力并实现可持续发展。 销售的数字化转型包含哪些内容&…

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game

群晖NAS安装配置Joplin Server用来存储同步Joplin笔记内容

一、Joplin Server简介 1.1、Joplin Server介绍 Joplin支持多种方式进行同步用户的笔记数据&#xff08;如&#xff1a;Joplin自己提供的收费的云服务Joplin Cloud&#xff0c;还有第三方的云盘如Dropbox、OneDrive&#xff0c;还有自建的云盘Nextcloud、或者通过WebDAV协议来…

-bash: unzip: command not found

1、报错截图如下 2、解决办法 yum install unzip

【Python/Pytorch - 网络模型】-- 手把手搭建3D VGG感知损失模型

文章目录 文章目录 00 写在前面01 基于Pytorch版本的3D VGG代码02 论文下载 00 写在前面 感知损失&#xff1a;对于提升图片的肉眼可见细节&#xff0c;效果十分明显&#xff1b;对于一些指标如&#xff08;SSIM、PSNR&#xff09;这些&#xff0c;效果不明显。 在01中&…

微服务之远程调用

常见的远程调用方式 RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&#xff0c;基于原生TCP通信&#xff0c;速度快&#xff0c;效率高。早期的webservice&#xff0c;现在热门的dubbo &#xff08;12不再维护、17年维护权交给apac…