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

实现Vue3/Nuxt3 预览excel文件

  1. 安装必要的库
    npm install xlsx
  2. 创建一个组件来处理文件上传和解析
    src/components 目录下创建一个名为 ExcelPreview.vue 的文件
    <template>
    <div>
    <input type="file" @change="handleFileUpload" />
    <table v-if="sheetData.length">
    <thead><tr><th v-for="(header, index) in sheetData[0]" :key="index">{{ header }}</th></tr></thead>
    <tbody><tr v-for="(row, rowIndex) in sheetData.slice(1)" :key="rowIndex"><td v-for="(cell, cellIndex) in row" :key="cellIndex">{{ cell }}</td></tr></tbody>
    </table>
    </div>
    </template><script setup lang="ts">
    import { ref } from 'vue';
    import * as XLSX from 'xlsx';const sheetData = ref([]);const handleFileUpload = (event: Event) => {const file = (event.target as HTMLInputElement).files?.[0];if (file) {const reader = new FileReader();reader.onload = (e) => {const data = new Uint8Array(e.target?.result as ArrayBuffer);const workbook = XLSX.read(data, { type: 'array' });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];sheetData.value = XLSX.utils.sheet_to_json(worksheet, { header: 1 });};reader.readAsArrayBuffer(file);}
    };
    </script>

    如果excel文件是后台返回的一个链接,需要重新请求解析成ArrayBuffer,
    以下是nuxt3 示例:

    
    // 为了解决跨域问题,在server/api 下 创建一个请求api, downloadFileByProxy.ts
    import { defineEventHandler } from 'h3';export default defineEventHandler(async event => {const { filePath } =  getQuery(event);let matches = filePath?.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);let domain = matches && matches[1]; return proxyRequest(event,`https://${domain}/`, {fetch: ()=>fetch(filePath),})
    })

    ExcelPreview.vue 文件中:

      async function getFile(path: string) {// download pdf from api to prevent CORSconst { _data } = await $fetch.raw(`/api/downloadFileByProxy`, {method: 'get',params: {filePath: path,},});let blob = _data;let buffer = await blob?.arrayBuffer();return buffer;}const debounceRenderHandle = debounce(async () => {bufferCache.value = bufferCache.value || (await getFile(props.path)); // bufferCache这里是用来处理缓存,可以视具体情况加这个变量与否const data = new Uint8Array(bufferCache.value as ArrayBuffer);const workbook = XLSX.read(data, { type: 'array' });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];sheetData.value = XLSX.utils.sheet_to_json(worksheet, { header: 1 });}, 500);

http://www.lryc.cn/news/477452.html

相关文章:

  • 【AI落地应用实战】HivisionIDPhotos AI证件照制作实践指南
  • php实现sl651水文规约解析
  • 【Linux】简易版shell
  • 宝塔Linux面板安装PHP扩展失败报wget: unable to resolve host address ‘download.bt.cn’
  • 问:Redis常见性能问题及解法?
  • Imperva 数据库与安全解决方案
  • 【JavaScript】之文档对象模型(DOM)详解
  • 速盾:cdn域名与ip区别
  • 如何优雅的在页面上嵌入AI-Agent人工智能
  • 如何对LabVIEW软件进行性能评估?
  • 动态规划 —— dp问题-按摩师
  • SQL 语法学习
  • MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)
  • 蓝桥杯 区间移位--二分、枚举
  • Nginx 报错400 Request Header Or Cookie Too Large
  • 【Redis】一种常见的Redis分布式锁原理简述
  • HOT100_最大子数组和
  • DiskGenius工具扩容Mac OS X Apple APFS分区
  • 从零开始的LeetCode刷题日记:70. 爬楼梯
  • Unity照片墙效果
  • 【自动化利器】12个评估大语言模型(LLM)质量的自动化框架
  • 【1】基础概念
  • HTML 文档规范与解析模式:DOCTYPE、<html> 标签以及结构化页面
  • 大模型微调技术 --> 脉络
  • 不要只知道deepl翻译,这里有10个专业好用的翻译工具等着你。
  • 第二节 管道符、重定向与环境变量
  • Linux 服务器使用指南:从入门到登录
  • QT 如何使QLabel的文字垂直显示
  • 蓬勃发展:移动开发——关于软件开发你需要知道些什么
  • 1095. 山脉数组中查找目标值