IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Vue.js中的Word文件预览功能实现指南:使用Vue-Office插件轻松展示文档

    满心记发表于 2023-11-01 03:55:54
    love 0

    word预览,实际在开发中,是个很常见的功能,无论是自己开发组件,还是借助开源组件等等,都可以,但是今天我分享一款借助vue-office来实现word预览

    vue-office简介

    vue-office是一个支持多种文件(docx、.xlsx、pdf)预览的vue组件库,支持vue2和vue3。

    目标是成为使用最简单,功能最强大的文件预览库

    vue-office功能特色

    • 一站式:提供docx、.xlsx、pdf多种文档的在线预览方案,有它就够了,不用四处寻找、测试、集成各种库了

    • 使用简单:只需提供文档的src(网络地址)即可完成文档预览,也支持ArrayBuffer、Blob等多种格式

    • 支持样式:不仅能预览内容,也支持文档样式,最大限度还原office文件内容

    安装

    1
    2
    3
    4
    5
    6
    7
    8
    #docx文档预览组件
    npm install @vue-office/docx vue-demi

    #excel文档预览组件
    npm install @vue-office/excel vue-demi

    #pdf文档预览组件
    npm install @vue-office/pdf vue-demi

    注意:如果是vue2.6版本或以下还需要额外安装 @vue/composition-api

    1
    npm install @vue/composition-api

    docx文件预览

    目前支持docx文件预览,不支持doc文件

    使用网络地址预览

    通过配置docx文件的远程地址实现预览,这种预览方式最简单。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <template>
    <vue-office-docx
    :src="docx"
    style="height: 100vh;"
    @rendered="renderedHandler"
    @error="errorHandler"
    />
    </template>

    <script>
    //引入VueOfficeDocx组件
    import VueOfficeDocx from '@vue-office/docx'
    //引入相关样式
    import '@vue-office/docx/lib/index.css'

    export default {
    components: {
    VueOfficeDocx
    },
    data() {
    return {
    docx: 'http://static.shanhuxueyuan.com/test6.docx' //设置文档网络地址,可以是相对地址
    }
    },
    methods: {
    renderedHandler() {
    console.log("渲染完成")
    },
    errorHandler() {
    console.log("渲染失败")
    }
    }
    }
    </script>

    可以设置组件的style配置样式,通常需要设置下高度height,如果不设置则默认取组件的父元素高度,最小高度300px。

    组件渲染完成会抛出rendered事件,渲染失败会抛出error事件。

    上传文件预览

    预览通常有两种场景,一种是已有文件的远程地址,另一种是上传前预览,上传前预览主要是通过读取文件的ArrayBuffer格式,传给预览组件来实现。

    我们以ElementUI的上传组件作为示例,当然也可以使用普通的input type=”file”,只要能获取文件的ArrayBuffer格式数据即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <template>
    <div id="docx-demo">
    <el-upload
    :limit="1"
    :file-list="fileList"
    accept=".docx"
    :beforeUpload="beforeUpload"
    action=""
    >
    <el-button size="small" type="warning">点击上传</el-button>
    </el-upload>
    <vue-office-docx :src="src"/>
    </div>
    </template>

    <script>
    import VueOfficeDocx from '@vue-office/docx'
    import '@vue-office/docx/lib/index.css'

    export default {
    components: {
    VueOfficeDocx
    },
    data() {
    return {
    src: '',
    fileList: []
    }
    },
    methods: {
    //在beforeUpload中读取文件内容
    beforeUpload(file) {
    let reader = new FileReader();
    reader.readAsArrayBuffer(file);
    reader.onload = (loadEvent) => {
    let arrayBuffer = loadEvent.target.result;
    this.src = arrayBuffer
    };
    return false
    }
    }
    }
    </script>

    主要是利用在beforeUpload中获取上传的文件,然后利用FileReader以ArrayBuffer格式读取,读取之后传给预览组件。

    如果是原生的input type=”file”,也是类似的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <template>
    <div>
    <input type="file" @change="changeHandle"/>
    <vue-office-docx :src="src"/>
    </div>
    </template>

    <script>
    import VueOfficeDocx from '@vue-office/docx'
    import '@vue-office/docx/lib/index.css'

    export default {
    components: {
    VueOfficeDocx
    },
    data() {
    return {
    src: ''
    }
    },
    methods: {
    changeHandle(event) {
    let file = event.target.files[0]
    let fileReader = new FileReader()
    fileReader.readAsArrayBuffer(file)
    fileReader.onload = () => {
    this.src = fileReader.result
    }
    }
    }
    }
    </script>

    xlsx文件预览

    目前只支持xlsx文件预览,不支持xls文件。

    使用网络地址预览

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <template>
    <vue-office-excel
    :src="excel"
    style="height: 100vh;"
    @rendered="renderedHandler"
    @error="errorHandler"
    />
    </template>

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

    export default {
    components: {
    VueOfficeExcel
    },
    data() {
    return {
    excel: 'http://static.shanhuxueyuan.com/demo/excel.xlsx'//设置文档地址
    }
    },
    methods: {
    renderedHandler() {
    console.log("渲染完成")
    },
    errorHandler() {
    console.log("渲染失败")
    }
    }
    }
    </script>

    上传文件预览

    和docx的上传文件预览一样,获取文件的ArrayBuffer,传给组件的src属性。

    pdf文件预览

    使用网络地址预览

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <template>
    <vue-office-pdf
    :src="pdf"
    @rendered="renderedHandler"
    @error="errorHandler"
    />
    </template>

    <script>
    //引入VueOfficePdf组件
    import VueOfficePdf from '@vue-office/pdf'

    export default {
    components: {
    VueOfficePdf
    },
    data() {
    return {
    pdf: 'http://static.shanhuxueyuan.com/test.pdf' //设置文档地址
    }
    },
    methods: {
    renderedHandler() {
    console.log("渲染完成")
    },
    errorHandler() {
    console.log("渲染失败")
    }
    }
    }
    </script>

    上传文件预览

    和docx的上传文件预览一样,获取文件的ArrayBuffer,传给组件的src属性。

    我这里主要分享以VUE为基础的样例,如果你不是该框架,可参考官方文档

    vue-office官网



沪ICP备19023445号-2号
友情链接