背景介绍

想写一个html用来打开Excel文件,添加人物,随机抽取人员,输出添加人员后的Excel。

xlsx.js

xlsx.js 是一个开源的 JavaScript 库,用于处理 Excel 文件。它可以读取、写入和转换 Excel 文件,支持多种格式(如 .xlsx、.xlsm、.xlsb 等),并且兼容多种浏览器。

引用xlsx.js

首先需要在html的head中引用xlsx.js

<script src="https://cdn.bootcdn.net/ajax/libs/xlsx/0.18.5/xlsx.core.min.js"></script>

读取文件:

 <div id="app">
    <h1>选择文件:</h1>
    <!-- 使用一个file文件,这里vue的file不可以使用v-model,因此只能使用ref标记,可以使用this.$refs.fileInput来访问获取到的file -->
    <input type="file" ref="fileInput">
    <button @click="readFile">读取文件</button>
    <button @click="writeFile" :disabled="!jsonData.length">写入文件</button>
 </div>

注意:将获取的file转换为JSON的代码不能写在readfil里,这是因为reader的readAsBinaryString是异步加载,加载完毕会触发一个load事件,所以要写到mounted中

mounted中this.reader.addEventListener('load',()=>{})监听了load事件,当异步加载完成后触发lambda表达式内的函数。

js脚本:

 <script>
    const app = {
      data:function(){
        return {
          fileInput: '',
          reader: new FileReader(),
          jsonData: []
        }
      },
      mounted() {
          this.reader.addEventListener('load', () => {
          console.log("read file to XLSX")
        //   获取得到的BinaryString
          const data = this.reader.result
          //console.log("result:"+data)
        //   使用xlsx读取得到的二进制流文件,转为workbook类型
          const workbook = XLSX.read(data, { type: 'binary' })
          //console.log('workbook:'+XLSX.read(data, { type: 'binary' }))
        //   获取第一个表单名字
          const sheetName = workbook.SheetNames[0]
        //   通过表单名字获取对应的表单
          const sheet = workbook.Sheets[sheetName]  
          //console.log(workbook.Sheets[sheetName])
          //将表单转为JSON类型
          this.jsonData = XLSX.utils.sheet_to_json(sheet)
         
        })
      },
      methods: {
        readFile() {
            console.log('read file');
            // 由于使用的是ref标记,因此需要使用this.$refs.fileInput调用
            const file = this.$refs.fileInput.files[0]
            if (!file) return
            //console.log('not null');
            this.reader.readAsBinaryString(file)
            //console.log(this.reader)
        },
        writeFile() {
            
            // 将 JSON 数据转换为工作表
            const sheet = XLSX.utils.json_to_sheet(this.jsonData)

            // 将工作表转换为工作簿
            const workbook = XLSX.utils.book_new()
            XLSX.utils.book_append_sheet(workbook, sheet, 'Sheet1')

            // 写入文件
            const blob = new Blob([XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })], { type: 'application/octet-stream' })
            saveAs(blob, 'data.xlsx')
        },
    }
    Vue.createApp(app).mount('#app')

  </script>

xlxs.js中需要用workbook装sheet表单,sheet表单内存着各行各列的数据。最后封装导出时需要用到FileSaver.js库,使用 FileSaver.js 很简单,只需调用 saveAs() 函数即可。saveAs() 函数需要两个参数:文件的 Blob 对象和文件名。

例如,如果要保存一个文本文件,可以使用以下代码:

import { saveAs } from 'file-saver'

function downloadTextFile(text) {
  const blob = new Blob([text], { type: 'text/plain' })
  saveAs(blob, 'text-file.txt')
}

保存xlsx文件:

import XLSX from 'xlsx'
import { saveAs } from 'file-saver'

function downloadExcel(data) {
  const ws = XLSX.utils.aoa_to_sheet(data)
  const wb = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
  const blob = new Blob([XLSX.write(wb, { bookType: 'xlsx', type: 'array' })], { type: 'application/octet-stream' })
  saveAs(blob, 'data.xlsx')
}

上面的代码首先使用 XLSX.utils.aoa_to_sheet() 将数据转换为工作表对象,然后使用 XLSX.utils.book_new() 创建新的工作簿对象。最后,使用 XLSX.utils.book_append_sheet() 将工作表添加到工作簿中,并使用 XLSX.write() 将工作簿转换为二进制数组。然后,将二进制数组包装在 Blob 对象中,并使用 saveAs() 函数将文件保存到用户计算机。

参考

xlsx.js使用教程: https://blog.csdn.net/GFing18/article/details/125523446

xlsx.js官方文档:https://github.com/exceljs/exceljs/blob/HEAD/README_zh.md

Q.E.D.


寄蜉蝣于天地,渺沧海之一粟