在Vue中使用xlsx組件實(shí)現(xiàn)Excel導(dǎo)出功能的步驟詳解
1、項(xiàng)目設(shè)置
首先,在控制臺執(zhí)行以下命令安裝xlsx組件;
npm install xlsx --save 或 yarn add xlsx --save
然后,在vue項(xiàng)目中引入xls組件;
2、準(zhǔn)備數(shù)據(jù)
要導(dǎo)出到Excel,您需要有數(shù)據(jù)。您可以使用本地?cái)?shù)據(jù)或從API獲取數(shù)據(jù)。在本示例中,我們將使用本地?cái)?shù)據(jù):
exportData: [
{ name: "John", age: 30, city: "New York" },
{ name: "Alice", age: 25, city: "Los Angeles" },
{ name: "Bob", age: 35, city: "Chicago" }
]
3、實(shí)現(xiàn)導(dǎo)出功能
創(chuàng)建導(dǎo)出到Excel的方法。這個(gè)方法將觸發(fā)Excel文件的生成和下載:
exportToExcel() {
const worksheet = XLSX.utils.json_to_sheet(this.exportData);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
XLSX.writeFile(workbook, "exported-data.xlsx");
}這個(gè)方法使用xlsx組件將數(shù)據(jù)轉(zhuǎn)換為Excel工作表,然后創(chuàng)建一個(gè)工作簿并將工作表添加到工作簿中。最后,它使用XLSX.writeFile方法將工作簿保存為名為"exported-data.xlsx"的Excel文件。
4、設(shè)置列寬自適應(yīng)
根據(jù)導(dǎo)出數(shù)據(jù)的長度,通過遍歷計(jì)算每列的最大長度,然后通過worksheet['!cols']方法設(shè)置每列寬度;
// 設(shè)置列寬
exportData.forEach((row, rowIndex) => {
row.forEach((cell, cellIndex) => {
const list = arrData.map(item => {
const val = item[cellIndex] as string;
if(isEmptyString(val)){
return 1;
} else if(val.toString().charCodeAt(0) > 255){ // 判斷是否有中文
return val.toString().length * 2
} else{
return val.toString().length;
}
});
const maxLength = Math.max(...list);
const width = maxLength * 1.1; // 根據(jù)實(shí)際內(nèi)容長度自動(dòng)調(diào)整列寬
if(!worksheet["!cols"]) worksheet["!cols"] = [];
if(!worksheet["!cols"][cellIndex]) worksheet["!cols"][cellIndex] = {wch: 8};
worksheet['!cols'][cellIndex].wch = width; // 使用worksheet的 '!cols' 來設(shè)置列寬
});
}); 5、設(shè)置合并單元格
通過worksheet["!merges"]方法可以設(shè)置合并單元格;
// 合并單元格
merges.forEach((item) => {
if(!worksheet["!merges"]){
worksheet["!merges"] = [];
};
worksheet["!merges"].push(item);
// worksheet["!merges"].push({
// s: { r: 2, c: 1 }, // s ("start"): c = 1 r = 2 -> "B3"
// e: { r: 3, c: 4 } // e ("end"): c = 4 r = 3 -> "E4"
// });
});6、設(shè)置導(dǎo)出Excel表格的樣式
xlsx組件庫是不支持設(shè)置Excel表格樣式的,但是可以通過引入xlsx-style-vite組件庫來實(shí)現(xiàn)樣式的設(shè)置;然后通過file-saver導(dǎo)出文件;
6.1 安裝并引入xlsx-style-vite和file-saver組件
yarn add xlsx-style-vite --save yarn add file-saver --save
import XLSXStyle from 'xlsx-style-vite'; import XLSX_SAVE from 'file-saver';
其中 xlsx-style-vite組件是xlsx-style組件的vite版本,用于解決在vite下引入xlsx-style異常的問題;
6.2 設(shè)置單元格居中
遍歷所有單元格,然后通過worksheet[column].s方法設(shè)置每個(gè)單元格的樣式;
exportData.forEach((row, rowIndex) => {
row.forEach((cell, cellIndex) => {
// 設(shè)置所有單元格居中
let column = utils.encode_cell({c: cellIndex, r: rowIndex});
worksheet[column].s = {
alignment: {
horizontal: 'center',
vertical: 'center',
wrapText: false, // 自動(dòng)換行
},
}
});
}); 6.3 設(shè)置單元格背景色和字體
exportData.forEach((row, rowIndex) => {
row.forEach((cell, cellIndex) => {
// 設(shè)置所有單元格居中
let column = utils.encode_cell({c: cellIndex, r: rowIndex});
if(worksheet[column]){
// 設(shè)置背景色、加粗展示
worksheet[column].s = {
font: {
name: "微軟雅黑",
sz: 16,
color: { rgb: "000000" },
bold: true,
italic: false,
underline: false,
},
fill: {
fgColor: { rgb: "C5D9F1" },
},
alignment: {
horizontal: 'center',
vertical: 'center',
wrapText: false, // 自動(dòng)換行
},
}
}
}
});
}); 6.4 設(shè)置單元格邊框
//單元格外側(cè)框線
const borderAll = {
top: {
style: "thin",
},
bottom: {
style: "thin",
},
left: {
style: "thin",
},
right: {
style: "thin",
},
};
// 設(shè)置單元格邊框
arrData.forEach((row, rowIndex) => {
row.forEach((cell, cellIndex) => {
let column = utils.encode_cell({c: cellIndex, r: rowIndex});
if(worksheet[column]){
worksheet[column].s = {
border: borderAll,
}
}
}
});
}); 6.5 導(dǎo)出文件
必須通過file-saver組件導(dǎo)出Excel文件,不能通過xlsx組件的writeFile方法導(dǎo)出文件,否則樣式無法生效;
const wbout = XLSXStyle.write(workbook, {
type: 'binary',
bookType: 'xlsx',
});
XLSX_SAVE.saveAs(
new Blob([s2ab(wbout)], {
type: 'application/octet-stream',
}),
'exported-data.xlsx',
);
// 數(shù)據(jù)轉(zhuǎn)換
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}7、完整代碼示例
import * as xlsx from 'xlsx';
import type { WorkBook } from 'xlsx';
import type { JsonToSheet, AoAToSheet } from './typing';
import XLSXStyle from 'xlsx-style-vite';
import XLSX_SAVE from 'file-saver';
import { isEmptyString } from '@/utils/table';
const { utils, writeFile } = xlsx;
const DEF_FILE_NAME = 'excel-list.xlsx';
export function aoaToSheetXlsx<T = any>({
data,
header,
filename = DEF_FILE_NAME,
write2excelOpts = { bookType: 'xlsx' },
merges = [],
}: AoAToSheet<T>) {
const arrData = [...data];
if (header) {
arrData.unshift(header);
}
const worksheet = utils.aoa_to_sheet(arrData);
/* add worksheet to workbook */
const workbook: WorkBook = {
SheetNames: [filename],
Sheets: {
[filename]: worksheet,
},
};
//單元格外側(cè)框線
const borderAll = {
top: {
style: "thin",
},
bottom: {
style: "thin",
},
left: {
style: "thin",
},
right: {
style: "thin",
},
};
// 設(shè)置列寬
arrData.forEach((row, rowIndex) => {
row.forEach((cell, cellIndex) => {
const list = arrData.map(item => {
const val = item[cellIndex] as string;
if(isEmptyString(val)){
return 1;
} else if(val.toString().charCodeAt(0) > 255){ // 判斷是否有中文
return val.toString().length * 2
} else{
return val.toString().length;
}
});
const maxLength = Math.max(...list);
const width = maxLength * 1.1; // 根據(jù)實(shí)際內(nèi)容長度自動(dòng)調(diào)整列寬
if(!worksheet["!cols"]) worksheet["!cols"] = [];
if(!worksheet["!cols"][cellIndex]) worksheet["!cols"][cellIndex] = {wch: 8};
worksheet['!cols'][cellIndex].wch = width; // 使用worksheet的 '!cols' 來設(shè)置列寬
// 設(shè)置所有單元格居中
let column = utils.encode_cell({c: cellIndex, r: rowIndex});
if(worksheet[column]){
if(rowIndex === 0) { // 標(biāo)題行設(shè)置背景色、加粗展示
worksheet[column].s = {
border: borderAll,
font: {
// name: "微軟雅黑",
// sz: 16,
color: { rgb: "000000" },
bold: true,
italic: false,
underline: false,
},
fill: {
fgColor: { rgb: "C5D9F1" },
},
alignment: {
horizontal: 'center',
vertical: 'center',
wrapText: false, // 自動(dòng)換行
},
}
} else {
worksheet[column].s = {
alignment: {
horizontal: 'center',
vertical: 'center',
wrapText: false, // 自動(dòng)換行
},
}
}
}
});
});
// 合并單元格
merges.forEach((item) => {
if(!worksheet["!merges"]){
worksheet["!merges"] = [];
};
worksheet["!merges"].push(item);
// worksheet["!merges"].push({
// s: { r: 2, c: 1 }, // s ("start"): c = 1 r = 2 -> "B3"
// e: { r: 3, c: 4 } // e ("end"): c = 4 r = 3 -> "E4"
// });
});
const wbout = XLSXStyle.write(workbook, {
type: 'binary',
bookType: 'xlsx',
});
XLSX_SAVE.saveAs(
new Blob([s2ab(wbout)], {
type: 'application/octet-stream',
}),
`${filename}.${write2excelOpts.bookType}`,
);
/* output format determined by filename */
// writeFile(workbook, filename, write2excelOpts);
/* at this point, out.xlsb will have been downloaded */
}
// 數(shù)據(jù)轉(zhuǎn)換
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}以上就是在Vue中使用xlsx組件實(shí)現(xiàn)Excel導(dǎo)出功能的步驟詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue xlsx組件實(shí)現(xiàn)Excel導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!
- Vue3如何利用xlsx、xlsx-js-style導(dǎo)出Excel表格使用(適合新手)
- vue使用luckyexcel實(shí)現(xiàn)在線表格及導(dǎo)出導(dǎo)入方式
- 前端實(shí)現(xiàn)Excel文件導(dǎo)出功能的完整代碼解析(vue實(shí)現(xiàn)excel文件導(dǎo)出)
- vue2項(xiàng)目使用exceljs多表頭導(dǎo)出功能詳解
- Vue用Export2Excel導(dǎo)出excel,多級表頭數(shù)據(jù)方式
- vue使用Luckysheet插件實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出
- vue使用xlsx庫和xlsx-style庫導(dǎo)入導(dǎo)出excel、設(shè)置單元格背景色、文字居中、合并單元格、設(shè)置列寬
- 在Vue中實(shí)現(xiàn)Excel導(dǎo)出功能(數(shù)據(jù)導(dǎo)出)
相關(guān)文章
element-ui table行點(diǎn)擊獲取行索引(index)并利用索引更換行順序
這篇文章主要介紹了element-ui table行點(diǎn)擊獲取行索引(index)并利用索引更換行順序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
在Vue3項(xiàng)目中使用Jest配置生成測試報(bào)告的示例詳解
在Vue 3項(xiàng)目中使用Jest進(jìn)行單元測試是一種常見的做法,它可以幫助我們驗(yàn)證代碼的正確性和穩(wěn)定性,本文將介紹如何在Vue 3項(xiàng)目中配置Jest,以生成測試報(bào)告,需要的朋友可以參考下2023-09-09
element自定義表單驗(yàn)證上傳身份證正反面的實(shí)現(xiàn)
表單驗(yàn)證在很多地方都可以用的到,本文主要介紹了element自定義表單驗(yàn)證上傳身份證正反面的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Vue + iView實(shí)現(xiàn)Excel上傳功能的完整代碼
前一段時(shí)間項(xiàng)目經(jīng)歷了前端上傳文件的過程,首先進(jìn)入頁面會(huì)展示默認(rèn)的樣子,選中要上傳的excel文件,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06

