SheetJS读取服务器Excel文件

该代码示例展示了如何利用XMLHttpRequest的GET请求获取Excel文件(Test.xlsx),并将响应类型设置为arraybuffer。然后,通过SheetJS库将接收到的数据转换为二进制字符串,从而读取和解析Excel工作簿内容。

https://docs.sheetjs.com/docs/demos/network#xmlhttprequest

var filename = 'Test.xlsx';
var req = new XMLHttpRequest();
req.open('GET', filename, true);
req.responseType = 'arraybuffer';
req.onload = function (e) {

    //兼容IE,需把type改为binary,并对req.response进行转化
    var workbook = XLSX.read(arrayBufferToBinaryString(req.response), {
        type: 'binary'
    });

    console.log(workbook);
}

req.send();

//ArrayBuffer转BinaryString转BinaryString
function arrayBufferToBinaryString(data) {
    var o = '',
        l = 0,
        w = 10240;
    for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
    return o;
}
<think>首先,用户查询的是使用SheetJS读取Excel文件,然后用PHP将表格数据导入数据库的方法。我需要参考给定的引用来帮助回答这个问题。 用户引用内容: - 引用[1]:提到使用JavaScript读取Excel表格数据并导入到数据库,特别强调在受限环境中使用JavaScript。 - 引用[2]:描述了一个方法,前端JavaScript读取Excel数据,后端PHP解析并插入数据库。 - 引用[3]:讨论ThinkPHP框架下使用PHPExcel类导入导出Excel的各种方法。 - 引用[4]:涉及PHP导入导出大量Excel或CSV数据到数据库,提到了PHPExcel类和优化技巧。 用户的问题是:“我想查找使用SheetJS读取Excel文件,并使用PHP将表格数据导入数据库的方法”。所以,焦点是SheetJS(一个JavaScript库来处理Excel文件)和PHP结合使用。 从引用中提取相关信息: - 引用[2]直接相关:它提到“方法四是读取数据,整理数据。解析Excel数据,然后将数据发送到后端。后端解析数据并将其插入数据库。”这描述了前端JavaScript读取Excel,后端PHP处理的过程。 - 引用[1]提到使用JavaScript读取Excel文件,可以作为SheetJS的替代或类似。 - 引用[3]和[4]更侧重于PHP端使用PHPExcel或类似库,但用户特别提到SheetJS,所以我应该优先前端使用SheetJSSheetJSJavaScript库,用于在浏览器中读取Excel文件。PHP是服务器语言。所以,典型的流程是: 1. 用户在浏览器上传Excel文件。 2. 前端使用SheetJS读取文件内容。 3. 前端将数据发送到PHP后端。 4. PHP后端接收数据并插入到数据库。 引用[2]中描述的“方法四”正好匹配这个流程。 实现步骤: 1. **前端部分(JavaScript with SheetJS)**: - 使用SheetJS库(如xlsx.js)来解析Excel文件。 - 上传文件时,使用FileReader读取文件,然后用SheetJS解析。 - 获取数据后,发送到PHP脚本。 2. **后端部分(PHP)**: - PHP接收JSON数据或其他格式的数据。 - PHP连接到数据库(如MySQL)。 - PHP解析接收到的数据,并使用SQL查询插入到数据库表中。 引用[4]提到PHP处理大量数据时使用PHPExcel,但既然用户指定SheetJS用于读取,PHP端不需要Excel解析库;PHP直接处理JSON数据。 确保回答结构清晰: - 解释整体流程。 - 提供代码示例。 - 参考引用。 系统指令要求: - 行内数学表达式用$...$(但这里可能不涉及数学,所以可能不需要)。 - 独立公式用$$...$$(同样,可能不适用)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落自然地添加引用标识。 生成相关问题: - 例如,SheetJS的安装使用、PHP数据库操作优化、错误处理等。 最终回答结构: 1. 介绍方法。 2. 分步解释代码。 3. 提供代码示例(前端JavaScript和后端PHP)。 4. 添加相关问题。 5. 引用相关引用。 代码示例: - 前端:HTML和JavaScript使用SheetJS。 - 后端:PHP脚本插入数据。 参考引用: - 引用[2]直接相关:“方法四是读取数据,整理数据。解析Excel数据,然后将数据发送到后端。后端解析数据并将其插入数据库。”[^2] - 引用[1]提到JavaScript读取Excel[^1]。 - 引用[4]提到PHP处理数据库优化[^4]。 完整回答: - 先概述流程。 - 然后详细步骤。 - 代码块。 - 相关问题。 </think>### 使用SheetJS读取Excel文件并用PHP导入数据库的实现方法 基于您的查询,我将详细介绍如何结合SheetJS(一个JavaScript库)在浏览器端读取Excel文件,并通过PHP后端将数据导入数据库。这种方法的核心流程是:前端使用SheetJS解析Excel文件,将数据转换为JSON格式发送到PHP后端;PHP接收数据,解析后插入数据库。参考引用[2],这个方法类似“前端读取数据并发送到后端,后端解析并插入数据库”的模式[^2]。同时,引用[1]强调了在受限环境中JavaScript的灵活性[^1],而引用[4]提供了PHP处理数据库插入的性能优化建议[^4]。 以下是分步实现的详细指南(步骤基于前端和后端分离的架构): #### **整体流程** 1. **前端**:用户上传Excel文件 → 使用SheetJS解析文件 → 数据转换为JSON → 通过AJAX发送到PHP后端。 2. **后端**:PHP接收JSON数据 → 连接到数据库 → 解析数据并构建SQL插入语句 → 执行插入操作。 3. **优点**:SheetJS高效解析Excel,PHP直接处理数据,避免了在服务器端使用PHPExcel等库的依赖(如引用[3][4]所述),简化部署[^3][^4]。 #### **步骤详解与代码示例** 以下代码示例基于纯JavaScriptSheetJS)和PHP实现。SheetJS的安装可通过CDN引入。 ##### **步骤1:前端实现(HTML + JavaScript)** - 创建一个HTML表单用于上传Excel文件(.xlsx或.xls)。 - 使用SheetJS解析文件,并将数据转换为JSON数组。 - 通过AJAX将数据发送到PHP后端。 - **所需库**:引入SheetJS CDN(或下载本地)。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Excel导入数据库</title> <!-- 引入SheetJS库 --> <script src="https://cdn.sheetjs.com/xlsx-0.19.3/package/dist/xlsx.full.min.js"></script> </head> <body> <input type="file" id="excelFile" accept=".xlsx, .xls"> <button onclick="uploadExcel()">导入数据</button> <div id="result"></div> <script> function uploadExcel() { const fileInput = document.getElementById('excelFile'); const file = fileInput.files[0]; if (!file) { alert("请选择Excel文件!"); return; } const reader = new FileReader(); reader.onload = function(e) { try { // 使用SheetJS解析Excel数据 const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); // 获取第一个工作表数据并转换为JSON数组 const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // header:1 表示包含标题行 // 发送数据到PHP后端 sendDataToServer(jsonData); } catch (error) { console.error("解析失败:", error); document.getElementById("result").innerHTML = `<p>错误:${error.message}</p>`; } }; reader.readAsArrayBuffer(file); // 读取文件为ArrayBuffer } function sendDataToServer(data) { // 发送JSON数据到PHP脚本 fetch('import.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ excelData: data }) // 封装为JSON对象 }) .then(response => response.json()) .then(result => { if (result.success) { document.getElementById("result").innerHTML = `<p>导入成功!行数:${result.count}</p>`; } else { document.getElementById("result").innerHTML = `<p>导入失败:${result.error}</p>`; } }) .catch(error => { document.getElementById("result").innerHTML = `<p>网络错误:${error}</p>`; }); } </script> </body> </html> ``` **关键点解释**: - `sheet_to_json`函数将Excel单元格转换为JSON数组(数组形式,便于PHP处理)。 - AJAX使用`fetch` API发送数据,确保PHP接收格式正确(引用[2]类似方法)[^2]。 - 错误处理包括文件解析失败和网络错误。 ##### **步骤2:后端实现(PHP)** - PHP脚本接收JSON数据,连接到MySQL数据库(或其他数据库),并批量插入数据。 - 优化:使用预处理语句防止SQL注入,并参考引用[4]建议的批量插入提升性能[^4]。 ```php <?php // import.php 文件 header('Content-Type: application/json'); // 设置响应头为JSON // 接收前端发送的JSON数据 $input = file_get_contents('php://input'); $data = json_decode($input, true); if (empty($data) || !isset($data['excelData'])) { echo json_encode(['success' => false, 'error' => '缺少数据']); exit; } $excelData = $data['excelData']; // 获取Excel数据数组 $header = array_shift($excelData); // 提取标题行(假设第一行为列名) // 数据库配置(需根据实际情况修改) $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "your_database"; $table = "your_table"; // 数据库表名 try { // 创建数据库连接 $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 准备插入SQL(动态生成占位符) $columns = implode(", ", array_map(function($col) { return "`$col`"; // 处理列名防止注入 }, $header)); $placeholders = implode(", ", array_fill(0, count($header), '?')); // 生成 ?,?,? 占位符 $sql = "INSERT INTO `$table` ($columns) VALUES ($placeholders)"; $stmt = $conn->prepare($sql); // 批量插入数据 $count = 0; foreach ($excelData as $row) { if (count($row) !== count($header)) { continue; // 跳过行数不匹配的行 } $stmt->execute($row); // 执行插入 $count++; } // 返回成功结果 echo json_encode(['success' => true, 'count' => $count]); } catch (PDOException $e) { echo json_encode(['success' => false, 'error' => '数据库错误: ' . $e->getMessage()]); } catch (Exception $e) { echo json_encode(['success' => false, 'error' => '处理错误: ' . $e->getMessage()]); } $conn = null; // 关闭连接 ?> ``` **关键点解释**: - PHP使用`php://input`获取原始JSON数据,避免表单格式问题(引用[2]后端解析概念)[^2]。 - 动态生成SQL插入语句,适应Excel列名变化。 - 性能优化:遍历每行数据并使用预处理语句(PDO),减少数据库负载(引用[4]处理百万数据的建议)[^4]。 - 安全措施:PDO预处理防止SQL注入,列名用反引号包裹。 #### **注意事项** 1. **SheetJS版本**:确保使用最新版SheetJS(CDN已指定),支持主流Excel格式。 2. **数据库适配**:示例基于MySQL,如需其他数据库(如PostgreSQL),修改PDO连接字符串。 3. **性能优化**: - 大量数据时(如引用[4]所述110万+行),后端PHP可分批插入(例如每1000行插入一次)[^4]。 - 前端处理大文件时,添加进度条(使用`onprogress`事件)。 4. **错误处理**:前端和后端均添加验证,如文件类型检查、数据完整性验证(参考引用[2]失败处理)[^2]。 5. **依赖**:无需PHPExcelSheetJS在浏览器端完成解析,减少服务器负担。 #### **相关问题** 基于此方法,您可能进一步探讨: 1. 如何处理SheetJS不支持的特殊Excel格式(如宏或图表)? 2. 如何在PHP端优化百万级数据导入(参考引用[4]提到的批量处理和索引优化)? 3. 前端如何添加上传进度显示和错误反馈? 4. 如何在ThinkPHP框架(引用[3])中集成此方法? 5. SheetJS导出数据到Excel的实现方法是什么? 如果您提供更多细节(如数据库类型或框架),我可以扩展优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值