vue3项目中前端导出word文档和导出excel文档

一、导出word文档

参考文章https://blog.csdn.net/qq_53722480/article/details/130017092
1、使用到的包如下:

"docxtemplater": "^3.42.4",
"file-saver": "^2.0.5",
"jszip-utils": "^0.1.0",
"pizzip": "^3.1.4",

2、页面中使用,注意:demo.docx模板文件放在public目录下

<script setup>
import JSZipUtils from "jszip-utils";
import JSZip from "pizzip";
import Docxtemplater from "docxtemplater";
import { saveAs } from "file-saver";

//导出方法
const exportDoc=()=>{
  // 读取并获得模板文件的二进制内容"
  JSZipUtils.getBinaryContent(`${"/demo"}.docx`, (error, content)=> {
    // 抛出异常
    if (error) {throw error;}
    // 创建一个PizZip实例,内容为模板的内容
    const zip = new JSZip(content);
    // 创建并加载docxtemplater实例对象
    const doc = new Docxtemplater().loadZip(zip);
    // 设置模板变量的值
    doc.setData({
      isTable: [{ index:1,name:"测试数据",id:'fdfd'},{index:2,name:'小如',id:'fdgfrdgr'}], // 文档中循环数据
    });
    try {
      // 用模板变量的值替换所有模板变量
      doc.render();
    } catch (error) {
      // 抛出异常
      const e = {
        message: error.message,
        name: error.name,
        stack: error.stack,
        properties: error.properties,
      };
      console.log(JSON.stringify({ error: e }));
      throw error;
    }
    // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
    const out = doc.getZip().generate({
      type: "blob",
      mimeType:
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    });
    // 将目标文件对象保存为目标类型的文件,并命名
    saveAs(out, "模板文件.docx");
  });
}
</script>

3、demo.docx文件内容如下
在这里插入图片描述
4、下载后的模板文件.docx如下
在这里插入图片描述

二、导出excel文档

1、使用到的包如下

"xlsx": "^0.18.5"

2、界面中导出excel

// 前端导出excle的方法
import { aoaToSheetXlsx } from '@/utils/ExportExcel'

function exportExcles() {
  let header = [   //表头
    {label:'名称', prop:'name' }, 
    {label:'类型', prop:'type' },
    {label:'状态', prop:'status' }
  ]
  let data=[		//导出的数据
    {name: '测试', type: '1', status: '0'},
    {name: '测试', type: '1', status: '0'},
    {name: '测试', type: '1', status: '0'},
    {name: '测试', type: '1', status: '0'},
    {name: '测试', type: '1', status: '0'},
  ]
  aoaToSheetXlsx({
    header,
    data: data,
    filename: 'excel导出名字',   //excel文件名
  })
}

3、ExportExcel.js如下:

import {utils, writeFile} from 'xlsx';

const DEF_FILE_NAME = 'new-excel';
export function jsonToSheetXlsx({
  data,
  header,
  filename = DEF_FILE_NAME,
  json2sheetOpts = {},
  write2excelOpts = { bookType: 'xlsx' },
}) {
  const tHeader = header.map(v => {
    return (v.label)
  })
  const filterVal = header.map(v => {
    return (v.prop)
  })
  const newData = formatJson(filterVal, data)
  const arrData = [...newData];
  if (tHeader) {
    arrData.unshift(tHeader);
    json2sheetOpts.skipHeader = true;
  }
  const worksheet = utils.json_to_sheet(arrData, json2sheetOpts);
  /* add worksheet to workbook */
  const workbook = {
    SheetNames: [filename],
    Sheets: {
      [filename]: worksheet,
    },
  };
  /* output format determined by filename */
  writeFile(workbook, filename, write2excelOpts);
  /* at this point, out.xlsb will have been downloaded */
}

export function aoaToSheetXlsx({
  data,
  header,
  filename = DEF_FILE_NAME,
  write2excelOpts = { bookType: 'xlsx' },
}) {
  const tHeader = header.map(v => {
    return (v.label)
  })
  const filterVal = header.map(v => {
    return (v.prop)
  })
  const newData = formatJson(filterVal, data)
  const arrData = [...newData];
  if (tHeader) {
    arrData.unshift(tHeader);
  }
  const worksheet = utils.aoa_to_sheet(arrData);
  const name = filename + '.xlsx'
  /* add worksheet to workbook */
  const workbook = {
    SheetNames: [filename],
    Sheets: {
      [filename]: worksheet,
    },
  };
  /* output format determined by filename */
  writeFile(workbook, name, write2excelOpts);
  /* at this point, out.xlsb will have been downloaded */
}

function formatJson(filterVal, jsonData) {
  return jsonData.map(v => filterVal.map(j => {
    if (j === 'timestamp') {
      return parseTime(v[j])
    } else {
      return v[j]
    }
  }))
}

4、以上代码导出的excel文件效果如下
在这里插入图片描述

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

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

相关文章

【分享】PDF文件不能编辑的3个原因

PDF文件具有很好的兼容性&#xff0c;可靠性&#xff0c;安全性&#xff0c;是很多人办公常用的电子文档格式。但有时候想要编辑PDF时&#xff0c;却发现不能编辑&#xff0c;是什么原因呢&#xff1f;下面小编来分享一下常见的3个原因。 原因1&#xff1a; PDF文件是扫描件&a…

6G网络将于2030年推出?它与5G相比都有哪些提升?

在这之前&#xff0c;我们曾为大家报道了苹果放弃5G调整解调器的研究工作「有消息称苹果将放弃 5G 调制解调器的研究&#xff0c;你了解调制解调器吗&#xff1f;」&#xff0c;如今又有报道称由于5G调整解调器开发遇到困难&#xff0c;苹果将加大对于6G蜂窝连接的开发。你知道…

第四届传智杯初赛(莲子的机械动力学)

题目描述 题目背景的问题可以转化为如下描述&#xff1a; 给定两个长度分别为 n,m 的整数 a,b&#xff0c;计算它们的和。 但是要注意的是&#xff0c;这里的 a,b 采用了某种特殊的进制表示法。最终的结果也会采用该种表示法。具体而言&#xff0c;从低位往高位数起&#xf…

GEE:构建和调用自己的 js 函数库

作者&#xff1a;CSDN _养乐多_ 本文记录了在Google Earth Engine&#xff08;GEE&#xff09;上构建自己的 js 函数库的步骤。构建自己的函数库以方便代码调用和扩展。 文章目录 一、创建lib文件二、调用lib库三、附加3.1 定义函数3.2 js 库中函数互相调用 一、创建lib文件 …

什么?你还不会 OpenTiny 跨框架组件库适配微前端?

本文由体验技术团队 TinyVue 组件库成员陈家梅同学分享&#xff0c;带你手把手实现 TinyVue 组件库适配微前端~ 一、前言 以下是我对微前端的一些粗浅理解&#xff0c;对微前端有一定了解的话可以略过&#xff0c;直接进入第二部分。 1、微前端是什么&#xff1f; 我们首先…

Vue项目使用Sortable.js实现拖拽功能

想了解更多-可前往 Sortable.js官网 查看组件属性及参数 安装组件&#xff08;我这里使用的是NPM安装&#xff09; npm install sortablejs --save在需要使用拖拽功能的页面中使用&#xff08;完整功能代码&#xff09; <div class"tag_box"><div class&q…

【电子取证篇】汽车取证数据提取与汽车取证实例浅析(附标准下载)

【电子取证篇】汽车取证数据提取与汽车取证实例浅析&#xff08;附标准下载&#xff09; 关键词&#xff1a;汽车取证&#xff0c;车速鉴定、声像资料鉴定、汽车EDR提取分析 汽车EDR一般记录车辆碰撞前后的数秒&#xff08;5s左右&#xff09;相关数据&#xff0c;包括车辆速…

优化 uniapp 发行操作:一键打包、混淆代码

​ uniapp一键发行代码并混淆代码 第一步.在项目根目录下安装插件 npm install javascript-obfuscator -g安装完成后&#xff0c;javascript-obfuscator就是一个独立的可执行命令了。 javascript-obfuscator -v第二步&#xff1a;HbuilderX点击发行按钮&#xff0c;打包代码…

robotFramwork 中如何禁用或跳过其中某个 testcase

在 Robot Framework 中&#xff0c;你可以通过添加一个特殊的标签&#xff08;tag&#xff09;来禁用某个测试用例。这个标签是 robot:skip。 robotframework *** Settings *** Test Setup Open Application*** Test Cases *** My Test Case[Tags] robot:skipDo Some…

判断是否存在重复的数

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

我一人全干!之二,vue3后台管理系统树形目录的实现。

一个完整的后台管理系统需要一个树形结构的目录&#xff0c;方便用户切换页面。 因为使用的是element-plus的ui库&#xff0c;所以首选el-menu组件&#xff0c;点击查看文档。 因为此组件不是树形结构的&#xff0c;所以需要封装成系统需要的树形结构组件。可以使用vue的递归组…

C++12.1

三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Person {friend const Person operator- (const Person &L, const Person &R);friend bool operator<(const Person &L,const Person &R);f…

html刷题笔记

1 em 12 pt 16 px 100% source元素为audio、video、picture元素指定多个媒体文件 margin是用来隔开元素与元素的间距&#xff1b;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干&#xff1b;padding用于元素与内容之间的间隔&#xff0c;…

vr建筑虚拟实景展厅漫游体验更直观全面

随着科技的不断进步&#xff0c;纯三维、可交互、轻量化的三维线上展览云平台&#xff0c;打破时间界限&#xff0c;以其独特的魅力&#xff0c;给予客户更多的自主性、趣味性和真实性&#xff0c;客户哪怕在天南地北&#xff0c;通过网络、手机即可随时随地参观企业线上立体化…

IDEA切换Python虚拟环境

前言 因为之前一直使用的IDEA开发&#xff0c;换到VSCODE之后各种不习惯&#xff0c;特别是DEBUG的操作&#xff0c;特别难受&#xff0c;因此决心换回IDEA 环境配置 已有项目调整 进入Project 选择SDKs&#xff0c;新建Python 配置Conda以及虚拟环境 有就选择一个虚拟环境…

DOCBOX dynamiccontent.properties.xhtml RCE漏洞复现

0x01 产品简介 DOCBOX是一款具有恢复保证的文档管理系统,高效、快如闪电、防审核、简单,从模拟切换到数字并使用 DOCBOX 归档您的文档。 0x02 漏洞概述 DOCBOX电子文档管理系统4.2.0版本中dynamiccontent.properties.xhtml接口存在远程代码执行漏洞,未经身份认证的攻击者可…

MS8051运算放大器可Pin to Pin兼容AD8051/AD8052/AD8054

MS805x 系列为轨到轨输出的电压反馈运算放大器&#xff0c;具有易用、低成本等特点。可Pin to Pin兼容AD8051/AD8052/AD8054。相比于典型的电流反馈放大器&#xff0c;在带宽和转换率有更大的优势&#xff0c;并同时具备宽的输入共模电压范围和大的输出电压摆幅&#xff0c;这使…

go这么好用的pprof包却引发了安全漏洞?规避pprof自动注册默认url

文章目录 背景介绍问题分析解决方案1.起一个新的http server,不使用默认对象2.修改http默认对象3.既然源码这么坑,把源码捞出来改成自己想要的。背景介绍 最近项目在线上被检测出有pprof有漏洞,原因是产品对外暴露的端口,可以通过http://ip:prot/debug/pprof/profile,获取…

java.lang.UnsupportedOperationException解决方法

问题描述 在实际开发中经常会有类似的这种代码&#xff0c;想要按类的某一个属性对列表中的元素分组。 例如&#xff1a; 有一些学生&#xff0c;然后根绝他们的年龄对他们进行分组。可以写出如下代码。 public class UnsupportedOperationExceptionDemo {DataNoArgsConstru…

vue 过滤器 (filters) ,实际开发中的使用

在实际开发中要判断不同的状态,要写很多重复的代码, 类似这样: 这样学麻烦, 不方便维护, 这时候可以用 filters 过滤器 在页面这样写就可以了