亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式

 更新時(shí)間:2023年08月29日 09:52:12   作者:swimxu  
這篇文章主要給大家介紹了關(guān)于前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式的相關(guān)資料,前端開發(fā)過程中經(jīng)常遇到導(dǎo)出excel的需求,需要的朋友可以參考下

安裝

導(dǎo)出 excel 較常見的 js 庫是之一是 xlsx,xlsx 算是基礎(chǔ)版本,不能對單元格進(jìn)行樣式(對齊方式、文字顏色、背景顏色等)的修飾,如果需要修飾單元格,可使用 xlsx-js-style

npm install xlsx-js-style

引入

import XLSXS from 'xlsx-js-style';

需要導(dǎo)出的數(shù)據(jù)源

// 一般我們拿到的是從接口中請求到的對象數(shù)組,在使用是需要轉(zhuǎn)成二維數(shù)組,下面有介紹
const data = [
  { name: '商品01', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品02', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品03', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
]

將數(shù)據(jù)源轉(zhuǎn)成需要的二維數(shù)組

const body = data.map(x => ([x.name, x.mb_num, x.mb_sum, x.pc_num, x.pc_sum, x.total_num, x.total_sum]))
// 轉(zhuǎn)換后的數(shù)據(jù)為一個(gè)二維數(shù)組
[
  ['商品01', 50, 5000, 30, 3000, 80, 8000]
  ['商品02', 50, 5000, 30, 3000, 80, 8000]
  ['商品03', 50, 5000, 30, 3000, 80, 8000]
]

定義 Excel 表頭

/*
    定義表頭,每一行即是一個(gè)數(shù)組,數(shù)組中的元素即是一個(gè)個(gè)單元格內(nèi)容。
    如果單元格不需要樣式,那么每個(gè)元素類型為字符串即可。如:['一月(2022年01月)'], 
    如果單元格需要樣式,那么數(shù)組中的元素就需要為一個(gè)個(gè)對象,在此對象中定義單元格的樣式等等。
*/
    const header = [
      // 第一行,需要樣式,則數(shù)組中元素為對象,進(jìn)行定義樣式。
      [
        {
          v: '一月(2023年01月)',
          t: 's',
          s: {
            // font 字體屬性
            font: {
              bold: true,
              sz: 14,
              name: '宋體',
            },
            // alignment 對齊方式
            alignment: {
              vertical: 'center', // 垂直居中
              horizontal: 'center', // 水平居中
            },
            // border 邊框?qū)傩?
            border: {
              top: { style: 'thin' },
              bottom: { style: 'thin' },
              left: { style: 'thin' },
              right: { style: 'thin' }
            },
            // fill 顏色填充屬性
            fill: {
              fgColor: { rgb: '87CEEB' },
            },
          },
        },
      ],
      ['商品名稱', '手機(jī)客戶端', '', '電腦客戶端', '', '總計(jì)', ''],
      ['', '銷售數(shù)量', '銷售金額', '銷售數(shù)量', '銷售金額', '銷售數(shù)量', '銷售金額']
    ]

將定義好的表頭添加到 body 中

body.unshift(...header);

將二維數(shù)組轉(zhuǎn)成 sheet

// 這里我們舉例是用 aoa_to_sheet ,所以是需要將數(shù)據(jù)源轉(zhuǎn)成一個(gè)二維數(shù)組
const sheet = XLSXS.utils.aoa_to_sheet(body);
// aoa_to_sheet  	是將【一個(gè)二維數(shù)組】轉(zhuǎn)化成 sheet
// json_to_sheet 	是將【由對象組成的數(shù)組】轉(zhuǎn)化成sheet
// table_to_sheet  	是將【table的dom】直接轉(zhuǎn)成sheet

!merges 設(shè)置單元格合并

如果需要設(shè)置單元格合并,則定義好merges ,添加到 sheet 中。

merges 為一個(gè)對象數(shù)組,每個(gè)對象設(shè)定了單元格合并的規(guī)則。

{ s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }, 即為一個(gè)規(guī)則,s:開始位置, e:結(jié)束位置, r:行, c:列

const merges = [
  { s: { r: 0, c: 0 }, e: { r: 0, c: 6 } },
  { s: { r: 1, c: 1 }, e: { r: 1, c: 2 } },
  { s: { r: 1, c: 3 }, e: { r: 1, c: 4 } },
  { s: { r: 1, c: 5 }, e: { r: 1, c: 6 } },
  { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
]
sheet['!merges'] = merges; // 添加到sheet中

!cols 設(shè)置列寬

cols 為一個(gè)對象數(shù)組,依次表示每一列的寬度。

const cols = [
    { wch: 10 },
    { wch: 10 }, 
    { wch: 10 },
    { wch: 10 },
    { wch: 10 },
    { wch: 10 }, 
    { wch: 10 }
];
sheet['!cols'] = cols; // 添加到sheet中

!rows 設(shè)置行高

rows 為一個(gè)對象數(shù)組,依次表示每一行的高度

const rows = [
    { hpx: 20 }, 
    { hpx: 16 },
    { hpx: 18 }
]
sheet['!rows'] = rows; // 添加到sheet中

創(chuàng)建虛擬的 workbook

Excel整個(gè)表格可稱為 workbook。里面的每張表分別是 sheet

const workbook = xlsx.utils.book_new();

向 workbook 中添加 sheet

XLSXS.utils.book_append_sheet(workbook, sheet, 'sheet名稱');
// 一個(gè) workbook 允許添加多個(gè) sheet,即可以同時(shí)創(chuàng)建多個(gè)表
// xlsx.utils.book_append_sheet(workbook, sheet2, 'sheet名稱2');

導(dǎo)出 workbook

// 注意:定義導(dǎo)出 excel 的名稱時(shí)需要加上后綴 .xlsx
xlsx.writeFile(workbook, 'excel名稱.xlsx');

完整示例

import XLSXS from 'xlsx-js-style';
......
// 需要導(dǎo)出的數(shù)據(jù)源
const data = [
  { name: '商品01', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品02', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品03', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
]
// 將數(shù)據(jù)源轉(zhuǎn)成我們需要的二維數(shù)組
const body = data.map(x => ([x.name, x.mb_num, x.mb_sum, x.pc_num, x.pc_sum, x.total_num, x.total_sum]))
/* 定義表頭
    定義表頭,每一行即是一個(gè)數(shù)組,數(shù)組中的元素即是一個(gè)個(gè)單元格內(nèi)容。
    如果單元格不需要樣式,那么每個(gè)元素類型為字符串即可。如:['一月(2022年01月)'], 
    如果單元格需要樣式,那么數(shù)組中的元素就需要為一個(gè)個(gè)對象,在此對象中定義單元格的樣式等等。
    這里只針對第一行進(jìn)行舉例:
*/
const header = [
  [
    {
      v: '一月(2023年01月)',
      t: 's',
      s: {
        // font 字體屬性
        font: {
          bold: true,
          sz: 14,
          name: '宋體',
        },
        // alignment 對齊方式
        alignment: {
          vertical: 'center', // 垂直居中
          horizontal: 'center', // 水平居中
        },
        // fill 顏色填充屬性
        fill: {
          fgColor: { rgb: '87CEEB' },
        },
      },
    },
  ],
  ['商品名稱', '手機(jī)客戶端', '', '電腦客戶端', '', '總計(jì)', ''],
  ['', '銷售數(shù)量', '銷售金額', '銷售數(shù)量', '銷售金額', '銷售數(shù)量', '銷售金額']
]
body.unshift(...header);// 將定義好的表頭添加到 body 中
const sheet = xlsx.utils.aoa_to_sheet(body);// aoa_to_sheet 將二維數(shù)組轉(zhuǎn)成 sheet
// 設(shè)置合并單元格
const merges = [
  { s: { r: 0, c: 0 }, e: { r: 0, c: 6 } },
  { s: { r: 1, c: 1 }, e: { r: 1, c: 2 } },
  { s: { r: 1, c: 3 }, e: { r: 1, c: 4 } },
  { s: { r: 1, c: 5 }, e: { r: 1, c: 6 } },
  { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
]
sheet['!merges'] = merges; // 將merges添加到sheet中
// 設(shè)置列寬
const cols = [ { wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 } ];
sheet['!cols'] = cols; // 將cols添加到sheet中
// 
const rows = [ { hpx: 20 },{ hpx: 16 },{ hpx: 18 }]
sheet['!rows'] = rows; // 將rows添加到sheet中,設(shè)置行高
const workbook = XLSXS.utils.book_new();// 創(chuàng)建虛擬的 workbook
XLSXS.utils.book_append_sheet(workbook, sheet, 'sheet名稱'); // 向 workbook 中添加 sheet
XLSXS.writeFile(workbook, 'excel名稱.xlsx'); // 導(dǎo)出 workbook
// 注意:定義導(dǎo)出 excel 的名稱時(shí)需要加上后綴 .xlsx

效果圖

總結(jié)

  • 創(chuàng)建虛擬的 workbook、將數(shù)組轉(zhuǎn)成 sheet向workbook中添加sheet導(dǎo)出workbook,這四個(gè)步驟是必要的。
  • 設(shè)置合并單元格設(shè)置列寬、設(shè)置行高是可選的,根據(jù)需求進(jìn)行添加。
  • 如果添加樣式需要 border 則需要在被合并的單元格位置進(jìn)行占位。

到此這篇關(guān)于前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式的文章就介紹到這了,更多相關(guān)前端導(dǎo)出Excel并修飾單元格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript使用Fetch的方法詳解

    JavaScript使用Fetch的方法詳解

    Fetch?API提供了一個(gè)JavaScript接口,用于訪問和操縱HTTP管道的部分。它還提供了一個(gè)全局?fetch()方法,該方法提供了一種簡單,合理的方式來跨網(wǎng)絡(luò)異步獲取資源。本文將詳解JS如何使用Fetch,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • JavaScript中保留小數(shù)點(diǎn)后N位方法總結(jié)

    JavaScript中保留小數(shù)點(diǎn)后N位方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了JavaScript中保留小數(shù)點(diǎn)后N位的幾個(gè)常用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • 前端性能優(yōu)化建議

    前端性能優(yōu)化建議

    這篇文章主要分享了一些前端性能優(yōu)化的建議,幫助大家提高頁面性能,感興趣的朋友可以了解下
    2020-09-09
  • js中?new?Date().getTime()得到的是毫秒數(shù)時(shí)間戳

    js中?new?Date().getTime()得到的是毫秒數(shù)時(shí)間戳

    今天在寫一個(gè)函數(shù)的時(shí)候需要用的一個(gè)時(shí)間戳方便調(diào)用不同的隨機(jī)數(shù)?那么時(shí)間戳就是比較好的方式,主要怕瀏覽器緩存數(shù)據(jù),下面就為大家簡單介紹一下
    2023-07-07
  • 原生JS實(shí)現(xiàn)ajax與ajax的跨域請求實(shí)例

    原生JS實(shí)現(xiàn)ajax與ajax的跨域請求實(shí)例

    下面小編就為大家分享一篇原生JS實(shí)現(xiàn)ajax與ajax的跨域請求實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • webpack文件打包錯(cuò)誤異常

    webpack文件打包錯(cuò)誤異常

    這篇文章主要介紹了webpack文件打包錯(cuò)誤異常,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 超詳細(xì)的JS彈出窗口代碼大全

    超詳細(xì)的JS彈出窗口代碼大全

    這篇文章主要為大家分享超詳細(xì)的JS彈出窗口代碼大全,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JavaScript 通過模式匹配實(shí)現(xiàn)重載

    JavaScript 通過模式匹配實(shí)現(xiàn)重載

    昨天rank同學(xué)向我提出一個(gè)問題,在實(shí)際應(yīng)用中有些接口需要提供類似于函數(shù)重載的功能,以方便開發(fā)者組織代碼邏輯,簡化使用者調(diào)用。
    2010-08-08
  • 一文帶你了解async/await的使用

    一文帶你了解async/await的使用

    async/await?讓異步代碼變成同步的方式,從而使代碼更具表現(xiàn)力和可讀性;還統(tǒng)一了異步編程的經(jīng)驗(yàn);以及提供了更好的錯(cuò)誤堆棧跟蹤。本文就來講講async/await的使用,需要的可以參考一下
    2022-09-09
  • el-input 標(biāo)簽中密碼的顯示和隱藏功能的實(shí)例代碼

    el-input 標(biāo)簽中密碼的顯示和隱藏功能的實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了el-input 標(biāo)簽中密碼的顯示和隱藏 ,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評論