最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Vue中使用xlsx組件實(shí)現(xiàn)Excel導(dǎo)出功能的步驟詳解

 更新時(shí)間:2023年10月25日 11:31:31   作者:sg_knight  
在現(xiàn)代Web應(yīng)用程序中,數(shù)據(jù)導(dǎo)出到Excel格式是一項(xiàng)常見的需求,Vue.js是一種流行的JavaScript框架,允許我們構(gòu)建動(dòng)態(tài)的前端應(yīng)用程序,本文將介紹如何使用Vue.js和xlsx組件輕松實(shí)現(xiàn)Excel數(shù)據(jù)導(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)文章!

相關(guān)文章

  • element-ui table行點(diǎn)擊獲取行索引(index)并利用索引更換行順序

    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
  • vue.js全局組件和局部組件示例代碼

    vue.js全局組件和局部組件示例代碼

    組件是Vue.js的最核心的功能,所謂的組件化就是把頁面拆分成多個(gè)組件,每個(gè)組件單獨(dú)使用CSS,JS,模板,圖片等資源進(jìn)行開發(fā)與維護(hù),然后在制作網(wǎng)頁的時(shí)候根據(jù)需要調(diào)用相關(guān)的組件,這篇文章主要給大家介紹了關(guān)于vue.js全局組件和局部組件的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 在Vue3項(xiàng)目中使用Jest配置生成測試報(bào)告的示例詳解

    在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
  • vue resource發(fā)送請求的幾種方式

    vue resource發(fā)送請求的幾種方式

    這篇文章主要介紹了vue resource發(fā)送請求的幾種方式,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • element自定義表單驗(yàn)證上傳身份證正反面的實(shí)現(xiàn)

    element自定義表單驗(yàn)證上傳身份證正反面的實(shí)現(xiàn)

    表單驗(yàn)證在很多地方都可以用的到,本文主要介紹了element自定義表單驗(yàn)證上傳身份證正反面的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺談vuex為什么不建議在action中修改state

    淺談vuex為什么不建議在action中修改state

    這篇文章主要介紹了淺談vuex為什么不建議在action中修改state,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • vuex中mapActions的概念及基本用法

    vuex中mapActions的概念及基本用法

    mapActions 就是將組件中的函數(shù)映射為對應(yīng)的action,通過本文我們了解了mapActions 大概是用來干什么的,接下來介紹一下 mapActions 的具體用法,感興趣的朋友一起看看吧
    2023-09-09
  • 用vue快速開發(fā)app的腳手架工具

    用vue快速開發(fā)app的腳手架工具

    這篇文章主要介紹了用vue快速開發(fā)app的腳手架工具,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • vue單文件組件的實(shí)現(xiàn)

    vue單文件組件的實(shí)現(xiàn)

    最近翻閱了一下vue。發(fā)覺有一個(gè)單文件組件之前基本忽視掉了。所以本文就詳細(xì)的介紹了vue單文件組件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Vue + iView實(shí)現(xiàn)Excel上傳功能的完整代碼

    Vue + iView實(shí)現(xiàn)Excel上傳功能的完整代碼

    前一段時(shí)間項(xiàng)目經(jīng)歷了前端上傳文件的過程,首先進(jìn)入頁面會(huì)展示默認(rèn)的樣子,選中要上傳的excel文件,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06

最新評論

琼中| 成武县| 合江县| 南涧| 阜康市| 辽中县| 卫辉市| 景东| 铜梁县| 黔西县| 淳化县| 定兴县| 侯马市| 梁平县| 昌邑市| 林芝县| 两当县| 德江县| 邵东县| 蒙阴县| 大田县| 丰台区| 宁陕县| 昌图县| 民勤县| 灌阳县| 瓦房店市| 康定县| 陆丰市| 榆树市| 英山县| 张家川| 新巴尔虎右旗| 三台县| 陈巴尔虎旗| 秦皇岛市| 重庆市| 合水县| 怀远县| 从化市| 同德县|