使用 xlsx 库在前端实现 Excel 文件上传及解析

本文介绍了如何在前端利用xlsx.js库实现文件上传功能,并解析Excel内容,展示了HTML表单、JavaScript处理文件上传和使用FileReader解析ArrayBuffer的过程,最后将数据渲染为表格。
摘要由CSDN通过智能技术生成

简介

我们将介绍如何使用 xlsx.js 库在前端实现 Excel 文件上传和解析。这对于读取和展示上传的 Excel 数据非常有用。我们将使用一个简单的 HTML 表单,并使用 JavaScript 处理文件上传和解析。

实现如下效果:

img1

准备工作

首先,在 HTML 页面中引入 xlsx.js 库。我们将使用 cdnjs 链接,但您也可以下载该库并在本地引用。

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.4/xlsx.full.min.js"></script>

创建文件上传表单

在 HTML 页面中,创建一个文件上传表单:

<!-- 用于点击上传文件的输入字段 -->
<input type="file" id="fileInput" style="display: none" accept=".xls,.xlsx" required />
<label for="fileInput" class="label">点击上传文件</label>

<!-- 用于拖放文件上传的输入字段 -->
<div id="dropArea">
    <p>拖拽文件至此处</p>
</div>

<!-- 用于显示解析后的数据表 -->
<div id="table-container" style="margin-top: 20px"></div>

使用 JavaScript 处理文件上传及解析

现在,我们将使用 JavaScript 读取和解析上传的 Excel 文件。在 script 标签中添加以下内容:

const fileInput = document.getElementById("fileInput");
const dropArea = document.getElementById("dropArea");

fileInput.addEventListener("change", (event) => {
    handleFileUpload(event.target.files[0]);
});

dropArea.addEventListener("drop", (e) => {
    e.preventDefault();
    dropArea.style.border = "2px dashed #ccc";
    const droppedFiles = e.dataTransfer.files;
    handleFileUpload(droppedFiles[0]);
});

// 文件上传函数
function handleFileUpload(file) {
    const reader = new FileReader();
    reader.readAsArrayBuffer(file);
    // 定义一个加载完成的回调,在 FileReader 完成文件读取操作后被调用。
    reader.onload = (event) => {
        const data = new Uint8Array(event.target.result);
        const workbook = XLSX.read(data, { type: "array" });

        // 获取工作表名数组
        const sheetNameArray = workbook.SheetNames;
        // 获取第一个工作表
        const firstSheet = workbook.Sheets[sheetNameArray[0]];
        // 将工作表转换为二维数组
        const sheetDataArray = XLSX.utils.sheet_to_json(firstSheet, {
            // defval: "" // 配置这个得到对象数组的格式
            header: 1 // 得到二维数组
        });
        // 调用渲染 Excel 的函数
        renderTable(sheetDataArray);
    };
}

这段代码的执行顺序如下:

  1. handleFileUpload(file) 函数被调用,传入一个 File 对象(例如从 input[type=file] 获取的文件)。
  2. 创建一个新的 FileReader 实例并将其赋给 reader 变量。
  3. 定义一个名为 reader.onload 的回调函数。这个回调函数将在 FileReader 完成文件读取操作后被调用。
  4. 调用 reader.readAsArrayBuffer(file)。这将启动读取文件的过程。由于这是一个异步操作,它将在后台运行,不阻塞 JavaScript 的执行。
  5. 当文件读取操作完成后,会触发 reader.onload 回调函数。event.target.result 将包含文件的 ArrayBuffer 数据。我们创建一个新的 Uint8Array,将 ArrayBuffer 数据赋给它,这会使得数据更容易处理。
  6. 使用 XLSX.read() 函数解析 Uint8Array 数据(原始 Excel 文件的数据),并将结果赋给 workbook 变量。
  7. workbook 对象中获取工作表名数组,并将其存储在 sheetNameArray 变量中。
  8. 获取第一个工作表(在 sheetNameArray 中的第一个元素指定的工作表)并将其存储在 firstSheet 变量中。
  9. 使用 XLSX.utils.sheet_to_json() 函数将 firstSheet 对象转换为一个二维数组(由于 header: 1 参数)。将结果存储在 sheetDataArray 变量中。
  10. 调用 renderTable(sheetDataArray) 函数,将二维数组(已解析的 Excel 文件数据)传递给它。这个函数应该负责在页面上呈现数据(具体实现可能因项目而异)。

为了在网页上显示解析后的数据,我们将创建一个名为 renderTable() 的函数。

// 将数据渲染为一个表格
function renderTable(sheetDataArray) {
    const table = document.createElement("table");
    table.classList.add("table", "table-striped");

    sheetDataArray.forEach((row) => {
        const tableRow = document.createElement("tr");

        row.forEach((cell) => {
            const tableCell = document.createElement("td");
            tableCell.textContent = cell;
            tableRow.appendChild(tableCell);
        });

        table.appendChild(tableRow);
    });

    // 添加数据表到表格容器
    const tableContainer = document.getElementById("table-container");
    tableContainer.innerHTML = "";
    tableContainer.appendChild(table);
}

// 为拖放添加事件监听器
dropArea.addEventListener("dragover", (e) => {
    e.preventDefault();
    dropArea.style.border = "2px dashed #333";
});

dropArea.addEventListener("dragleave", () => {
    dropArea.style.border = "2px dashed #ccc";
});

完成以上步骤后,您可以选择和上传 Excel 文件,前端会立即解析并显示文件中的数据内容。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个利用 js-xlsx 实现 Excel 文件导入导出功能的示例: 首先在 HTML 文件中引入 js-xlsx : ```html <script src="https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js"></script> ``` 然后在 JavaScript 文件中编写以下代码: ```javascript // 导出 Excel 文件 function exportExcel(data, filename) { const ws = XLSX.utils.json_to_sheet(data); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); XLSX.writeFile(wb, `${filename}.xlsx`); } // 导入 Excel 文件 function importExcel(file, callback) { const reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = (e) => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; const result = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); callback(result); }; } ``` 其中,exportExcel 函数用于将数据导出为 Excel 文件,参数 data 为要导出的数据,filename 为导出的文件名。 importExcel 函数用于导入 Excel 文件,参数 file 为要导入的文件,callback 为导入成功后的回调函数,回调函数的参数 result 为导入的数据。 示例代码中使用了 FileReader 对象读取文件内容,然后使用 js-xlsx 解析 Excel 文件并将数据转化为 JSON 格式。 使用示例: ```javascript const data = [ { name: '张三', age: 20, gender: '男' }, { name: '李四', age: 22, gender: '女' }, { name: '王五', age: 25, gender: '男' }, ]; exportExcel(data, 'test'); // 导出 Excel 文件,文件名为 test.xlsx const inputElement = document.getElementById('input-file'); inputElement.addEventListener('change', (e) => { const file = e.target.files[0]; importExcel(file, (result) => { console.log(result); // 输出导入的数据 }); }); ``` 在 HTML 文件中添加一个文件选择框: ```html <input type="file" id="input-file"> ``` 用户选择一个 Excel 文件后,调用 importExcel 函数导入数据,并在回调函数中处理导入的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

John Rivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值