vue2文件下载和合计表格

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

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

npm install file-saver
npm install docx file-saver

2.全部代码如下

<template><a-modaltitle="详情"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-tableref="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);//将签名和时间戳,添加在请求接口 Headerlet 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);//将签名和时间戳,添加在请求接口 Headerlet 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);//将签名和时间戳,添加在请求接口 Headerlet 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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的a[:2]

数据准备 import numpy as np X np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]]) print(X)形成矩阵 print (“X[: 2]:”, X[: 2]) ### :表示索引 0至1行&#xff1b;

MySQL日常问题-行列互换

问题 行列互换 场景1 行转换列 1、表结构和数据 /*Navicat Premium Data TransferSource Server : 本地Source Server Type : MySQLSource Server Version : 80027Source Host : localhost:3306Source Schema : schoolTarget Server Type :…

windows 环境下使用git命令导出差异化文件及目录

一、找出差异化的版本&#xff08;再此使用idea的show history&#xff09; 找到两个提交记录的id 分别为&#xff1a; 二、使用git bash执行命令&#xff08;主要使用 tar命令压缩文件&#xff09; 输出结果&#xff1a;

“人事助理转产品经理”历险记

​好久没写就业喜报了 去年太忙&#xff0c;年后了&#xff0c;必须给大家把同学们就业的情况梳理一下分享出来。希望对大家有所帮助。 同学档案 原岗位&#xff1a;HR 地点&#xff1a;西安 工作年限&#xff1a;2年 转岗级别&#xff1a;中级产品经理 转岗工资&#xff1…

Linux时间子系统2: clock_gettime的VDSO机制分析

在之前分析clock_gettime的文章中接触到了VDSO&#xff0c;本篇文章是对VDSO的学习总结&#xff0c;借鉴了很多前人的经验。 1. 什么是VDSO vDSO:virtual DSO(Dynamic Shared Object)&#xff0c;虚拟动态共享库&#xff0c;内核向用户态提供了一个虚拟的动态共享库。在 Linux …

Vue.js结合ASP.NET Core构建用户登录与权限验证系统

1. 环境准备2. 创建项目3. Vue配置步骤一: 安装包步骤二: 配置文件步骤三: 页面文件 4. 后台配置 在本教程中&#xff0c;我将利用Visual Studio 2022的强大集成开发环境&#xff0c;结合Vue.js前端框架和ASP.NET Core后端框架&#xff0c;从头开始创建一个具备用户登录与权限验…

恭喜!X医生斩获英国伦敦大学学院访问学者邀请函

伦敦大学学院&#xff08;University College London&#xff0c;简称&#xff1a;UCL&#xff09;&#xff0c;1826年创立于英国伦敦&#xff0c;是一所公立研究型大学。伦敦大学联盟的创校学院、罗素大学集团和欧洲研究型大学联盟创始成员&#xff0c;也是金三角名校和G5之一…

电商开发者必读:微店商品详情API接口全解析

微店作为一个流行的电商平台&#xff0c;提供了丰富的API接口供开发者使用。详细介绍商品详情API接口的使用方法&#xff0c;帮助开发者快速获取商品信息&#xff0c;实现商品信息的自动化展示和管理。 1. 接口简介 微店商品详情API接口允许开发者通过商品ID获取商品的详细信…

银行业信息技术外包(ITO)深度解析:现状、挑战、业务分类与协同策略

一、引言 最近有朋友在咨询关于银行业信息技术外包&#xff08;ITO&#xff09;这块业务&#xff0c;同时也在网上看到了关于银行业信息技术外包&#xff08;ITO&#xff09;的相关信息&#xff0c;今天正好有时间&#xff0c;通过采集的相关信息结合自己的相关工作接触到的相关…

云原生应用开发培训,开启云计算时代的新征程

在云计算时代&#xff0c;云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域&#xff0c;我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布&#xff08;CI/CD&#…

Android低代码开发 - InputMenuPanelItem详解

我们知道MenuPanel是一个菜单面板容器&#xff0c;它里面可以放各式各样的菜单和菜单组。今天我们就来详细讲解输入菜单这个东西。 InputMenuPanelItem源码 package dora.widget.panel.menuimport android.content.Context import android.text.Editable import android.text…

怎么写自动注册苹果ID的工具,会用到哪些源代码?

在数字化时代&#xff0c;苹果ID成为了连接苹果生态系统中各项服务的关键桥梁&#xff0c;然而&#xff0c;手动注册苹果ID的过程往往繁琐且耗时&#xff0c;因此&#xff0c;开发一款能够自动注册苹果ID的工具成为了许多开发者的追求。 本文将科普如何编写这样的工具&#xf…

PFC旁路二极管、继电器驱动电路以及PFC主功率

R001和R002以及R003三个电阻作用是限放X电容上的电 整流桥串联两个BJ1和BJ2 电容C3:给整流桥储能&#xff0c;给后续llc供电 PFC工作是正弦波上叠加高频电流 PFC功率部分 2个PFC电感&#xff08;选择两个磁芯骨架小&#xff0c;有利于散热&#xff09;、2个续流二极管&…

在亚马逊云上部署WordPress:一个完整的LAMP环境安装教程

什么是LAMP LAMP是一个流行的开源软件堆栈&#xff0c;用于网站和网络应用程序的开发和部署。LAMP是几个主要组件的首字母缩写&#xff0c;包括&#xff1a; Linux&#xff1a;操作系统层&#xff0c;LAMP通常部署在Linux操作系统上&#xff0c;但它也可以使用其他类似Unix的…

t265 jetpack 6 px4 ros2

Ubuntu22.04 realsenseSDK2和ROS2Wrapper安装方法,包含T265版本踩坑问题_ros2 realsense-CSDN博客 210 git clone https://github.com/IntelRealSense/librealsense.git 212 git branch 215 git tag 218 git checkout v2.51.1 219 git branch 265 git clone https://…

【稳定检索/投稿优惠】2024年材料科学与能源工程国际会议(MSEE 2024)

2024 International Conference on Materials Science and Energy Engineering 2024年材料科学与能源工程国际会议 【会议信息】 会议简称&#xff1a;MSEE 2024大会地点&#xff1a;中国苏州会议官网&#xff1a;www.iacmsee.com会议邮箱&#xff1a;mseesub-paper.com审稿结…

PC微信逆向) 定位微信浏览器打开链接的call

首发地址: https://mp.weixin.qq.com/s/Nik8fBF3hxH5FPMGNx3JFw 前言 最近想写一个免费的微信公众号自动采集的工具&#xff0c;我看公众号文章下载需求还挺多的。搜了下github&#xff0c;免费的工具思路大多都是使用浏览器打开公众号主页获取到需要的请求参数&#xff0c;例…

雷军出手,光储充一体化赛道可太行了

雷军出手&#xff0c;特斯拉、宁德时代、奥能电源持续加码&#xff0c;光储充一体化赛道可太行了 近几年&#xff0c;各地光储充一体化项目遍地开花&#xff0c;正式投入运营的新闻接连不断。被视为全球能源转型重要驱动力的光储充一体化&#xff0c;已成为各大企业竞相入局的新…

FOXMAIL邮箱:高效办公,邮件管理新风尚

随着电子邮件在日常工作和生活中的普及&#xff0c;选择一个高效、易用的邮箱客户端变得尤为重要。FOXMAIL作为一款功能强大、操作简便的邮箱客户端&#xff0c;深受用户喜爱。下面将为您详细介绍FOXMAIL邮箱的使用方法&#xff0c;帮助您轻松掌握其各项功能。 一、下载安装与账…

【深度优先搜索 广度优先搜索】297. 二叉树的序列化与反序列化

本文涉及知识点 深度优先搜索 广度优先搜索 深度优先搜索汇总 图论知识汇总 LeetCode297. 二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传…