欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端Vue.js實現(xiàn)json數(shù)據(jù)導出到doc

 更新時間:2022年09月15日 09:53:56   作者:baldwin???????  
這篇文章主要介紹了前端Vue.js實現(xiàn)json數(shù)據(jù)導出到doc,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言:

先說下需求:如何批量導出表格中勾選的數(shù)據(jù),導出格式為word,并具有一定的格式!

開發(fā)環(huán)境:vue3、node v14.15.0

組件選擇

因為導出word需要保留一定的格式,所以這里選擇docxtemplater,利用定制導出模板的方式限制數(shù)據(jù)的導出格式。

實現(xiàn)一個最簡單的導出

安裝(后續(xù)的demo依賴相同)

yarn add docxtemplater pizzip file-saver

用法:

onst PizZip = require("pizzip");
const Docxtemplater = require("docxtemplater");
const fs = require("fs");
const path = require("path");
// Load the docx file as binary content
const content = fs.readFileSync(
    path.resolve(__dirname, "input.docx"),
    "binary"
);
const zip = new PizZip(content);
const doc = new Docxtemplater(zip, {
    paragraphLoop: true,
    linebreaks: true,
});
// Render the document (Replace {first_name} by John, {last_name} by Doe, ...)
doc.render({
    first_name: "John",
    last_name: "Doe",
    phone: "0652455478",
    description: "New Website",
});
const buf = doc.getZip().generate({
    type: "nodebuffer",
    // compression: DEFLATE adds a compression step.
    // For a 50MB output document, expect 500ms additional CPU time
    compression: "DEFLATE",
});

單條數(shù)據(jù)導出到word

配置導出模板,并上傳CDN,模板格式如下:

導出的數(shù)據(jù)結構:

{
    "title": "第一篇",
    "gradeId": "三年級上",
    "genreDesc": "議論文",
    "subjectMatterInfo": "敘事",
    "content": "\t一個晴朗的星期天,爸爸和媽媽帶我到北海公園去玩兒。那天秋高氣爽,太陽在藍",
    "remark": "點評1"
}

導出wrod截圖

具體實現(xiàn):

import Docxtemplater from 'docxtemplater';
import PizZip from 'pizzip';
import PizZipUtils from 'pizzip/utils/index.js';
import {saveAs} from 'file-saver';

function loadFile(url, callback) {
    PizZipUtils.getBinaryContent(url, callback);
}

export const renderDoc = data => {
    loadFile('你上傳導出模板的CDN鏈接.docx', (error, content) => {
        if (error) {
            throw error;
        }
        const zip = new PizZip(content);
        const doc = new Docxtemplater(zip, {linebreaks: true});
        doc.setData(data);
        try {
            // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
            doc.render();
        }
        catch (error) {
            // The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
            function replaceErrors(key, value) {
                if (value instanceof Error) {
                    return Object.getOwnPropertyNames(value).reduce((error, key) => {
                        error[key] = value[key];
                        return error;
                    }, {});
                }
                return value;
            }
            console.log(JSON.stringify({error}, replaceErrors));

            if (error.properties && error.properties.errors instanceof Array) {
                const errorMessages = error.properties.errors
                    .map(error => error.properties.explanation)
                    .join('\n');
                console.log('errorMessages', errorMessages);
                // errorMessages is a humanly readable message looking like this :
                // 'The tag beginning with "foobar" is unopened'
            }
            throw error;
        }
        const out = doc.getZip().generate({
            type: 'blob',
            mimeType:
                'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        });
        // Output the document using Data-URI
        saveAs(out, '導出word.docx');
    });
};

批量數(shù)據(jù)導出到wrod

配置導出模板,并上傳CDN,模板格式如下:

#articles為循環(huán)開始,/為循環(huán)結束,中間是循環(huán)體

導出的數(shù)據(jù)結構:

{
    "articles": [
        {
            "title": "第一篇",
            "gradeId": "三年級上",
            "genreDesc": "議論文",
            "subjectMatterInfo": "敘事",
            "content": "\t一個晴朗的星期天,爸爸和媽媽帶我到北海公園去玩兒。那天秋高氣爽,太陽在藍",
            "remark": "點評1"
        },
        {
            "title": "第二篇",
            "gradeId": "三年級下",
            "genreDesc": "記敘文",
            "subjectMatterInfo": "寫人",
            "content": "\t一個晴朗的星期天,爸爸和媽媽帶我到北海公園去玩兒媽帶我到北海公園去玩兒。那天秋高氣爽,太陽在藍。\n問女何所思,問女何所憶。女亦無所思,女亦無所憶。昨夜見軍帖,可汗大點兵,軍書十二卷,卷卷有爺名。阿爺無大兒,木蘭無長兄,愿為市鞍馬,從此替爺征。問女何所思,問女何所憶。女亦無所思,女亦無所憶。昨夜見軍帖,可汗大點兵,軍書十二卷,卷卷有爺名。阿爺無大兒,木蘭無長兄,愿為市鞍馬,從此替爺征。",
            "remark": "點評2"
        }
    ]
}

導出wrod截圖:

具體實現(xiàn):

import Docxtemplater from 'docxtemplater';
import PizZip from 'pizzip';
import PizZipUtils from 'pizzip/utils/index.js';
import {saveAs} from 'file-saver';

function loadFile(url, callback) {
    PizZipUtils.getBinaryContent(url, callback);
}
export const renderDoc = data => {
    loadFile('你上傳導出模板的CDN鏈接.docx', (error, content) => {
        if (error) {
            throw error;
        }
        const zip = new PizZip(content);
        // paragraphLoop段落循環(huán)
        const doc = new Docxtemplater(zip, {paragraphLoop: true, linebreaks: true});
        doc.setData(data);
        try {
            // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
            doc.render();
        }
        catch (error) {
            // The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
            function replaceErrors(key, value) {
                if (value instanceof Error) {
                    return Object.getOwnPropertyNames(value).reduce((error, key) => {
                        error[key] = value[key];
                        return error;
                    }, {});
                }
                return value;
            }
            console.log(JSON.stringify({error}, replaceErrors));

            if (error.properties && error.properties.errors instanceof Array) {
                const errorMessages = error.properties.errors
                    .map(error => error.properties.explanation)
                    .join('\n');
                console.log('errorMessages', errorMessages);
                // errorMessages is a humanly readable message looking like this :
                // 'The tag beginning with "foobar" is unopened'
            }
            throw error;
        }
        const out = doc.getZip().generate({
            type: 'blob',
            mimeType:
                'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        });
        // Output the document using Data-URI
        saveAs(out, '導出word.docx');
    });
};

到此這篇關于前端Vue.js實現(xiàn)json數(shù)據(jù)導出到doc的文章就介紹到這了,更多相關Vue.js json數(shù)據(jù)導出doc內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決vue中post方式提交數(shù)據(jù)后臺無法接收的問題

    解決vue中post方式提交數(shù)據(jù)后臺無法接收的問題

    今天小編就為大家分享一篇解決vue中post方式提交數(shù)據(jù)后臺無法接收的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue實現(xiàn)移動端左右滑動效果的方法

    Vue實現(xiàn)移動端左右滑動效果的方法

    最近得到一個新需求,需要在Vue項目的移動端頁面上加上左右滑動效果,經過一番折騰,最終決定四月vue-touch。下面小編把實現(xiàn)代碼分享給大家,感興趣的朋友一起看看吧
    2018-11-11
  • 解決vue3+vite配置unplugin-vue-component找不到Vant組件

    解決vue3+vite配置unplugin-vue-component找不到Vant組件

    這篇文章主要為大家介紹了vue3+vite配置unplugin-vue-component找不到Vant組件問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 深入解析Vue 組件命名那些事

    深入解析Vue 組件命名那些事

    本篇文章主要介紹了深入解析Vue 組件命名那些事,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue 1.0 結合animate.css定義動畫效果

    vue 1.0 結合animate.css定義動畫效果

    本文分步驟給大家介紹了Vue 1.0自定義動畫效果,vue1.0代碼結合animate.css定義動畫,頁面一定要引入animate.cdd,具體實例代碼大家參考下本文
    2018-07-07
  • vue自動添加瀏覽器兼容前后綴操作

    vue自動添加瀏覽器兼容前后綴操作

    這篇文章主要介紹了vue自動添加瀏覽器兼容前后綴操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 詳解基于vue-cli3快速發(fā)布一個fullpage組件

    詳解基于vue-cli3快速發(fā)布一個fullpage組件

    這篇文章主要介紹了詳解基于vue-cli3快速發(fā)布一個fullpage組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 淺析vue中常見循環(huán)遍歷指令的使用 v-for

    淺析vue中常見循環(huán)遍歷指令的使用 v-for

    這篇文章主要介紹了vue中常見循環(huán)遍歷指令的使用 v-for,包括v-for遍歷數(shù)組,v-for遍歷json對象,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2018-04-04
  • vue中關于router.beforeEach()的用法

    vue中關于router.beforeEach()的用法

    這篇文章主要介紹了vue中關于router.beforeEach()的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue響應式原理模擬實現(xiàn)原理探究

    Vue響應式原理模擬實現(xiàn)原理探究

    這篇文章主要介紹了Vue響應式原理,響應式就是當對象本身(對象的增刪值)或者對象屬性(重新賦值)發(fā)生了改變的時候,就會運行一些函數(shù),最常見的示render函數(shù)
    2022-09-09

最新評論