Vue3+TypeScript实现Docx/Excel预览组件

 更新时间:2024年04月26日 09:19:34   作者:下雨会打伞的前端  
这篇文章主要为大家详细介绍了如何使用Vue3+TypeScript实现Docx/Excel预览组件,文中的示例代码讲解详细,有需要的小伙伴可以参考下

简介

在现代的 Web 应用中,预览文档和表格是一个常见的需求。本文将介绍如何使用 Vue3 和 TypeScript 开发一个高度可定制的文档和表格预览组件。

技术栈

Vue3

TypeScript

Element Plus

unocss

vue-office

PDF文档预览

使用 Vue3 + TypeScript 实现 PDF 预览组件

Docx 预览组件

功能特点

  • 支持的文件格式: 仅支持预览 Docx 类型的文件。
  • 自定义选项: 提供丰富的渲染选项,如页面宽度、高度、字体等。
  • 通知提示: 在不支持的文件类型时,会弹出通知提示。

组件实现

// types
export interface RenderOptions {
	className?: string; // 默认和文档样式类的类名/前缀
	inWrapper?: boolean; // 启用在文档内容周围的包装器渲染
	ignoreWidth?: boolean; // 禁用页面宽度渲染
	ignoreHeight?: boolean; // 禁用页面高度渲染
	ignoreFonts?: boolean; // 禁用字体渲染
	breakPages?: boolean; // 启用分页在页面断点上
	ignoreLastRenderedPageBreak?: boolean; // 禁用在lastRenderedPageBreak元素上的分页
	experimental?: boolean; // 启用实验性功能(制表符计算)
	trimXmlDeclaration?: boolean; // 如果为true,将从解析之前的xml文档中移除xml声明
	useBase64URL?: boolean; // 如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
	useMathMLPolyfill?: boolean; // 包括MathML填充,适用于chrome、edge等
	showChanges?: boolean; // 启用文档更改的实验性渲染(插入/删除)
	debug?: boolean; // 启用额外的日志记录
}
<script setup lang="ts">
import { ref, computed } from "vue";
import VueOfficeDocx from "@vue-office/docx";
import "@vue-office/docx/lib/index.css";
import { ElNotification } from "element-plus";
import { RenderOptions } from "./types";

interface DocxProps {
	height?: string; // 组件高度 ==> 非必传(默认为 150px)
	customOptions?: RenderOptions; // 配置参数 ==> 非必传(默认为 {})
}
// 接收父组件参数并设置默认值
const props = withDefaults(defineProps<DocxProps>(), {
	height: "80vh"
});

const show = ref(false);
const loading = ref(true);
const docx = ref();
const url = ref("http://static.shanhuxueyuan.com/test.docx");

const customStyle = computed(() => {
	return {
		height: props.height
	};
});

const renderedCallback = () => {
	loading.value = false;
};

const open = async (src?: string) => {
	show.value = true;
	if (src) {
		url.value = src;
	}
	fetch(url.value)
		.then(response => response.blob())
		.then(res => {
			if (res.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document") {
				docx.value = res;
			} else {
				ElNotification({
					title: "提示",
					message: "目前仅支持预览 Docx 类型的文件",
					type: "warning"
				});
			}
		});
};

defineExpose({
	open
});
</script>

<template>
	<div>
		<el-dialog v-model="show" align-center title="预览" width="80%">
			<VueOfficeDocx v-loading="loading" :options="customOptions" :style="customStyle" :src="docx" @rendered="renderedCallback" />
		</el-dialog>
	</div>
</template>

<style lang="scss" scoped></style>

Excel预览组件

功能特点

  • 支持的文件格式: 仅支持预览 Excel 类型的文件。
  • 自定义选项: 提供丰富的渲染选项,如最小渲染列数、行数等。
  • 通知提示: 在不支持的文件类型时,会弹出通知提示。
// types
export interface ExcelRenderOptions {
	minColLength: number; // excel最少渲染多少列
	minRowLength: number; // excel最少渲染多少行
	widthOffset: number; // 在默认渲染的列表宽度上再加10px宽
	heightOffset: number; // 在默认渲染的列表高度上再加10px高
	beforeTransformData: (workbookData: any) => any; // 修改workbookData的函数类型定义
	transformData?: (workbookData: any) => any; // 修改workbookData的函数类型定义
}
<script setup lang="ts">
import { ref, computed } from "vue";
import VueOfficeExcel from "@vue-office/excel";
import "@vue-office/excel/lib/index.css";
import { ElNotification } from "element-plus";
import { type ExcelRenderOptions } from "./types";

interface DocxProps {
	height?: string; // 组件高度 ==> 非必传(默认为 150px)
	customOptions?: Partial<ExcelRenderOptions>; // 配置参数 ==> 非必传(默认为 {})
}
// 接收父组件参数并设置默认值
const props = withDefaults(defineProps<DocxProps>(), {
	height: "80vh"
});

const show = ref(false);
const loading = ref(true);
const docx = ref();
const url = ref("http://static.shanhuxueyuan.com/demo/excel.xlsx");

const customStyle = computed(() => {
	return {
		height: props.height
	};
});

const renderedCallback = () => {
	loading.value = false;
};

const open = async (src?: string) => {
	show.value = true;
	if (src) {
		url.value = src;
	}
	fetch(url.value)
		.then(response => response.blob())
		.then(res => {
			if (res.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") {
				docx.value = res;
			} else {
				ElNotification({
					title: "提示",
					message: "目前仅支持预览 Excel 类型的文件",
					type: "warning"
				});
			}
		});
};

defineExpose({
	open
});
</script>

<template>
	<div>
		<el-dialog v-model="show" align-center title="预览" width="80%">
			<VueOfficeExcel
				v-loading="loading"
				:options="customOptions"
				:style="customStyle"
				:src="docx"
				@rendered="renderedCallback"
			/>
		</el-dialog>
	</div>
</template>

<style lang="scss" scoped></style>

总结

通过使用 Vue3 和 TypeScript,我们可以轻松地开发出高度可定制的文档和表格预览组件。这些组件不仅提供了丰富的功能,还支持多种自定义选项,以满足不同项目的需求。

以上就是Vue3+TypeScript实现Docx/Excel预览组件的详细内容,更多关于Vue3 TypeScript预览组件的资料请关注脚本之家其它相关文章!

相关文章

  • vue封装组件的过程详解

    vue封装组件的过程详解

    这篇文章主要为大家详细介绍了vue中封装组件的相关知识,文中的示例代码讲解详细,对我们深入了解vue有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Vue实现手机计算器

    Vue实现手机计算器

    这篇文章主要为大家详细介绍了Vue实现手机计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Vue3实战之插槽封装与懒加载详解

    Vue3实战之插槽封装与懒加载详解

    这篇文章主要介绍了Vue3实战之插槽封装与懒加载的相关资料,过插槽实现组件的结构分离、复用性和语义清晰,通过懒加载实现图片的按需加载,减少首屏加载时间和资源浪费,文中给出了详细的代码示例,需要的朋友可以参考下
    2025-04-04
  • vue实现评论列表

    vue实现评论列表

    这篇文章主要为大家详细介绍了vue实现评论列表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue3中如何使用component :is 加载组件

    Vue3中如何使用component :is 加载组件

    Monaco-editor,一个vs code 编辑器,需要将其集成到项目,这篇文章主要介绍了Vue3中如何使用component :is 加载组件,需要的朋友可以参考下
    2023-11-11
  • Vue cli构建及项目打包以及出现的问题解决

    Vue cli构建及项目打包以及出现的问题解决

    这篇文章主要介绍了Vue cli构建及项目打包以及出现的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue通过elementUI组件实现图片预览效果

    vue通过elementUI组件实现图片预览效果

    我们在开发中经常会遇到通过点击某个按钮或者文字实现图片的预览功能,这里我们分别介绍vue2和vue3里面如何实现图片预览方法,需要的朋友可以参考下
    2023-09-09
  • vue项目使用js监听浏览器关闭、刷新、后退事件实现方法

    vue项目使用js监听浏览器关闭、刷新、后退事件实现方法

    用vue做的项目,有个需求就是关闭浏览器的时候,需要往后台提交有个接口,来看看这个账号有没有下线,这篇文章主要给大家介绍了关于vue项目使用js监听浏览器关闭、刷新、后退事件的实现方法,需要的朋友可以参考下
    2024-06-06
  • VUE中常用的四种高级方法总结

    VUE中常用的四种高级方法总结

    开发vue项目的时候一般都会开发很多自定义的全局组件,下面这篇文章主要给大家总结介绍了关于VUE中常用的四种高级方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Vue3全局挂载使用Axios学习实战

    Vue3全局挂载使用Axios学习实战

    这篇文章主要为大家介绍了Vue3全局挂载使用Axios学习实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论