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

Vue項(xiàng)目中使用xlsx庫解析Excel文件的完整指南

 更新時(shí)間:2026年01月18日 11:36:11   作者:安逸點(diǎn)  
這篇文章主要介紹了如何使用xlsx庫實(shí)現(xiàn)前端批量導(dǎo)入Excel文件的功能,包括使用FileReader讀取文件、使用XLSX.read()方法解析Excel數(shù)據(jù)、驗(yàn)證表頭格式和提取數(shù)據(jù)行,需要的朋友可以參考下

前言

項(xiàng)目中有個(gè)需求是上傳Excel實(shí)現(xiàn)批量導(dǎo)入,但是解析Excel的需要前端來實(shí)現(xiàn),所以用到了xlsx庫

xlsx 庫是一個(gè)強(qiáng)大的 JavaScript 庫,用于處理 Excel 文件,支持:

  • 讀取 .xls.xlsx 格式
  • 寫入 Excel 文件
  • 解析工作表數(shù)據(jù)
  • 支持多種數(shù)據(jù)格式轉(zhuǎn)換

在項(xiàng)目中安裝 xlsx 庫:

npm install xlsx
# 或者使用 yarn
yarn add xlsx
# 或者使用 pnpm
pnpm add xlsx

核心 API

import * as XLSX from 'xlsx';

// 主要方法
XLSX.read(data, options)      // 讀取 Excel 數(shù)據(jù)
XLSX.readFile(filename)       // 從文件讀取
XLSX.utils.sheet_to_json()    // 工作表轉(zhuǎn) JSON
XLSX.utils.sheet_to_csv()     // 工作表轉(zhuǎn) CSV
XLSX.utils.sheet_to_html()    // 工作表轉(zhuǎn) HTML

Excel 文件讀取與解析

1. 使用 FileReader 讀取文件

在瀏覽器環(huán)境中,我們需要使用 FileReader API 來讀取用戶上傳的文件:

const readExcelFile = (file) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = (e) => {
      try {
        // 讀取文件內(nèi)容
        const data = new Uint8Array(e.target.result);
        resolve(data);
      } catch (error) {
        reject(new Error('文件讀取失敗'));
      }
    };
    
    reader.onerror = () => {
      reject(new Error('文件讀取失敗'));
    };
    
    // 以 ArrayBuffer 格式讀取文件
    reader.readAsArrayBuffer(file);
  });
};

2. 解析 Excel 文件

使用 XLSX.read() 方法解析 Excel 數(shù)據(jù):

const parseExcelData = (data) => {
  // 讀取 Excel 工作簿
  const workbook = XLSX.read(data, { type: 'array' });
  
  // 獲取所有工作表名稱
  const sheetNames = workbook.SheetNames;
  console.log('工作表名稱:', sheetNames);
  
  // 獲取第一個(gè)工作表
  const firstSheetName = sheetNames[0];
  const worksheet = workbook.Sheets[firstSheetName];
  
  // 將工作表轉(zhuǎn)換為 JSON
  const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
  
  return {
    workbook,
    worksheet,
    jsonData,
    sheetNames
  };
};

3. 不同數(shù)據(jù)格式的轉(zhuǎn)換

// 轉(zhuǎn)換為 JSON 對(duì)象(帶表頭)
const jsonWithHeaders = XLSX.utils.sheet_to_json(worksheet);

// 轉(zhuǎn)換為 JSON 數(shù)組(不帶表頭)
const jsonArray = XLSX.utils.sheet_to_json(worksheet, { header: 1 });

// 轉(zhuǎn)換為 CSV 字符串
const csvString = XLSX.utils.sheet_to_csv(worksheet);

// 轉(zhuǎn)換為 HTML 表格
const htmlString = XLSX.utils.sheet_to_html(worksheet);

表頭驗(yàn)證與數(shù)據(jù)提取

1. 驗(yàn)證表頭格式

在實(shí)際應(yīng)用中,我們通常需要驗(yàn)證 Excel 文件的表頭是否符合預(yù)期格式:

const validateExcelHeaders = (jsonData, requiredHeaders) => {
  if (jsonData.length === 0) {
    throw new Error('Excel文件為空');
  }
  
  // 獲取表頭行(第一行)
  const headers = jsonData[0].map(header => 
    header ? header.toString().trim() : ''
  );
  
  // 檢查必需表頭
  const missingHeaders = requiredHeaders.filter(header =>
    !headers.includes(header)
  );
  
  if (missingHeaders.length > 0) {
    throw new Error(`缺少必需表頭: ${missingHeaders.join(', ')}`);
  }
  
  return headers;
};

2. 提取數(shù)據(jù)行

const extractDataRows = (jsonData, headers) => {
  // 跳過表頭行(第一行)
  const dataRows = jsonData.slice(1);
  
  return dataRows.map((row, rowIndex) => {
    const rowData = {};
    
    headers.forEach((header, colIndex) => {
      rowData[header] = row[colIndex] || '';
    });
    
    return {
      ...rowData,
      _rowNumber: rowIndex + 2 // Excel 行號(hào)(從1開始,表頭為第1行)
    };
  }).filter(row => {
    // 過濾空行(所有單元格都為空)
    return Object.values(row).some(value => 
      value !== '' && value !== undefined && value !== null
    );
  });
};

3. 數(shù)據(jù)驗(yàn)證與清洗

const validateAndCleanData = (dataRows, validationRules) => {
  const errors = [];
  const cleanedData = [];
  
  dataRows.forEach((row, index) => {
    const rowErrors = [];
    
    // 檢查每個(gè)字段
    Object.keys(validationRules).forEach(field => {
      const value = row[field];
      const rules = validationRules[field];
      
      // 必填驗(yàn)證
      if (rules.required && (!value || value.toString().trim() === '')) {
        rowErrors.push(`${field} 不能為空`);
      }
      
      // 類型驗(yàn)證
      if (value && rules.type) {
        if (rules.type === 'number' && isNaN(Number(value))) {
          rowErrors.push(`${field} 必須是數(shù)字`);
        }
        if (rules.type === 'email' && !isValidEmail(value)) {
          rowErrors.push(`${field} 格式不正確`);
        }
      }
      
      // 枚舉值驗(yàn)證
      if (value && rules.enum && !rules.enum.includes(value)) {
        rowErrors.push(`${field} 必須是以下值之一: ${rules.enum.join(', ')}`);
      }
    });
    
    if (rowErrors.length === 0) {
      cleanedData.push(row);
    } else {
      errors.push({
        row: row._rowNumber,
        errors: rowErrors
      });
    }
  });
  
  return { cleanedData, errors };
};

到此這篇關(guān)于Vue項(xiàng)目中使用xlsx庫解析Excel文件的完整指南的文章就介紹到這了,更多相關(guān)Vue xlsx解析Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于vue.js輪播組件vue-awesome-swiper實(shí)現(xiàn)輪播圖

    基于vue.js輪播組件vue-awesome-swiper實(shí)現(xiàn)輪播圖

    一般做移動(dòng)端輪播圖的時(shí)候,最常用的就是Swiper插件了,而vue.js也有一個(gè)輪播組件vue-awesome-swiper,用法跟swiper相似。接下來通過本文給大家詳解講解vue.js輪播組件vue-awesome-swiper實(shí)現(xiàn)輪播圖實(shí)例代碼,需要的朋友參考下
    2017-03-03
  • vue3樹節(jié)點(diǎn)實(shí)現(xiàn)通過子節(jié)點(diǎn)的parentid找到父節(jié)點(diǎn)數(shù)據(jù)

    vue3樹節(jié)點(diǎn)實(shí)現(xiàn)通過子節(jié)點(diǎn)的parentid找到父節(jié)點(diǎn)數(shù)據(jù)

    這篇文章主要介紹了vue3樹節(jié)點(diǎn)實(shí)現(xiàn)通過子節(jié)點(diǎn)的parentid找到父節(jié)點(diǎn)數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • 基于Vue3實(shí)現(xiàn)圖片拖拽上傳功能

    基于Vue3實(shí)現(xiàn)圖片拖拽上傳功能

    前端開發(fā)中,用戶體驗(yàn)是至關(guān)重要的,圖像上傳是許多 web 應(yīng)用中經(jīng)常需要的功能之一,為了提升用戶的交互體驗(yàn),拖拽上傳功能可以減少用戶的操作步驟,本文將介紹如何使用 Vue 3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片拖拽上傳功能,需要的朋友可以參考下
    2024-08-08
  • vue3利用customRef實(shí)現(xiàn)防抖

    vue3利用customRef實(shí)現(xiàn)防抖

    防抖就是對(duì)于頻繁觸發(fā)的事件添加一個(gè)延時(shí)同時(shí)設(shè)定一個(gè)最小觸發(fā)間隔,防抖大家都學(xué)過,但是如何在?Vue3?里中將防抖做到極致呢,下面小編就來和大家詳細(xì)講講
    2023-10-10
  • vue實(shí)現(xiàn)列表垂直無縫滾動(dòng)

    vue實(shí)現(xiàn)列表垂直無縫滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)列表垂直無縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue中關(guān)于異步請(qǐng)求數(shù)據(jù)未更新的解決

    Vue中關(guān)于異步請(qǐng)求數(shù)據(jù)未更新的解決

    本文將探討Vue中異步請(qǐng)求數(shù)據(jù)未更新的常見原因,并提供解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 關(guān)于vue中根據(jù)用戶權(quán)限動(dòng)態(tài)添加路由的問題

    關(guān)于vue中根據(jù)用戶權(quán)限動(dòng)態(tài)添加路由的問題

    每次路由發(fā)生變化時(shí)都需要調(diào)用一次路由守衛(wèi),并且store中的數(shù)據(jù)會(huì)在每次刷新的時(shí)候清空,因此需要判斷store中是否有添加的動(dòng)態(tài)路由,本文給大家分享vue中根據(jù)用戶權(quán)限動(dòng)態(tài)添加路由的問題,感興趣的朋友一起看看吧
    2021-11-11
  • 詳解vue v-model

    詳解vue v-model

    這篇文章主要介紹了vue v-model的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下
    2020-08-08
  • 利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件

    利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件

    在開發(fā)中如果上傳的文件過大,可以考慮分片上傳,分片就是說將文件拆分來進(jìn)行上傳,將各個(gè)文件的切片傳遞給后臺(tái),然后后臺(tái)再進(jìn)行合并,下面這篇文章主要給大家介紹了關(guān)于利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • vue element 關(guān)閉當(dāng)前tab 跳轉(zhuǎn)到上一路由操作

    vue element 關(guān)閉當(dāng)前tab 跳轉(zhuǎn)到上一路由操作

    這篇文章主要介紹了vue element 關(guān)閉當(dāng)前tab 跳轉(zhuǎn)到上一路由操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評(píng)論

彰化县| 宁阳县| 邵阳县| 苏尼特右旗| 同德县| 南靖县| 鸡东县| 苗栗县| 崇左市| 临江市| 文山县| 南阳市| 达拉特旗| 科尔| 虞城县| 太保市| 大兴区| 舒城县| 鹤山市| 凉山| 扎兰屯市| 绥滨县| 吴江市| 金乡县| 旺苍县| 田林县| 博白县| 沭阳县| 晋州市| 丘北县| 宿迁市| 库车县| 白玉县| 陆良县| 浦北县| 探索| 留坝县| 岑巩县| 焦作市| 鄂托克旗| 桑植县|