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

微信小程序中如何使用xlsx(xlsx.mini.min.js)實現(xiàn)Excel導(dǎo)入導(dǎo)出功能

 更新時間:2026年01月13日 09:15:52   作者:kaka-333  
這篇文章主要介紹了微信小程序中如何使用xlsx(xlsx.mini.min.js)實現(xiàn)Excel導(dǎo)入導(dǎo)出功能的相關(guān)資料,包括準(zhǔn)備工作、導(dǎo)出Excel的基本流程、導(dǎo)入Excel的基本流程、常用API說明以及注意事項,需要的朋友可以參考下

一、簡介

xlsx.mini.min.js 是 SheetJS 的迷你版本,專門為小程序等輕量級環(huán)境設(shè)計。本文基于微信小程序環(huán)境,詳細(xì)介紹如何使用該庫實現(xiàn) Excel 文件的導(dǎo)入和導(dǎo)出功能。

二、準(zhǔn)備工作

1. 下載 xlsx.mini.min.js

  • 訪問 SheetJS 官方倉庫:https://git.sheetjs.com/sheetjs/sheetjs
  • 進入 dist 目錄,下載 xlsx.mini.min.js 文件,可以只單獨下載這個文件就行
  • 將文件放置到小程序項目的 libs 目錄下

2. 引入庫文件

在需要使用 Excel 功能的頁面或組件中引入:

const xlsx = require("../../libs/xlsx.mini.min")

三、導(dǎo)出 Excel

3.1 基本流程

  1. 構(gòu)建數(shù)據(jù)數(shù)組:將數(shù)據(jù)組織成二維數(shù)組格式
  2. 創(chuàng)建工作表:使用 xlsx.utils.aoa_to_sheet() 將數(shù)組轉(zhuǎn)換為工作表
  3. 設(shè)置列寬(可選):通過 ws['!cols'] 設(shè)置列寬
  4. 創(chuàng)建工作簿:使用 xlsx.utils.book_new() 創(chuàng)建新工作簿
  5. 添加工作表:使用 xlsx.utils.book_append_sheet() 將工作表添加到工作簿
  6. 生成文件:使用 xlsx.write() 將工作簿轉(zhuǎn)換為 base64 格式
  7. 保存文件:使用微信小程序的 wx.getFileSystemManager() 保存文件

3.2 完整代碼示例

exportToExcel() {
  const { list } = this.data
  if (!list || list.length === 0) {
    wx.showToast({
      title: '暫無數(shù)據(jù)可導(dǎo)出',
      icon: 'none'
    })
    return
  }

  // 1. 構(gòu)建 Excel 數(shù)據(jù)表(二維數(shù)組)
  let sheet = []
  
  // 表頭
  let titles = ['日期', 'XXXX', 'uuid']
  sheet.push(titles)
  
  // 數(shù)據(jù)行
  list.forEach((item) => {
    let row = [
      item['date'] || '',
      item['xxxx'] || '0',
      item['uuid'] || ''
    ]
    sheet.push(row)
  })

  try {
    // 2. 將數(shù)組轉(zhuǎn)換為工作表
    var ws = xlsx.utils.aoa_to_sheet(sheet)
    
    // 3. 設(shè)置列寬(可選)
    const colWidths = [
      { wch: 15 }, // 日期列:15個字符寬度
      { wch: 15 }, // 總資產(chǎn)列:15個字符寬度
      { wch: 30 }  // uuid列:30個字符寬度
    ]
    ws['!cols'] = colWidths
    
    // 4. 創(chuàng)建工作簿
    var wb = xlsx.utils.book_new()
    
    // 5. 將工作表添加到工作簿(第三個參數(shù)是工作表名稱)
    xlsx.utils.book_append_sheet(wb, ws, "數(shù)據(jù)記錄")
    
    // 6. 將工作簿轉(zhuǎn)換為 base64 格式
    var fileData = xlsx.write(wb, {
      bookType: "xlsx",
      type: 'base64'
    })

    // 7. 保存文件
    let filePath = `${wx.env.USER_DATA_PATH}/數(shù)據(jù)記錄.xlsx`
    const fs = wx.getFileSystemManager()
    fs.writeFile({
      filePath: filePath,
      data: fileData,
      encoding: 'base64',
      success: (res) => {
        const sysInfo = wx.getSystemInfoSync()
        
        // PC 端導(dǎo)出
        if (sysInfo.platform.toLowerCase().indexOf('windows') >= 0) {
          wx.saveFileToDisk({
            filePath: filePath,
            success: () => {
              wx.showToast({
                title: '導(dǎo)出成功',
                icon: 'success'
              })
            },
            fail: () => {
              wx.showToast({
                title: '導(dǎo)出失敗',
                icon: 'none'
              })
            }
          })
        } else {
          // 手機端導(dǎo)出 - 打開文檔
          wx.openDocument({
            filePath: filePath,
            showMenu: true,
            success: () => {
              wx.showToast({
                title: '導(dǎo)出成功',
                icon: 'success'
              })
            },
            fail: () => {
              wx.showToast({
                title: '導(dǎo)出失敗',
                icon: 'none'
              })
            }
          })
        }
      },
      fail: (res) => {
        if (res.errMsg && res.errMsg.indexOf('locked') >= 0) {
          wx.showModal({
            title: '提示',
            content: '文檔已打開,請先關(guān)閉',
          })
        } else {
          wx.showToast({
            title: '導(dǎo)出失敗',
            icon: 'none'
          })
        }
      }
    })
  } catch (error) {
    console.error('導(dǎo)出 Excel 失敗:', error)
    wx.showToast({
      title: '導(dǎo)出失敗',
      icon: 'none'
    })
  }
}

四、導(dǎo)入 Excel

4.1 基本流程

  1. 選擇文件:使用 wx.chooseMessageFile() 選擇 Excel 文件
  2. 讀取文件:使用 wx.getFileSystemManager().readFile() 讀取文件內(nèi)容(base64 格式)
  3. 解析 Excel:使用 xlsx.read() 解析文件
  4. 轉(zhuǎn)換為 JSON:使用 xlsx.utils.sheet_to_json() 將工作表轉(zhuǎn)換為 JSON 數(shù)組
  5. 處理數(shù)據(jù):解析 JSON 數(shù)據(jù)并轉(zhuǎn)換為應(yīng)用所需格式
  6. 保存數(shù)據(jù):將處理后的數(shù)據(jù)保存到本地存儲

4.2 完整代碼示例

importFromExcel() {
  // 1. 選擇文件
  wx.chooseMessageFile({
    count: 1,
    type: 'file',
    extension: ['xlsx', 'xls'],
    success: (res) => {
      const file = res.tempFiles[0]
      if (!file) {
        wx.showToast({
          title: '文件選擇失敗',
          icon: 'none'
        })
        return
      }

      // 2. 讀取文件
      const fs = wx.getFileSystemManager()
      fs.readFile({
        filePath: file.path,
        encoding: 'base64',
        success: (readRes) => {
          try {
            // 3. 解析 Excel
            const workbook = xlsx.read(readRes.data, { type: 'base64' })
            const firstSheetName = workbook.SheetNames[0]
            const worksheet = workbook.Sheets[firstSheetName]
            
            // 4. 轉(zhuǎn)換為 JSON 數(shù)組(header: 1 表示第一行作為表頭)
            const jsonData = xlsx.utils.sheet_to_json(worksheet, { 
              header: 1, 
              defval: '' 
            })

            if (!jsonData || jsonData.length < 2) {
              wx.showToast({
                title: 'Excel 文件格式不正確',
                icon: 'none'
              })
              return
            }

            // 5. 解析表頭
            const headers = jsonData[0]
            const dateIndex = headers.indexOf('日期')
            const moneyIndex = headers.indexOf('總資產(chǎn)(元)')
            const uuidIndex = headers.indexOf('uuid')

            if (dateIndex === -1 || moneyIndex === -1) {
              wx.showToast({
                title: 'Excel 文件缺少必要列',
                icon: 'none'
              })
              return
            }

            // 6. 處理數(shù)據(jù)
            const importedData = []
            for (let i = 1; i < jsonData.length; i++) {
              const row = jsonData[i]
              if (!row[dateIndex] && !row[moneyIndex]) {
                continue // 跳過空行
              }

              importedData.push({
                date: row[dateIndex] || '',
                allmoney: row[moneyIndex] || '0',
                uuid: row[uuidIndex] || String((new Date()).getTime() + i)
              })
            }

            if (importedData.length === 0) {
              wx.showToast({
                title: '沒有有效數(shù)據(jù)可導(dǎo)入',
                icon: 'none'
              })
              return
            }

            // 7. 保存數(shù)據(jù)
            const currentData = wx.getStorageSync("data") ? JSON.parse(wx.getStorageSync("data")) : []
            const mergedData = [...currentData, ...importedData]
            wx.setStorageSync("data", JSON.stringify(mergedData))

            wx.showToast({
              title: `成功導(dǎo)入 ${importedData.length} 條記錄`,
              icon: 'success'
            })
          } catch (error) {
            console.error('導(dǎo)入 Excel 失敗:', error)
            wx.showToast({
              title: '導(dǎo)入失敗,請檢查文件格式',
              icon: 'none'
            })
          }
        },
        fail: (err) => {
          console.error('讀取文件失敗:', err)
          wx.showToast({
            title: '讀取文件失敗',
            icon: 'none'
          })
        }
      })
    },
    fail: (err) => {
      if (err.errMsg && err.errMsg.indexOf('cancel') === -1) {
        wx.showToast({
          title: '選擇文件失敗',
          icon: 'none'
        })
      }
    }
  })
}

4.3 重復(fù)數(shù)據(jù)檢測示例

在導(dǎo)入時檢測重復(fù)數(shù)據(jù)并提示用戶:

// 檢查是否有重復(fù)數(shù)據(jù)(對比 uuid 字段)
const duplicateUuids = []
importedData.forEach(item => {
  const itemUuid = String(item['uuid'] || '')
  const existingIndex = currentData.findIndex((existing) => 
    String(existing['uuid'] || '') === itemUuid
  )
  if (existingIndex >= 0) {
    duplicateUuids.push(itemUuid)
  }
})

// 如果有重復(fù)數(shù)據(jù),提示用戶
if (duplicateUuids.length > 0) {
  wx.showModal({
    title: '數(shù)據(jù)重復(fù)',
    content: `檢測到 ${duplicateUuids.length} 條重復(fù)數(shù)據(jù),是否覆蓋?`,
    confirmText: '覆蓋',
    cancelText: '取消',
    success: (modalRes) => {
      if (modalRes.confirm) {
        // 執(zhí)行導(dǎo)入邏輯
        doImport(importedData)
      } else {
        wx.showToast({
          title: '已取消導(dǎo)入',
          icon: 'none'
        })
      }
    }
  })
} else {
  // 沒有重復(fù),直接導(dǎo)入
  doImport(importedData)
}

五、常用 API 說明

5.1 核心方法

方法說明示例
xlsx.utils.aoa_to_sheet(data)將二維數(shù)組轉(zhuǎn)換為工作表xlsx.utils.aoa_to_sheet([['A', 'B'], [1, 2]])
xlsx.utils.book_new()創(chuàng)建新工作簿var wb = xlsx.utils.book_new()
xlsx.utils.book_append_sheet(wb, ws, name)將工作表添加到工作簿xlsx.utils.book_append_sheet(wb, ws, "Sheet1")
xlsx.write(wb, options)將工作簿轉(zhuǎn)換為指定格式xlsx.write(wb, {bookType: "xlsx", type: 'base64'})
xlsx.read(data, options)讀取 Excel 文件xlsx.read(base64Data, { type: 'base64' })
xlsx.utils.sheet_to_json(ws, options)將工作表轉(zhuǎn)換為 JSONxlsx.utils.sheet_to_json(ws, { header: 1 })

5.2 工作表屬性設(shè)置

設(shè)置列寬:

ws['!cols'] = [
  { wch: 15 },  // 第一列寬度:15個字符
  { wch: 20 },  // 第二列寬度:20個字符
  { wch: 30 }   // 第三列寬度:30個字符
]

設(shè)置行高(可選):

ws['!rows'] = [
  { hpt: 20 },  // 第一行高度:20磅
  { hpt: 15 }   // 第二行高度:15磅
]

5.3 xlsx.write() 選項

xlsx.write(wb, {
  bookType: "xlsx",  // 文件類型:xlsx, xls, csv 等
  type: 'base64',    // 輸出類型:base64, binary, string, buffer
  bookSST: true      // 是否使用共享字符串表(可選)
})

5.4 sheet_to_json() 選項

xlsx.utils.sheet_to_json(worksheet, {
  header: 1,        // 1: 數(shù)組格式,'A': 對象格式(使用列名)
  defval: '',       // 默認(rèn)值(空單元格的值)
  raw: false        // false: 自動轉(zhuǎn)換數(shù)據(jù)類型,true: 保持原始值
})

六、注意事項

  1. 文件大小限制:微信小程序?qū)ξ募笮∮邢拗疲ㄗh單個 Excel 文件不超過 2MB

  2. 數(shù)據(jù)類型:導(dǎo)入時注意數(shù)據(jù)類型轉(zhuǎn)換,Excel 中的數(shù)字可能被解析為字符串

  3. 空值處理:使用 defval 參數(shù)設(shè)置空單元格的默認(rèn)值

  4. 錯誤處理:務(wù)必添加 try-catch 錯誤處理,避免程序崩潰

  5. 平臺差異:PC 端和手機端的文件保存方式不同,需要分別處理

  6. 文件路徑:使用 wx.env.USER_DATA_PATH 獲取用戶數(shù)據(jù)目錄

  7. 列寬單位wch 表示字符寬度,不是像素

  8. 工作表名稱:工作表名稱不能包含特殊字符,建議使用中文、英文、數(shù)字

希望本文能幫助你在微信小程序項目中順利實現(xiàn) Excel 導(dǎo)入導(dǎo)出功能!

參考資源:

  • SheetJS 官方文檔:https://docs.sheetjs.com/
  • SheetJS GitHub:https://github.com/SheetJS/sheetjs

到此這篇關(guān)于微信小程序中如何使用xlsx(xlsx.mini.min.js)實現(xiàn)Excel導(dǎo)入導(dǎo)出功能的文章就介紹到這了,更多相關(guān)微信小程序中Excel導(dǎo)入導(dǎo)出功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 10個功能強大的JavaScript動畫庫分享

    10個功能強大的JavaScript動畫庫分享

    動畫,從人群中脫穎而出、吸引訪客注意力的絕佳方式,本文將給大家分享10 個功能強大的 JavaScript 動畫庫,有了這 10 個功能強大的 JavaScript 庫,創(chuàng)建動畫再簡單不過了,感興趣的同學(xué)可以參考閱讀
    2023-09-09
  • JavaScript定時器使用方法詳解

    JavaScript定時器使用方法詳解

    這篇文章主要介紹了JavaScript定時器的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • js實現(xiàn)簡單排列組合的方法

    js實現(xiàn)簡單排列組合的方法

    這篇文章主要介紹了js實現(xiàn)簡單排列組合的方法,可實現(xiàn)數(shù)學(xué)上排列組合算法功能,涉及JavaScript數(shù)組與字符串操作技巧,需要的朋友可以參考下
    2016-01-01
  • JavaScript如何實現(xiàn)組合列表框中元素移動效果

    JavaScript如何實現(xiàn)組合列表框中元素移動效果

    在頁面中有兩個列表框,需要把其中一個列表框的元素移動到另一個列表框,怎么實現(xiàn)此功能呢,下面通過本文給大家介紹JavaScript如何實現(xiàn)組合列表框中元素移動效果,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • JavaScript DOM節(jié)點添加示例

    JavaScript DOM節(jié)點添加示例

    本節(jié)為大家介紹下JavaScript DOM節(jié)點添加,將node里面的str放到h1段落中使之成為h1的新段落
    2014-07-07
  • ES6 Object屬性新的寫法實例小結(jié)

    ES6 Object屬性新的寫法實例小結(jié)

    這篇文章主要介紹了ES6 Object屬性新的寫法,結(jié)合實例形式總結(jié)分析了ES6中object屬性的常見簡化寫法,需要的朋友可以參考下
    2019-06-06
  • 詳解webpack之圖片引入-增強的file-loader:url-loader

    詳解webpack之圖片引入-增強的file-loader:url-loader

    這篇文章主要介紹了詳解webpack之圖片引入-增強的file-loader:url-loader,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • JS中 new Date() 各方法的用法說明

    JS中 new Date() 各方法的用法說明

    這篇文章主要介紹了JS中 new Date() 各方法的用法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 前端實現(xiàn)Token無感刷新的思路和具體實現(xiàn)方法

    前端實現(xiàn)Token無感刷新的思路和具體實現(xiàn)方法

    這篇文章主要介紹了前端實現(xiàn)Token無感刷新的思路和具體實現(xiàn)方法,Token無感刷新是前端開發(fā)中提高用戶體驗的一種方法,通過在Token即將過期時自動刷新,避免用戶因Token過期而需要重新登錄,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-05-05
  • 實例淺析js的this

    實例淺析js的this

    本文通過做幾個簡單的對照實驗,根據(jù)這幾個對照實驗的結(jié)果,幫助大家理解js的this用法。下面就跟小編一起來看看吧
    2016-12-12

最新評論

朝阳区| 绩溪县| 石城县| 永胜县| 九龙城区| 天峻县| 贵南县| 威远县| 梓潼县| 虞城县| 宁国市| 宝山区| 广宗县| 昌宁县| 微山县| 巩义市| 香港| 光山县| 湖州市| 尼勒克县| 大方县| 静安区| 古蔺县| 霍林郭勒市| 同仁县| 盱眙县| 清徐县| 云浮市| 尚志市| 景谷| 通许县| 玉门市| 青田县| 富宁县| 富阳市| 威信县| 玉屏| 徐州市| 浠水县| 华宁县| 石河子市|