Excel预览

html 复制代码
<template>
  <div class="preview-page">
    <vue-office-excel :src="excel" :options="options" style="height: 100%;" @rendered="renderedHandler"
      @error="errorHandler" />
  </div>
</template>

<script setup>
import { ref } from 'vue'
//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
//引入相关样式
import '@vue-office/excel/lib/index.css'

/**
 * 将Excel序列日期转换为格式化日期
 * @param {number} serial - Excel日期序列值
 * @returns {string} 格式化后的日期字符串
 */
const excelSerialToDate = (serial) => {
  // Excel日期从1900-01-01开始,JavaScript从1970-01-01开始
  const utcDays = Math.floor(serial - 25569); // 25569是1900-01-01到1970-01-01的天数
  const utcValue = utcDays * 86400; // 转换为秒
  const dateInfo = new Date(utcValue * 1000);

  // 调整时区偏移
  const timezoneOffset = dateInfo.getTimezoneOffset() * 60000;
  const adjustedDate = new Date(dateInfo.getTime() + timezoneOffset);

  const month = adjustedDate.getMonth() + 1;
  const day = adjustedDate.getDate();

  return `${month}月${day}日`;
}

/**
 * 判断是否为Excel日期序列值
 * @param {*} value - 单元格值
 * @returns {boolean}
 */
const isExcelDateSerial = (value) => {
  return value >= 1 && value <= 2958465 // Excel支持的日期范围
}

/**
 * 处理单元格数据转换
 * @param {Object} workbookData - 工作簿数据
 * @returns {Object} 处理后的数据
 */
const transformCellData = (workbookData) => {
  console.log('transformData received:', workbookData)
  workbookData?.forEach(item => {
    Object.keys(item.rows)?.forEach(key => {
      if (item.rows[key] && item.rows[key].cells && isExcelDateSerial(Number(item.rows[key].cells[0].text))) {
        console.log(Number(item.rows[key].cells[0].text))
        item.rows[key].cells[0].text = excelSerialToDate(Number(item.rows[key].cells[0].text))
      }
    })

    item.styles?.forEach(self => {
      self.font.size += 2
    })
  })

  return workbookData
}

const options = ref({
  xls: false,       //预览xlsx文件设为false;预览xls文件设为true
  minColLength: 0,  // excel最少渲染多少列,如果想实现xlsx文件内容有几列,就渲染几列,可以将此值设置为0.
  minRowLength: 0,  // excel最少渲染多少行,如果想实现根据xlsx实际函数渲染,可以将此值设置为0.
  widthOffset: 70,  //如果渲染出来的结果感觉单元格宽度不够,可以在默认渲染的列表宽度上再加 Npx宽
  heightOffset: 0, //在默认渲染的列表高度上再加 Npx高
  beforeTransformData: (workbookData) => {
    return workbookData
  }, //底层通过exceljs获取excel文件内容,通过该钩子函数,可以对获取的excel文件内容进行修改,比如某个单元格的数据显示不正确,可以在此自行修改每个单元格的value值。
  transformData: (workbookData) => {
    return transformCellData(workbookData)
  }, //将获取到的excel数据进行处理之后且渲染到页面之前,可通过transformData对即将渲染的数据及样式进行修改,此时每个单元格的text值就是即将渲染到页面上的内容
})
const excel = ref('/spoverview/config/dutyInfo/export/folder/V1')
</script>


<style lang="scss" scoped>
.preview-page {
  height: 100%;
  width: 100%;
}
</style>
相关推荐
福兮说2 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理3 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6663 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)4 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan4 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_5 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒5 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技5 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu6 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
默_笙6 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript