国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題

這篇具有很好參考價值的文章主要介紹了VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考:https://www.codetd.com/article/15219743

  1. 安裝
// 安裝 docxtemplater
npm install docxtemplater pizzip  --save
// 安裝 jszip-utils
npm install jszip-utils --save 
// 安裝 jszip
npm install jszip --save
// 安裝 FileSaver
npm install file-saver --save
// 引入處理圖片的插件1
npm install docxtemplater-image-module-free --save
// 引入處理圖片的插件2
npm install angular-expressions --save
  1. 關鍵代碼JS部分
/**
 * 導出word文檔(帶圖片) doc.js
 * 
 */
import Docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'

/**
 * 將base64格式的數據轉為ArrayBuffer
 * @param {Object} dataURL base64格式的數據
 */
function base64DataURLToArrayBuffer(dataURL) {
    const base64Regex = /^data:image\/(png|jpg|jpeg|svg|svg\+xml);base64,/;
    if (!base64Regex.test(dataURL)) {
        return false;
    }
    const stringBase64 = dataURL.replace(base64Regex, "");
    let binaryString;
    if (typeof window !== "undefined") {
        binaryString = window.atob(stringBase64);
    } else {
        binaryString = Buffer.from(stringBase64, "base64").toString("binary");
    }
    const len = binaryString.length;
    const bytes = new Uint8Array(len);
    for (let i = 0; i < len; i++) {
        const ascii = binaryString.charCodeAt(i);
        bytes[i] = ascii;
    }
    return bytes.buffer;
}

export const ExportBriefDataDocx = (tempDocxPath, data, fileName, imgSize) => {
    console.log(111, tempDocxPath, data, fileName, imgSize)
    //這里要引入處理圖片的插件
    var ImageModule = require('docxtemplater-image-module-free');
    var expressions = require('angular-expressions')
    var assign = require('lodash/assign')
    var last = require("lodash/last")
    expressions.filters.lower = function (input) {
        // This condition should be used to make sure that if your input is
        // undefined, your output will be undefined as well and will not
        // throw an error
        if (!input) return input
        // toLowerCase() 方法用于把字符串轉換為小寫。
        return input.toLowerCase()
    }
    function angularParser(tag) {
        tag = tag
            .replace(/^\.$/, 'this')
            .replace(/(|)/g, "'")
            .replace(/(|)/g, '"')
        const expr = expressions.compile(tag)
        return {
            get: function (scope, context) {
                let obj = {}
                const index = last(context.scopePathItem)
                const scopeList = context.scopeList
                const num = context.num
                for (let i = 0, len = num + 1; i < len; i++) {
                    obj = assign(obj, scopeList[i])
                }
                //word模板中使用 $index+1 創(chuàng)建遞增序號
                obj = assign(obj, { $index: index })
                return expr(scope, obj)
            }
        }
    }
    JSZipUtils.getBinaryContent(tempDocxPath, (error, content) => {
        if (error) {
            console.log(error)
        }
        expressions.filters.size = function (input, width, height) {
            return {
                data: input,
                size: [width, height],
            };
        };
       
        let opts = {}

        opts = {
            //圖像是否居中
            centered: true
        };
        opts.getImage = (chartId) => {
            //將base64的數據轉為ArrayBuffer
            return base64DataURLToArrayBuffer(chartId);
        }
        opts.getSize = function (img, tagValue, tagName) {
            //自定義指定圖像大小
            if (imgSize.hasOwnProperty(tagName)) {
                return imgSize[tagName];
            } else {
                return [200, 200];
            }
        }




        // 創(chuàng)建一個JSZip實例,內容為模板的內容        
        const zip = new PizZip(content)
        // 創(chuàng)建并加載 Docxtemplater 實例對象
        
        // 設置模板變量的值
        
		let doc = new Docxtemplater();
        doc.attachModule(new ImageModule(opts));
        doc.loadZip(zip);
        doc.setOptions({parser:angularParser});
        doc.setData(data)
        try {
            // 呈現文檔,會將內部所有變量替換成值,
            doc.render()
        } catch (error) {
            const e = {
                message: error.message,
                name: error.name,
                stack: error.stack,
                properties: error.properties

            }
            console.log('err',{ error: e })
            // 當使用json記錄時,此處拋出錯誤信息
            throw error
        }
        // 生成一個代表Docxtemplater對象的zip文件(不是一個真實的文件,而是在內存中的表示)
        const out = doc.getZip().generate({
            type: 'blob',
            mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        })
        // 將目標文件對象保存為目標類型的文件,并命名
        saveAs(out, fileName)
    })
}

/**
 1. 將圖片的url路徑轉為base64路徑
 2. 可以用await等待Promise的異步返回
 3. @param {Object} imgUrl 圖片路徑
 */
export function getBase64Sync(imgUrl) {
    return new Promise(function (resolve, reject) {
        // 一定要設置為let,不然圖片不顯示
        let image = new Image();
        //圖片地址
        image.src = imgUrl;
        // 解決跨域問題
        image.setAttribute("crossOrigin", '*');  // 支持跨域圖片
        // image.onload為異步加載
        image.onload = function () {
            let canvas = document.createElement("canvas");
            canvas.width = image.width; 
            canvas.height = image.height;
            let context = canvas.getContext("2d");
            context.drawImage(image, 0, 0, image.width, image.height);
            //圖片后綴名
            let ext = image.src.substring(image.src.lastIndexOf(".") + 1).toLowerCase();
            //圖片質量
            let quality = 0.8;
            //轉成base64
            let dataurl = canvas.toDataURL("image/" + ext, quality);
            //返回
            resolve(dataurl);
        };
    })
}
  1. 導出函數
    vue 中引入上述js文件和方法
import {ExportBriefDataDocx,getBase64Sync} from './doc.js'
async ExportBriefDataDocx(){
            //圖片轉base64
			 let imgurl= await getBase64Sync('圖片路徑') 
			 let imgurl2= await getBase64Sync('圖片路徑')
			 let  data= {
				name:this.name,
				imgurl:this.imgurl,
				imgurl2:this.imgurl2
			}
	        let imgSize = {
			//控制導出的word圖片大小,可自定義
	          imgurl:[200, 200],
	          imgurl2:[200, 200],
	        };
	        exportWord("/我的模板.docx", data, `${this.listname}.docx`, imgSize);
	        //docx模板放在public文件夾下,如果是vue2放在static下
	        // ExportBriefDataDocx("/static/我的模板.docx", data, `${listname}.docx`, imgSize);
	      }	
  1. 模板內容
    自己準備一個docx文檔,然后里面標注好需替換的參數
    列表循環(huán)-- {#list}{name}{/list}
    單個參數–{}
    圖片–{%imgUrl}
    VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端
    大概就這些,我也是從參考鏈接里看到的,至此基本能解決大部分問題,但是我還遇到了兩個問題,所以自己記錄補充一下
  2. 表格循環(huán)打印會多出空格
    VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端
    我想循環(huán)表格出來,但是輸入數據,出來后實際是這樣的
let  data= {
      ld:[{data1:1,data2:2},{data1:1,data2:2}],
    }      
    ExportBriefDataDocx("/static/wd.docx", data, `${listname}.docx`, imgSize);

VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端
多出了很多空格,我想著去掉模板中的換行符,像這樣
VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端
我本來是想著這樣就能少一行,就是正常表格了,但是其實報錯了
message: ‘The filetype for this file could not be identified, is this file corrupted ?’, stack: ‘Error: The filetype for this file could not be ide…//./node_modules/jszip-utils/lib/index.js:110:25)’
大概就是類型不對,讀不出來什么的
后來靈光一閃,想到參考鏈接里各種數據都是在表格里的,應該沒問題,所以我就想著開始結束都放進去,就像這樣
VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端
然后結果就對了
VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題,canvas,js,vue,vue.js,word,前端

7.保存圖片模糊問題 quality = 1也沒啥用

改成這樣,導出后的圖片能經得起縮放文章來源地址http://www.zghlxwxcb.cn/news/detail-609750.html

export function getBase64Sync(imgUrl,width,height) {
//傳入你想要的寬高,最好大一點,這個不會影響導出后的大小,這里的寬高可以理解為分辨率,就是canvas繪制的時候的大小,imgSize里的才是導出到文檔的大小
    return new Promise(function (resolve, reject) {
        // 一定要設置為let,不然圖片不顯示
        let image = new Image();
        //圖片地址
        image.src = imgUrl;
        // 解決跨域問題
        image.setAttribute("crossOrigin", '*');  // 支持跨域圖片
        // image.onload為異步加載
        image.onload = function () {
            let canvas = document.createElement("canvas");
            canvas.width = width*2;   
            canvas.height = height*2; //寬高放大兩倍
            let context = canvas.getContext("2d");
            context.drawImage(image, 0, 0); 
            //圖片后綴名
            let ext = image.src.substring(image.src.lastIndexOf(".") + 1).toLowerCase();
            //圖片質量
            //let quality = 1;
            //轉成base64
            let dataurl = canvas.toDataURL("image/"+ext);
           //返回
            resolve(dataurl);
        };
    })
}

到了這里,關于VUE使用docxtemplater導出word(帶圖片) 踩坑 表格循環(huán)空格 ,canvas.toDataURL圖片失真模糊問題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 使用poi-tl向word插入圖片、文本、表格行循環(huán)

    使用poi-tl向word插入圖片、文本、表格行循環(huán)

    工作中難免會向word中操作數據,本文主要介紹poi-tl的使用,先來看效果圖 核心介紹: 標簽 1、插入文本標簽 : {{var}} 2、插入圖片標簽: {{@var}} 操作步驟: 1、引入依賴 2、Java核心代碼 官方網址:http://deepoove.com/poi-tl/ 1、準備模版,定義好需要的標簽 2、查詢模版 3、獲取需要填

    2024年02月05日
    瀏覽(151)
  • java導出word(含圖片、表格)

    java導出word(含圖片、表格)

    1.pom 引入 2.java代碼示例 3.效果展示

    2024年02月07日
    瀏覽(29)
  • element-ui框架下通過docxtemplater插件導出word文件

    element-ui框架下通過docxtemplater插件導出word文件

    預先寫好的word 生成的帶數據word文檔 docxtemplater 使用 JSON 數據格式作為輸入,可以處理docx 和 ppt模板。不像一些其它的工具,比如 docx.js, docx4j, python-docx 等,需要自己編寫代碼來生成文件,docxtemplater只需要用戶通過標簽的形式編寫模板,就可以生成文件 安裝依賴 項目所需依

    2024年02月04日
    瀏覽(18)
  • 若依框架中使用FreeMarker使用word動態(tài)模板生成pdf給前端展示(模板中并沒用使用到圖片,所以沒有圖片的方法,只用了表格展示數據,模板里面只涉及到了循環(huán)判斷和日期格式)

    若依框架中使用FreeMarker使用word動態(tài)模板生成pdf給前端展示(模板中并沒用使用到圖片,所以沒有圖片的方法,只用了表格展示數據,模板里面只涉及到了循環(huán)判斷和日期格式)

    首先使用word創(chuàng)建動態(tài)模板 ?下方兩組信息是通過循環(huán)展示的,在生成模板時注意,如果不點擊里面表格,選擇居中表格打印出來可能還有偏差,兩邊距離頁面拒了可能不一樣 存儲需要的模板時注意 ? ? ?存成這個格式,如果不是2003可能會有坑,找到你生成的.xml文件,把后綴改成ftl ?

    2024年02月04日
    瀏覽(26)
  • easypoi 導出word表格

    template.docx 模板內容: {{0}} {{1}} {{2}} {{3}} {{4}} {{5}} 學生姓名 學生年齡 學生生日 語文成績 數學成績 template_job.docx 模板內容: 名稱 年齡 地址 名稱2 {{user.name}} {{user.age}} {{user.address}} {{user.other}} 公司名稱 地址 {{$fe:jobs t.name t.address}}

    2024年02月13日
    瀏覽(32)
  • 【工具插件類教學】NPOI插件使用Excel表格的導入和導出(包含圖片)

    目錄 一.導入Excel?解析讀取 1.選擇導入的目標文件 2.解析讀取導入的文件

    2024年01月16日
    瀏覽(33)
  • vue 使用docx庫生成word表格文檔

    ????????在Vue.js中生成Word表格文檔,可以通過前端庫來實現。這些庫可以幫助我們輕松地將HTML表格轉換為Word文檔(通常是.docx格式)。以下是一些流行的前端庫,它們可以用于在Vue項目中生成Word表格文檔: ???????? ????????docx是一個流行的JavaScript庫,用于在瀏覽

    2024年02月21日
    瀏覽(20)
  • poi-tl導出word復雜表格(單元格合并,生成復雜表格)

    poi-tl導出word復雜表格(單元格合并,生成復雜表格)

    官方文檔地址:http://deepoove.com/poi-tl/ 源碼地址:https://github.com/Sayi/poi-tl poi-tl(poi template language)是Word模板引擎,使用Word模板和數據創(chuàng)建很棒的Word文檔。 最近在做項目時候有一個關于導出Word的文件的需求,需要導出的word文件較大,并且格式比較復雜,使用poi-tl可以很好的

    2024年02月16日
    瀏覽(23)
  • 怎么把圖片表格轉換成word表格?幾個步驟達成

    怎么把圖片表格轉換成word表格?幾個步驟達成

    在處理文檔時,圖片表格的轉換是一個常見的需求。而手動輸入表格是非常耗時的,因此,使用文本識別軟件來自動轉換圖片表格可以大大提高工作效率。在本文中,我們將介紹如何使用OCR文字識別技術來將圖片表格轉換為Word表格。 ? OCR文字識別軟件 OCR技術可以識別圖片中

    2024年02月13日
    瀏覽(17)
  • JAVA poi-tl 制作word模板 表格數據行循環(huán) 帶有復選框勾選的表格

    JAVA poi-tl 制作word模板 表格數據行循環(huán) 帶有復選框勾選的表格

    ????????java項目實際開發(fā)中經常會遇到制作word表單且表格數據行循環(huán)功能,甚至帶有復選框勾選功能,本文簡單介紹如何制作模板以及使用poi-tl生成word。 提示:以下是本篇文章正文內容,下面案例可供參考 如果只用到word那么需要導入的依賴如下(本案例只需要如下2個依

    2024年04月12日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包