当前位置: 首页 > article >正文

基于 Vue 3 的PDF和Excel导出

以下是基于 Vue 3 Composition API 的完整实现,包括 PDF 和 Excel 导出。

一、PDF 导出 (Vue 3)

安装依赖

在项目中安装相关库:

npm install html2canvas jspdf

Vue 3 代码实现

<template><div><div ref="pdfContent" class="pdf-content"><h1>导出为 PDF 示例</h1><table border="1"><tr><th>序号</th><th>名称</th><th>数量</th></tr><tr v-for="(item, index) in tableData" :key="index"><td>{{ index + 1 }}</td><td>{{ item.name }}</td><td>{{ item.count }}</td></tr></table></div><button @click="downloadPDF">导出 PDF</button></div>
</template><script setup>
import { ref } from 'vue';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';const pdfContent = ref(null);const tableData = ref([{ name: '数据1', count: 10 },{ name: '数据2', count: 20 },{ name: '数据3', count: 30 },
]);const downloadPDF = async () => {const element = pdfContent.value;// 使用 html2canvas 将 DOM 元素渲染成 Canvasconst canvas = await html2canvas(element, {scale: 2, // 提高清晰度useCORS: true,});const imgData = canvas.toDataURL('image/png');const pdf = new jsPDF('p', 'mm', 'a4'); // 定义 PDF 尺寸和方向const imgWidth = 210; // A4 纸宽度 (mm)const imgHeight = (canvas.height * imgWidth) / canvas.width;pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight);pdf.save('export.pdf');
};
</script><style scoped>
.pdf-content {padding: 20px;background-color: #fff;
}
</style>

说明

  1. ref() 用于定义模板中的 DOM 引用。
  2. html2canvasDOM 渲染为 Canvas,支持跨域图片加载
  3. jspdf 创建 PDF 文件。
  4. pdf.addImage() 添加图像,pdf.save() 触发保存。

二、Excel 导出 (Vue 3)

安装依赖

安装相关 Excel 生成和下载工具:

npm install xlsx file-saver

Vue 3 代码实现

<template><div><table border="1"><tr><th>序号</th><th>名称</th><th>数量</th></tr><tr v-for="(item, index) in tableData" :key="index"><td>{{ index + 1 }}</td><td>{{ item.name }}</td><td>{{ item.count }}</td></tr></table><button @click="exportExcel">导出 Excel</button></div>
</template><script setup>
import { ref } from 'vue';
import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';const tableData = ref([{ name: '数据1', count: 10 },{ name: '数据2', count: 20 },{ name: '数据3', count: 30 },
]);const exportExcel = () => {const worksheet = XLSX.utils.json_to_sheet(tableData.value);const workbook = XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');// 生成 Excel 文件的二进制数据const excelBuffer = XLSX.write(workbook, {bookType: 'xlsx',type: 'array',});// 创建 Blob 并触发下载const blob = new Blob([excelBuffer], {type: 'application/octet-stream',});saveAs(blob, 'export.xlsx');
};
</script>

说明

  1. ref() 定义响应式数据。
  2. XLSX.utils.json_to_sheet() 将 JSON 转换为 Excel 工作表。
  3. XLSX.utils.book_new() 创建新的 Excel 文件。
  4. file-saver 生成文件并触发浏览器下载。

三、分页生成 PDF(处理多页情况)

在 PDF 内容过长超出单页时,可以通过分页处理:

const imgHeight = (canvas.height * imgWidth) / canvas.width;
let position = 0;pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);while (position + imgHeight < canvas.height) {position -= 297; // A4 高度pdf.addPage();pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
}

四、Excel 单元格格式优化

可以通过设置 cellStyles 控制单元格格式和宽度:

const worksheet = XLSX.utils.json_to_sheet(tableData.value);// 设置列宽
worksheet['!cols'] = [{ wch: 20 }, { wch: 30 }];// 设置字体、对齐方式
worksheet['A1'].s = {font: { bold: true, color: { rgb: 'FF0000' } },alignment: { horizontal: 'center' },
};

这部分代码涉及对 Excel 文件中 单元格的格式和宽度 进行设置,目的是在生成的 Excel 文件中对表格显示效果进行优化,提升可读性和专业性,简单来说,提升导出后文件的美观性。虽然即使不设置这些格式,基本的数据导出功能也可以正常工作,但设置格式后可以显著提升导出的 Excel 文件在外观和布局上的效果。 

默认格式往往存在以下问题:

  • 列宽可能过窄,导致内容被截断。
  • 字体默认是常规字体,无法突出重点信息。
  • 内容默认左对齐,缺乏视觉层次感。

五、常见问题及解决

1. HTML2Canvas 截图为空白或内容不完整

  • 确认 DOM 元素已在渲染后再进行截图。
  • 如果存在跨域图片,需配置 useCORS: true

2. Excel 文件下载后打开报错

  • 确认生成的二进制数据完整。
  • 确认 Blob 格式为 application/octet-stream

六、最佳实践

  • PDF 适用于导出完整页面(包括图表和布局)。
  • Excel 适用于导出结构化数据(如表格、JSON)。
  • 分页导出适用于数据量较大的情况。

相关文章:

基于 Vue 3 的PDF和Excel导出

以下是基于 Vue 3 Composition API 的完整实现&#xff0c;包括 PDF 和 Excel 导出。 一、PDF 导出 (Vue 3) 安装依赖 在项目中安装相关库&#xff1a; npm install html2canvas jspdf Vue 3 代码实现 <template><div><div ref"pdfContent" cla…...

Git+Fork 入门介绍

git 分区理解 fork安装 从路径下去拿软件时&#xff0c;注意先拉到本地。经验来看&#xff0c;fork直接安装会出不可思议的问题。 fork操作 安装&#xff0c;注意设置好名字&#xff0c;如果之前安装的同学&#xff0c;名字没有写好&#xff0c;重新安装设置好名字。 clone操…...

Windows系统安装Node.js和npm教程【成功】

0.引言——Node.js和npm介绍 项目描述Node.js基于Chrome V8引擎的JavaScript运行环境&#xff0c;使JavaScript可用于服务器端开发。采用单线程、非阻塞I/O及事件驱动架构&#xff0c;适用于构建Web服务器、实时应用和命令行工具等npmNode.js的包管理器与大型软件注册表。拥有…...

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

文章目录 引言I 实现步骤添加商品管理菜单组推拉效果引言 应用场景:PC端管理后台页面,左侧菜单列表导航。 思路: 用到了动态面板的两个交互效果来实现:隐藏/显示切换、展开/收起元件向下I 实现步骤 添加商品管理菜单组 在左侧画布区域添加一个菜单栏矩形框;再添加一个商…...

科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线

地下管网作为城市公共安全的重要组成部分&#xff0c;担负着城市的信息传递、能源输送、排涝减灾等重要任务&#xff0c;是维系城市正常运行、满足群众生产生活需要的重要基础设施&#xff0c;是城市各功能区有机连接和运转的维系&#xff0c;因此&#xff0c;也被称为城市“生…...

react中useRef和useMemo和useCallback

memo &#xff1a; 被memo包裹的组件&#xff0c;会浅层比较 props,不会深度比较&#xff0c;如果浅层比较相同&#xff0c;就不会重新渲染组件 默认是&#xff0c;无论怎么&#xff0c;都会重新渲染一遍子组件&#xff0c;&#xff0c; useMemo&#xff1a; 包裹一个函数&am…...

如何保证LabVIEW软件开发的质量?

LabVIEW作为图形化编程工具&#xff0c;广泛应用于工业测控、自动化测试等领域。其开发模式灵活&#xff0c;但若缺乏规范&#xff0c;易导致代码可读性差、维护困难、性能低下等问题。保证LabVIEW开发质量需从代码规范、模块化设计、测试验证、版本管理、文档完善等多维度入手…...

如何快速解决 Postman 报错?

介绍一些 Postman 常见的报错与处理方法&#xff0c;希望能够对大家有所帮助。 Postman 一直转圈打不开的问题 Postman 报错处理指南&#xff1a;常见报错与解决方法...

基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律

标题:基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律 内容:1.摘要 背景&#xff1a;岭南地区独特的地理环境、气候条件及人文风俗使该地区妇科疾病具有一定特点&#xff0c;岭南名医在长期临床实践中积累了丰富的治疗经验。目的&#xff1a;基于数据挖掘…...

Android Launcher3 HotSeat文件夹创建禁止方案全解析

一、技术背景与实现原理 在Android 13 Launcher3定制开发中&#xff0c;需屏蔽HotSeat区域的文件夹创建功能。该功能涉及的核心事件处理流程如下&#xff1a; 复制 [拖拽事件] -> [Workspace.onDrop()] -> [CellLayout.performReorder()]└─> [createUserFolderIf…...

springboot body 转对象强验证属性多余属性抛错误

在Spring Boot中&#xff0c;当使用RequestBody注解来接收HTTP请求中的JSON数据并将其转换为Java对象时&#xff0c;Spring默认会忽略额外的属性。这意味着如果发送的JSON包含一些目标对象中没有定义的属性&#xff0c;Spring不会报错&#xff0c;这些额外的属性会被简单地忽略…...

C++手撕共享指针、多线程交替、LRU缓存

1. 共享指针 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…...

Flask(三)路由与视图函数

在 Flask 中&#xff0c;路由 (Route) 是将 URL 地址映射到特定的视图函数 (View Function) 的机制。视图函数处理用户请求&#xff0c;并返回 HTTP 响应。理解路由和视图函数是构建 Flask 应用的基础。 3.1 路由的基本概念 Flask 使用 app.route() 装饰器来定义路由。以下是…...

c++中cpp文件从编译到执行的过程

C 文件从编写到执行的过程可以分为几个主要阶段&#xff1a;编写代码、预处理、编译、汇编、链接和运行。以下是每个阶段的详细说明&#xff1a; 1. 编写代码 这是整个过程的起点。程序员使用文本编辑器&#xff08;如 VSCode、Sublime Text 或其他 IDE&#xff09;编写 C 源…...

蓝桥杯1463:货物摆放问题详解——数学思维与代码优化

目录 一、题目分析与数学建模 二、直接暴力法的局限性 三、优化策略&#xff1a;因数分解与三元组枚举 步骤 1&#xff1a;收集所有因数 步骤 2&#xff1a;三元组枚举优化 四、代码实现与优化技巧 五、复杂度分析与性能提升 六、总结与拓展思考 关键点总结 拓展思考…...

C++ 多线程简要讲解

std::thread是 C11 标准库中用于多线程编程的核心类&#xff0c;提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下&#xff1a; 1.默认构造函数和线程创建 thread() noexcept; 作用&#xff1a;创建一个 std::thread 对象&#xff0c;但…...

如何设计一个处理物联网设备数据流的后端系统。

一、系统架构设计 物联网设备数据流的后端系统通常包括以下几个主要组件: ①设备数据采集层:负责从物联网设备收集数据。 ②数据传输层:负责将设备数据传输到后端系统。 ③数据处理层:实时或批量处理传输到后的数据。 ④存储层:负责存储设备数据。 ⑤API层:提供外部…...

【QT5 多线程示例】信号量

信号量 【C并发编程】&#xff08;八&#xff09;信号量 QT中的信号量类是QSemaphore&#xff0c;用法与C标准中的std::counting_semaphore类似。不同的是&#xff0c; QSemaphore无法指定最大计数。为了限定最大计数&#xff0c;可以采用两个QSemaphore信号量。下面使用一个…...

深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析

引言 Spring Boot 是当今 Java 开发中最流行的框架之一&#xff0c;它以简化配置和快速开发著称。然而&#xff0c;要真正掌握 Spring Boot&#xff0c;理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期&#xff0c;从启动到关闭的各个阶段&…...

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…...

SpringMVC 请求与响应处理详解

引言 在 Java Web 开发中&#xff0c;SpringMVC 作为 Spring 框架的重要模块&#xff0c;提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式&#xff0c;结合实际案例&#xff0c;帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…...

【python】requests 爬虫高效获取游戏皮肤图

1. 引言 在当今的数字时代&#xff0c;游戏已经成为许多人生活中不可或缺的一部分。而游戏中的皮肤&#xff0c;作为玩家个性化表达的重要方式&#xff0c;更是受到了广泛的关注和喜爱。然而&#xff0c;对于许多玩家来说&#xff0c;获取游戏皮肤往往需要花费大量的时间和精力…...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法id选择器&#xff0c;其实XPath元素定位要比CSS好用&#xff0c;原因是CSS无法使用下标&#xff08;工作当中也是常用的xpath&#xff09;&#xff0c;但CSS定位速度比XPat…...

23种设计模式-代理(Proxy)设计模式

代理设计模式 &#x1f6a9;什么是代理设计模式&#xff1f;&#x1f6a9;代理设计模式的特点&#x1f6a9;代理设计模式的结构&#x1f6a9;代理设计模式的优缺点&#x1f6a9;代理设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是代理设计模式…...

【react18】react项目使用mock模拟后台接口

前后端分离项目&#xff0c;后端还没有接口的时候&#xff0c;前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具&#xff0c;官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…...

Excel新增的函数

常用函数 XLOOKUP 1、普通查找 2、屏蔽错误值 3、横向查找 4、通配符查找 ?:代表任意单个字符 *:代表任意多个字符 5、反向查找 6、多条件查找 7、查找多列数据 8、查找最后一个 IFS MINIFS MAXIFS 文本函数 TEXTSPLIT、TEXTJOIN、CONCAT、 TEXTBEFORE、TEXTAFT…...

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇&#xff0c;但也不是轻轻松松的。笔者将最新的Windows下安装VSCode&#xff0c;以及运行最简单的C程序的过程记录下来&#xff0c;供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...

django入门教程之templates和static资源【五】

使用app01子应用举例说明模板的使用。templates官方文档。 templates完整流程认知 第一步&#xff0c;在settings.py中注册app01子应用。 第二步&#xff0c;在app01目录下&#xff0c;新建templates和static目录&#xff0c;用于存放模板文件和资源文件。目录结构如下&#…...

Vue 中directive的钩子函数(bind、inserted 等)的作用及使用场景

大白话Vue 中directive的钩子函数&#xff08;bind、inserted 等&#xff09;的作用及使用场景。 在 Vue 里&#xff0c;指令&#xff08;directive&#xff09;是个超实用的东西&#xff0c;它能让你在不改动组件逻辑的情况下&#xff0c;给 HTML 元素添加一些特殊的行为。Vu…...

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree&#xff08;默克尔树&#xff09;1.4 HMAC&#xff08;哈希消息认证码&#xff09; 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC&#xff08;椭圆曲线密码学&#xff09;2.4 Diffie-He…...