首页 > 其他分享 >vue 预览PDF、Docx、EXCEL文件

vue 预览PDF、Docx、EXCEL文件

时间:2023-04-11 10:58:34浏览次数:46  
标签:Docx vue const idNum EXCEL resCancel workbook id fileId

 

 

<template>
    <div class="contentArea">
       <div class="fileContainer" ref="fileDiv" v-if="$route.query.fileName.indexOf('docx') !== -1"></div>
       <div class="fileContainer" v-html="tableau" id="excelView" v-else></div>
    </div>
</template>

<script>
import XLSX from 'xlsx';
let docx = require("docx-preview");
import {FileDownload, xlsxFileDownload} from '@/api/index'
export default {
    data(){
        return{
            vHtml: '',
            tableau: '',
            fileId: '',
        }
    },
    mounted () {
        this.fileId = this.$route.query.fileId
        const fileName = this.$route.query.fileName
        if(fileName.indexOf('xls') !== -1){
            this.previewData()
        } else {
            this.getFile()
        }
        window.document.title = fileName
    },
    methods: {
        // word文件预览
        getFile(){
            FileDownload(this.fileId).then((res) => {
              const content = res.data;
              docx.renderAsync(content, this.$refs.fileDiv);
            }).catch(() => {
              this.$message.error('下载失败!')
            });
        },
        async previewPdfFile(){
            const resCancel = await xlsxFileDownload(this.fileId);
            // const url = window.URL.createObjectURL(file.originFileObj);
            const url = window.URL.createObjectURL(resCancel.data);
            window.open(url, file.name);
        },
        // xlsx预览
        async previewData() {
                const resCancel = await xlsxFileDownload(this.fileId);
                if (resCancel) {
                    const data = new Uint8Array(resCancel.data);
                    const workbook = XLSX.read(data, {
                        type: 'array', cellDates: true, dateNF: "yyyy-MM-dd"
                    });
                    // 删除掉没有数据的sheet
                    Object.values(workbook.Sheets).forEach((sheet, index) => {
                        if (Object.keys(sheet).indexOf('!ref') === -1) {
                            delete workbook.Sheets[workbook.SheetNames[index]];
                        }
                        Object.values(sheet).forEach(sec=>{
                          if(sec.constructor === Object && sec.t=='d'){
                            sec.w = this.$moment(sec.v).format("YYYY/MM/DD")
                          }
                        })

                    });
                    var worksheet = workbook.Sheets[workbook.SheetNames[0]]; // workbook.SheetNames 下存的是该文件每个工作表名字,这里取出第一个工作表
                    this.tableau = XLSX.utils.sheet_to_html(worksheet); // 渲染
                    this.$nextTick(function () {
                        // DOM加载完毕后执行,解决HTMLConnection有内容但是length为0问题。
                        this.setStyle4ExcelHtml();
                    });
                } else {
                    this.$message.warn(resCancel.errorMessage);

                }
            },
            // 设置Excel转成HTML后的样式
            setStyle4ExcelHtml() {
                const excelViewDOM = document.getElementById("excelView");
                if (excelViewDOM) {
                    const excelViewTDNodes = excelViewDOM.getElementsByTagName("td"); // 获取的是HTMLConnection
                    if (excelViewTDNodes) {
                        const excelViewTDArr = Array.prototype.slice.call(excelViewTDNodes);
                        for (const i in excelViewTDArr) {
                            const id = excelViewTDArr[i].id; // 默认生成的id格式为sjs-A1、sjs-A2......
                            if (id) {
                                const idNum = id.replace(/[^0-9]/gi, ""); // 提取id中的数字,即行号
                                if (idNum && (idNum === "1" || idNum === 1)) {
                                    // 第一行标题行
                                    excelViewTDArr[i].classList.add("class4Title");
                                } else if ((idNum !== "1" || idNum !== 1)) {
                                    // 第二行表头行
                                    excelViewTDArr[i].classList.add("class4TableTh");
                                }
                            }
                        }
                    }
                }
            },
    },

}
</script>

<style lang="less" scoped>
.contentArea{
    height: 100%;
    width: 100%;
}
.fileContainer{
    height: 100%;
    width: 100%;
}

/deep/ .class4Title {
    font-size: 18px !important;
    font-weight: bold !important;
    padding: 10px !important;
    border: 1px solid #e8e8e8;
    text-align: center;
}

/deep/ .class4TableTh {
    font-size: 12px !important;
    font-weight: bold !important;
    padding: 10px !important;
    border: 1px solid #e8e8e8;
    text-align: center;
    white-space: break-spaces

}

</style>

  

标签:Docx,vue,const,idNum,EXCEL,resCancel,workbook,id,fileId
From: https://www.cnblogs.com/cs122/p/17305442.html

相关文章

  • 在浏览器和node中使用 GitHub的js-xlsx库进行Excel文件处理(一)
    1.简介js-xlsx库是目前Github上star数量最多的处理Excel的库,功能强大,提供了各种对表格的操作,但是这个项目文档有些乱,提供的demo也只具备最基本的功能。Demo地址:http://oss.sheetjs.com/js-xlsxGithub上源码地址:http://git.io/xlsx支持解析的格式有:Excel2007+XML......
  • vue生命周期(钩子函数)
    目录介绍介绍Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。生命周期:vue实例从创建到销毁的过程。生命周期钩子:就是生命周期事件的别名而已钩子函数描述创建期间的......
  • ZR.Admin小改和VUE3版本体验
    前言孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!......回字有四样写法,你知道么?”大家好,我是44岁的大龄程序员码农阿峰。阿峰从事编程二十年了,虽然没有成为架构师,却也用过很多种架构。几年前开始研究JAVA企业级快速开发框架若依,后来发现了它的.net版本......
  • python3写csv中文文件,可以直接excel打开
    写出python3代码:将如下数据转为windowsexcel文件。 importcsvdata=[[1010205,'2022/11/23','R染(Inception)攻击','T89','在远程系统的启动文件登录后可以自动执行恶意脚本或可执行文件。','例:copyrogramData\Microsoft\W\Programs\StartUp',4,85,......
  • excel切片器多表/多图联动
    1、以相同的数据源建立不同维度的透视表(这一步最关键,数据源必须相同,否则无法进行多表链接)  2、选择期中一个数据透视表插入切片器  3、切片器空白处右键选择报表链接  4、在需要联动的透视表打勾即可以透视表为基础制作图标,即可实现多图联动 ......
  • 使用vue3创建后台管理项目
    最后案例:    一:创建一个Vue应用打开控制台:npminitvue@latest输入你需要创建的项目名称,一路回车   下载需要的包,如下:"dependencies":{"@element-plus/icons-vue":"^2.1.0","axios":"^1.3.5","element-plus"......
  • 在vue中为vuecal组件中的一个按钮添加点击事件
    现在需要为一个按钮添加点击事件由于vuecal文档中没有该按钮的点击事件,所以考虑使用原生dom为其添加点击事件使用原生dom添加使用this.$nextTick+.onclickthis.$nextTick(()=>{ //获取对应的dom元素 varotest=document.getElementsByClassName("vuecal__arrowvueca......
  • vue2源码-二、对象响应式原理
    //循环对象进行一次劫持classObserver{constructor(value){this.walk()}walk(data){//重新定义属性Object.keys(data).forEach((key)=>defineReactive(data,key, data[key]))}}//属性劫持//对对象target,定义属性key,值为value//使用Object.definProperty重......
  • Pandas模块实现向Excel写入数据
    Pandas模块实现向Excel写入数据importpandasaspddfData={#用字典设置DataFrame所需数据'序号':data[0],'项目':data[1],'数据':data[2]}#创建DataFramedf=pd.DataFrame(dfData)#存表,去除原始索引列(0,1,2...)df.to_excel(fi......
  • xlsxwriter模块实现向Excel表写数据
    xlsxwriter模块实现向Excel表写数据导入第三方库importxlsxwriterasxw写数据#创建工作簿workbook=xw.Workbook(filename)#创建子表worksheet1=workbook.add_worksheet("sheet1")#激活表worksheet1.activate()#设置表头title=['序号','项目','数据&#......