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

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

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

一、簡(jiǎn)介

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

二、準(zhǔn)備工作

1. 下載 xlsx.mini.min.js

  • 訪問(wèn) SheetJS 官方倉(cāng)庫(kù):https://git.sheetjs.com/sheetjs/sheetjs
  • 進(jìn)入 dist 目錄,下載 xlsx.mini.min.js 文件,可以只單獨(dú)下載這個(gè)文件就行
  • 將文件放置到小程序項(xiàng)目的 libs 目錄下

2. 引入庫(kù)文件

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

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è)置列寬(可選):通過(guò) 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: '暫無(wú)數(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個(gè)字符寬度
      { wch: 15 }, // 總資產(chǎn)列:15個(gè)字符寬度
      { wch: 30 }  // uuid列:30個(gè)字符寬度
    ]
    ws['!cols'] = colWidths
    
    // 4. 創(chuàng)建工作簿
    var wb = xlsx.utils.book_new()
    
    // 5. 將工作表添加到工作簿(第三個(gè)參數(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 {
          // 手機(jī)端導(dǎo)出 - 打開(kāi)文檔
          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: '文檔已打開(kāi),請(qǐng)先關(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ù)保存到本地存儲(chǔ)

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 // 跳過(guò)空行
              }

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

            if (importedData.length === 0) {
              wx.showToast({
                title: '沒(méi)有有效數(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)入失敗,請(qǐng)檢查文件格式',
              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ù)檢測(cè)示例

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

// 檢查是否有重復(fù)數(shù)據(jù)(對(duì)比 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: `檢測(cè)到 ${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 {
  // 沒(méi)有重復(fù),直接導(dǎo)入
  doImport(importedData)
}

五、常用 API 說(shuō)明

5.1 核心方法

方法說(shuō)明示例
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個(gè)字符
  { wch: 20 },  // 第二列寬度:20個(gè)字符
  { wch: 30 }   // 第三列寬度:30個(gè)字符
]

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

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

5.3 xlsx.write() 選項(xiàng)

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

5.4 sheet_to_json() 選項(xiàng)

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

六、注意事項(xiàng)

  1. 文件大小限制:微信小程序?qū)ξ募笮∮邢拗?,建議單個(gè) Excel 文件不超過(guò) 2MB

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

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

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

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

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

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

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

希望本文能幫助你在微信小程序項(xiàng)目中順利實(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)實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出功能的文章就介紹到這了,更多相關(guān)微信小程序中Excel導(dǎo)入導(dǎo)出功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 10個(gè)功能強(qiáng)大的JavaScript動(dòng)畫庫(kù)分享

    10個(gè)功能強(qiáng)大的JavaScript動(dòng)畫庫(kù)分享

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

    JavaScript定時(shí)器使用方法詳解

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

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

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

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

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

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

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

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

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

    詳解webpack之圖片引入-增強(qiáng)的file-loader:url-loader

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

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

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

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

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

    實(shí)例淺析js的this

    本文通過(guò)做幾個(gè)簡(jiǎn)單的對(duì)照實(shí)驗(yàn),根據(jù)這幾個(gè)對(duì)照實(shí)驗(yàn)的結(jié)果,幫助大家理解js的this用法。下面就跟小編一起來(lái)看看吧
    2016-12-12

最新評(píng)論

辽宁省| 册亨县| 云龙县| 林甸县| 会同县| 恭城| 勃利县| 汝南县| 景宁| 长春市| 辽阳县| 北辰区| 恭城| 于田县| 昆明市| 兰州市| 台东县| 托克托县| 辽阳市| 读书| 吉林市| 太原市| 洱源县| 砀山县| 彰化市| 堆龙德庆县| 碌曲县| 合水县| 禄劝| 德阳市| 亳州市| 格尔木市| 汕尾市| 舟山市| 自治县| 永丰县| 榆社县| 监利县| 库车县| 东宁县| 平江县|