實現(xiàn)從Vue項目中將數(shù)據(jù)導(dǎo)出為Excel是一個很常見的需求。而在Excel中,有時候我們也需要將數(shù)據(jù)導(dǎo)出為圖片,例如在做數(shù)據(jù)報表展示時,需要將圖表導(dǎo)出為圖片。
Vue項目中有一個很好用的插件xlsx,它可以讓我們非常方便地實現(xiàn)Excel文件的讀寫。同時,我們還可以通過它將Excel中的圖表導(dǎo)出為圖片。具體的實現(xiàn)方式如下:
import XLSX from 'xlsx' export function exportImage (chartInstance, filename) { // 獲取圖表的SVG代碼 const chartSVG = chartInstance.getSVG() // 動態(tài)創(chuàng)建畫布,并將SVG代碼渲染到畫布上 const canvas = document.createElement('canvas') canvas.width = chartInstance.width canvas.height = chartInstance.height const ctx = canvas.getContext('2d') const img = new Image() img.onload = function () { ctx.drawImage(img, 0, 0) // 將畫布轉(zhuǎn)化為dataURL const dataURL = canvas.toDataURL('image/png') // 創(chuàng)建一個workbook對象 const wb = XLSX.utils.book_new() // 創(chuàng)建一個工作表,并在工作表中插入一張圖片 const ws = XLSX.utils.aoa_to_sheet([[]], {cellStyles: true}) XLSX.utils.sheet_add_image(ws, { headerFooter: false, name: 'chart', // 將dataURL作為圖片的地址 data: dataURL, // 設(shè)置圖片的長寬 fileopts: {base64: true, filename: 'chart.png', width: chartInstance.width, height: chartInstance.height} }) XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') // 以blob的方式生成Excel文件,并下載 XLSX.writeFile(wb, `${filename}.xlsx`, {type: 'blob'}) } img.src = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(chartSVG.outerHTML)))}` }
上述代碼中的exportImage函數(shù)接收兩個參數(shù):第一個參數(shù)是一個圖表的實例對象,第二個參數(shù)是導(dǎo)出文件的名稱。具體的代碼注釋已經(jīng)非常詳細,這里簡單說明一下實現(xiàn)流程:
- 通過chartInstance.getSVG()獲取圖表的SVG代碼
- 使用canvas將SVG代碼渲染成圖片,并將其轉(zhuǎn)化為dataURL
- 創(chuàng)建一個workbook對象,并在其中創(chuàng)建一個工作表,插入渲染出來的圖片
- 使用XLSX.writeFile將workbook對象轉(zhuǎn)化為Excel文件,并以blob形式下載
最后再補充一點,在運行上述代碼時,可能會遇到因為圖片過大而導(dǎo)致Excel文件打開緩慢或者圖片無法正常顯示的問題。這時候我們可以嘗試降低圖片的分辨率或者壓縮圖片的質(zhì)量。