📥 Excel 导入

ThinkAdmin 提供完善的Excel文件导入功能,支持将Excel文件中的数据导入到数据库中。系统提供三种实现方式:Excel.push(推荐)PHP后端解析xlsx.js高级用法

🚀 主要功能

  • Excel 导入: 支持Excel文件的数据导入
  • 多种方式: 支持Excel.push、PHP后端解析和xlsx.js三种方式
  • 自动处理: Excel.push自动处理文件读取、数据解析和逐行上传
  • 数据解析: 自动解析Excel文件内容
  • 数据库写入: 将解析的数据写入数据库
  • 错误处理: 提供完善的错误处理机制
  • 进度显示: 支持导入进度显示和成功/失败统计

📋 支持格式

Excel 格式

  • XLSX: 支持新版Excel格式
  • XLS: 支持旧版Excel格式
  • 数据解析: 自动解析Excel数据
  • 格式验证: 支持数据格式验证

⚙️ 实现方式对比

方式一:Excel.push(推荐,最简单)

  • 优点: 自动处理文件读取、表头映射、逐行上传,代码简洁
  • 缺点: 需要逐行上传,不适合超大数据量
  • 适用场景: 中小文件导入、需要逐行验证和处理

方式二:PHP后端解析(推荐用于大文件)

  • 优点: 服务器端处理,适合大文件,不占用客户端资源
  • 缺点: 需要先上传文件到服务器
  • 适用场景: 大文件导入、需要服务器端复杂处理

方式三:xlsx.js高级用法(自定义处理)

  • 优点: 完全自定义,可以批量上传或自定义处理逻辑
  • 缺点: 需要手动处理文件读取和数据转换
  • 适用场景: 需要自定义处理逻辑、批量上传等高级场景

方式一:Excel.push

Excel.push 是 ThinkAdmin 提供的 Excel 导入插件方法,可以自动处理文件选择、读取、表头映射和逐行上传,是最简单易用的方式。

实现流程

  1. 用户点击导入按钮
  2. 自动弹出文件选择器
  3. 自动读取Excel文件内容
  4. 根据表头映射自动解析数据
  5. 逐行上传数据到服务器
  6. 显示导入进度和结果统计

1. 前端HTML代码

{extend name="admin@public/container" /}

{block name="content"}
<div class="layui-card">
    <div class="layui-card-body">
        <div class="layui-form-item">
            <!-- 导入按钮 -->
            <!--{if auth("import")}-->
            <button class='layui-btn layui-btn-sm layui-btn-active' id="importBtn">
                <i class="layui-icon">&#xe67c;</i> 导入Excel
            </button>
            <!--{/if}-->
        </div>
    </div>
</div>
{/block}

2. 前端JavaScript代码

{block name='script'}
<script>
$(function() {
    // 点击导入按钮
    $('#importBtn').on('click', function() {
        require(['excel'], function(Excel) {
            // 使用 Excel.push 方法
            // 参数1: 上传地址
            // 参数2: Excel工作表名称(Sheet名称)
            // 参数3: 表头映射配置 { _: 起始行, 'Excel表头': '数据库字段' }
            // 参数4: 数据过滤函数(可选)
            Excel.push('{:url("import")}', 'Sheet1', {
                _: 1,  // 数据起始行(1表示第一行是表头,从第二行开始读取数据)
                '序号': 'no',      // Excel表头 => 数据库字段
                '题目': 'name',
                '答案': 'answer',
                '类型': 'type',
                '难度': 'level'
            }, function(item) {
                // 数据过滤处理函数(可选)
                // 参数 item: 当前行的数据对象
                // 返回 false: 跳过该条记录,不导入
                // 返回 item: 导入该条记录(可以修改item后再返回)
                
                // 示例:跳过题目为空的记录
                if (!item.name || item.name.trim() === '') {
                    return false;
                }
                
                // 示例:数据转换
                if (item.type === '单选题') {
                    item.type = 1;
                } else if (item.type === '多选题') {
                    item.type = 2;
                }
                
                // 返回处理后的数据
                return item;
            });
        });
    });
});
</script>
{/block}

3. 后端PHP代码

后端需要接收逐行上传的数据,每次只接收一条记录:

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;
use think\admin\model\SystemUser;

/**
 * 用户管理
 * @class User
 * @package app\admin\controller
 */
class User extends Controller
{
    /**
     * 导入用户数据(逐行接收)
     * @auth true
     */
    public function import()
    {
        // Excel.push 会逐行上传数据,每次只接收一条记录
        $data = $this->request->post();
        
        // 数据验证
        $this->_vali([
            'username.require' => '用户名不能为空!',
            'nickname.require' => '昵称不能为空!',
        ]);
        
        // 检查用户名是否已存在
        if (SystemUser::mk()->where('username', $data['username'])->count() > 0) {
            $this->error('用户名已存在:' . $data['username']);
        }
        
        // 设置默认值
        $data['password'] = md5($data['username']); // 默认密码与用户名相同
        $data['status'] = 1;
        $data['create_at'] = date('Y-m-d H:i:s');
        
        // 保存数据
        try {
            SystemUser::mk()->save($data);
            $this->success('导入成功');
        } catch (\Exception $e) {
            $this->error('导入失败:' . $e->getMessage());
        }
    }
}

Excel.push 参数说明

Excel.push(url, sheet, cols, filter)

参数说明:

  • url (string, 必需): 数据上传的URL地址
  • sheet (string, 必需): Excel工作表名称,如 'Sheet1''用户信息'
  • cols (object, 必需): 表头映射配置
    • _ (number): 数据起始行,1表示第一行是表头,从第二行开始读取数据
    • 'Excel表头' (string): Excel表头名称 => 数据库字段名
  • filter (function, 可选): 数据过滤处理函数
    • 参数: item - 当前行的数据对象
    • 返回: false 跳过该条记录,item 导入该条记录

Excel.push 特性

  1. 自动文件选择: 自动创建文件选择器,无需手动处理
  2. 自动读取文件: 使用 layui.excel.importExcel 自动读取Excel文件
  3. 自动表头映射: 根据配置自动匹配Excel表头和数据库字段
  4. 逐行上传: 自动逐行上传数据,显示进度和统计
  5. 数据过滤: 支持数据过滤和转换
  6. 进度显示: 自动显示导入进度(读取进度、上传进度、成功/失败统计)
  7. 日期处理: 自动处理Excel日期格式

完整示例:用户数据导入

{extend name="admin@public/container" /}

{block name="content"}
<div class="layui-card">
    <div class="layui-card-body">
        <div class="layui-form-item">
            <button class='layui-btn layui-btn-sm layui-btn-active' id="importUserBtn">
                <i class="layui-icon">&#xe67c;</i> 导入用户
            </button>
        </div>
    </div>
</div>
{/block}

{block name='script'}
<script>
$(function() {
    $('#importUserBtn').on('click', function() {
        require(['excel'], function(Excel) {
            Excel.push('{:url("import")}', 'Sheet1', {
                _: 1,  // 第一行是表头,从第二行开始读取
                '用户名': 'username',
                '昵称': 'nickname',
                '手机号': 'phone',
                '邮箱': 'email',
                '状态': 'status'
            }, function(item) {
                // 数据过滤和转换
                
                // 跳过用户名为空的记录
                if (!item.username || item.username.trim() === '') {
                    return false;
                }
                
                // 转换状态值
                if (item.status === '正常' || item.status === '启用') {
                    item.status = 1;
                } else if (item.status === '禁用' || item.status === '停用') {
                    item.status = 0;
                } else {
                    item.status = 1; // 默认启用
                }
                
                // 设置默认值
                if (!item.phone) item.phone = '';
                if (!item.email) item.email = '';
                
                return item;
            });
        });
    });
});
</script>
{/block}

后端代码:

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;
use think\admin\model\SystemUser;

/**
 * 用户管理
 * @class User
 * @package app\admin\controller
 */
class User extends Controller
{
    /**
     * 导入用户数据(逐行接收)
     * @auth true
     */
    public function import()
    {
        // Excel.push 逐行上传,每次只接收一条记录
        $data = $this->request->post();
        
        // 数据验证
        $this->_vali([
            'username.require' => '用户名不能为空!',
            'nickname.require' => '昵称不能为空!',
        ]);
        
        // 检查用户名是否已存在
        if (SystemUser::mk()->where('username', $data['username'])->count() > 0) {
            $this->error('用户名已存在:' . $data['username']);
        }
        
        // 设置默认值
        $data['password'] = md5($data['username']);
        $data['status'] = intval($data['status'] ?? 1);
        $data['create_at'] = date('Y-m-d H:i:s');
        
        // 保存数据
        try {
            SystemUser::mk()->save($data);
            $this->success('导入成功');
        } catch (\Exception $e) {
            $this->error('导入失败:' . $e->getMessage());
        }
    }
}

方式二:PHP后端解析

实现流程

  1. 前端上传Excel文件到服务器
  2. 后端接收文件并保存
  3. 后端使用PhpSpreadsheet解析文件
  4. 后端处理数据并写入数据库

1. 前端HTML代码

<div class="layui-form-item layui-inline">
    <button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>

    <!-- 上传按钮 -->
    <!--{if auth("import")}-->
    <button class='layui-btn layui-btn-sm layui-btn-active' 
            data-file 
            data-type="xlsx,xls" 
            data-uptype='local' 
            data-field="topic_excel">上传题库</button>
    <!--{/if}-->
</div>

说明: data-uptype 设置上传文件存储方式,这里设置的是 local,后端读取文件内容会用到(未测试云存储方式)

2. 前端JavaScript代码

{block name='script'}
<script>
window.form.render();
$(function () {
    /*!文件上传过程及事件处理 */
    $('[data-file]').on('upload.done', function (event, obj) {
        // obj.file 当前完成的文件对象
        // obj.data 当前文件上传后服务端返回的内容
        
        console.log(obj.file);
        console.log(obj.data);
        
        /*! 提交数据并返回结果 */
        if(obj.file.xurl) {
            $.form.load('{:url("import")}', {file: obj.file.xurl}, 'post');
        }
    });
});
</script>
{/block}

说明: 文件上传js部分可参考:前端-文件上传

3. 后端PHP代码

安装依赖

composer require phpoffice/phpspreadsheet

控制器代码

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;
use PhpOffice\PhpSpreadsheet\IOFactory;

/**
 * 题库管理
 * @class Topic
 * @package app\admin\controller
 */
class Topic extends Controller
{
    /**
     * 导入Excel文件
     * @auth true
     */
    public function import()
    {
        $file = $this->app->request->post('file');
        if (!$file) {
            $this->error('文件不能为空');
        }
        
        // 处理文件路径
        $file = '.' . str_replace($this->app->request->domain(), '', $file);
        
        // 表格字段对应关系(Excel列名 => 数据库字段名)
        $cellName = [
            'A' => 'no',      // 序号
            'B' => 'name',    // 题目
            'C' => 'answer',  // 答案
        ];
        
        // 加载Excel文件
        $spreadsheet = IOFactory::load($file);
        $sheet = $spreadsheet->getActiveSheet();  // 获取活动工作表
        $highestRow = $sheet->getHighestRow();    // 取得总行数
        
        $sheetData = [];
        // 从第2行开始读取(第1行通常是表头)
        for ($row = 2; $row <= $highestRow; $row++) {
            foreach ($cellName as $cell => $field) {
                $value = $sheet->getCell($cell . $row)->getValue();
                $value = trim($value);
                if (!empty($value)) {
                    $sheetData[$row][$field] = $value;
                }
            }
        }
        
        // 移除空行
        $sheetData = array_values(array_filter($sheetData));
        $count = count($sheetData);
        
        if ($count < 1) {
            $this->error('未读取到有效数据');
        }
        
        // 数据入库处理
        try {
            $this->app->db->name('topic')->data($sheetData)->strict(false)->insertAll();
            $this->success("成功导入 {$count} 条记录");
        } catch (\Exception $e) {
            $this->error('导入失败:' . $e->getMessage());
        }
    }
}

说明: 简单demo仅供参考,多sheet、表格格式等未做校验,可根据自己要求完善


方式三:xlsx.js高级用法

适用于需要完全自定义处理逻辑的场景,如批量上传、数据预处理等。

实现流程

  1. 前端选择Excel文件
  2. 前端使用 xlsx.js 读取文件内容
  3. 前端将解析后的数据转换为JSON
  4. 前端将JSON数据提交到后端(可批量或自定义)
  5. 后端接收数据并写入数据库

1. 前端HTML代码

<div class="layui-form-item layui-inline">
    <button class='layui-btn layui-btn-sm layui-btn-active' id="importExcelBtn">
        <i class="layui-icon">&#xe67c;</i> 导入Excel
    </button>
    
    <!-- 隐藏的文件选择器 -->
    <input type="file" 
           id="excelFileInput" 
           accept=".xlsx,.xls" 
           style="display: none;">
</div>

2. 前端JavaScript代码

{block name='script'}
<script>
$(function() {
    // 点击按钮触发文件选择
    $('#importExcelBtn').on('click', function() {
        $('#excelFileInput').click();
    });
    
    // 文件选择后读取Excel内容
    $('#excelFileInput').on('change', function(e) {
        var file = e.target.files[0];
        if (!file) return;
        
        // 验证文件类型
        var fileName = file.name;
        var fileExt = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
        if (fileExt !== 'xlsx' && fileExt !== 'xls') {
            $.msg.error('请选择Excel文件(.xlsx 或 .xls)');
            return;
        }
        
        // 显示加载提示
        var loadIdx = $.msg.loading('正在读取Excel文件...');
        
        // 使用 FileReader 读取文件
        var reader = new FileReader();
        reader.onload = function(e) {
            try {
                // 加载 xlsx 库
                require(['xlsx'], function(XLSX) {
                    var data = new Uint8Array(e.target.result);
                    var workbook = XLSX.read(data, {type: 'array'});
                    
                    // 获取第一个工作表
                    var firstSheetName = workbook.SheetNames[0];
                    var worksheet = workbook.Sheets[firstSheetName];
                    
                    // 将工作表转换为JSON(第一行作为表头)
                    var jsonData = XLSX.utils.sheet_to_json(worksheet, {
                        header: 1,  // 使用数组格式,第一行作为表头
                        defval: ''   // 空单元格默认值
                    });
                    
                    // 关闭加载提示
                    $.msg.close(loadIdx);
                    
                    if (jsonData.length < 2) {
                        $.msg.error('Excel文件中没有数据');
                        return;
                    }
                    
                    // 处理数据:第一行是表头,从第二行开始是数据
                    var headers = jsonData[0];  // 表头
                    var rows = jsonData.slice(1); // 数据行
                    
                    // 将数据转换为对象数组
                    var dataList = [];
                    for (var i = 0; i < rows.length; i++) {
                        var row = rows[i];
                        if (row.every(function(cell) { return cell === ''; })) {
                            continue; // 跳过空行
                        }
                        
                        var item = {};
                        for (var j = 0; j < headers.length; j++) {
                            var header = headers[j] || 'col' + j;
                            item[header] = row[j] || '';
                        }
                        dataList.push(item);
                    }
                    
                    if (dataList.length < 1) {
                        $.msg.error('未读取到有效数据');
                        return;
                    }
                    
                    // 显示确认对话框
                    $.msg.confirm('共读取到 ' + dataList.length + ' 条数据,确认导入吗?', function() {
                        // 提交数据到后端(批量上传)
                        var submitIdx = $.msg.loading('正在导入数据...');
                        $.form.load('{:url("import")}', {
                            data: JSON.stringify(dataList),
                            count: dataList.length
                        }, 'post', function(ret) {
                            $.msg.close(submitIdx);
                            if (ret.code > 0) {
                                $.msg.success(ret.info || '导入成功', 3, function() {
                                    $.layTable.reload('TopicData'); // 刷新表格
                                });
                            } else {
                                $.msg.error(ret.info || '导入失败');
                            }
                        }, true);
                    });
                });
            } catch (error) {
                $.msg.close(loadIdx);
                $.msg.error('读取Excel文件失败:' + error.message);
                console.error(error);
            }
        };
        
        reader.onerror = function() {
            $.msg.close(loadIdx);
            $.msg.error('读取文件失败');
        };
        
        // 读取文件为ArrayBuffer
        reader.readAsArrayBuffer(file);
    });
});
</script>
{/block}

3. 后端PHP代码

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;

/**
 * 题库管理
 * @class Topic
 * @package app\admin\controller
 */
class Topic extends Controller
{
    /**
     * 导入Excel数据(批量接收)
     * @auth true
     */
    public function import()
    {
        $data = $this->request->post('data');
        $count = intval($this->request->post('count', 0));
        
        if (empty($data)) {
            $this->error('数据不能为空');
        }
        
        // 解析JSON数据
        $dataList = json_decode($data, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            $this->error('数据格式错误:' . json_last_error_msg());
        }
        
        if (empty($dataList) || !is_array($dataList)) {
            $this->error('未读取到有效数据');
        }
        
        // 字段映射(Excel表头 => 数据库字段)
        $fieldMap = [
            '序号' => 'no',
            '题目' => 'name',
            '答案' => 'answer',
        ];
        
        // 转换数据格式
        $insertData = [];
        $errors = [];
        
        foreach ($dataList as $index => $row) {
            $item = [];
            foreach ($row as $key => $value) {
                // 根据字段映射转换
                $field = $fieldMap[$key] ?? strtolower($key);
                $item[$field] = trim($value);
            }
            
            // 数据验证
            if (empty($item['name'])) {
                $errors[] = "第 " . ($index + 2) . " 行:题目不能为空";
                continue;
            }
            
            $insertData[] = $item;
        }
        
        if (empty($insertData)) {
            $this->error('没有有效的数据需要导入' . (!empty($errors) ? ':' . implode(';', array_slice($errors, 0, 5)) : ''));
        }
        
        // 数据入库
        try {
            $this->app->db->name('topic')->data($insertData)->strict(false)->insertAll();
            $message = '成功导入 ' . count($insertData) . ' 条记录';
            if (!empty($errors)) {
                $message .= ',' . count($errors) . ' 条记录导入失败:' . implode(';', array_slice($errors, 0, 5));
            }
            $this->success($message);
        } catch (\Exception $e) {
            $this->error('导入失败:' . $e->getMessage());
        }
    }
}

三种方式对比

特性Excel.pushPHP后端解析xlsx.js高级用法
实现难度⭐ 最简单⭐⭐ 中等⭐⭐⭐ 较复杂
代码量最少中等最多
文件上传❌ 无需上传✅ 需要上传❌ 无需上传
服务器负载中等(逐行上传)较高(处理文件)较低(只处理数据)
客户端资源占用较少不占用占用较多
大文件支持⚠️ 受逐行上传限制✅ 支持⚠️ 受浏览器限制
实时进度✅ 自动显示❌ 不支持✅ 可自定义
数据验证✅ 逐行验证✅ 批量验证✅ 可自定义
错误处理✅ 自动统计⚠️ 需手动处理✅ 可自定义
适用场景中小文件、逐行处理大文件、批量处理自定义处理逻辑

📋 Excel.push 说明

表头映射配置

{
    _: 1,  // 数据起始行
    'Excel表头1': '数据库字段1',
    'Excel表头2': '数据库字段2',
    // ...
}

说明:

  • _: 数据起始行,1表示第一行是表头,从第二行开始读取数据
  • 'Excel表头': Excel文件中的表头名称(必须完全匹配)
  • '数据库字段': 对应的数据库字段名

数据过滤函数

function(item) {
    // item 是当前行的数据对象,已根据表头映射转换
    // 例如:{ no: '1', name: '题目1', answer: '答案1' }
    
    // 返回 false: 跳过该条记录
    if (!item.name) {
        return false;
    }
    
    // 返回 item: 导入该条记录(可以修改后再返回)
    item.create_at = new Date().toISOString();
    return item;
}

进度显示

Excel.push 会自动显示导入进度:

  • 读取阶段: 显示"读取 X.XX%"
  • 上传阶段: 显示"更新 X.XX%(成功 X 条, 失败 X 条)"
  • 完成: 显示"共处理 X 条记录(成功 X 条, 失败 X 条)"

日期格式处理

Excel.push 会自动处理Excel日期格式,将Excel日期码转换为 YYYY-MM-DD HH:ii:ss 格式。

多工作表支持

如果Excel文件有多个工作表,需要指定工作表名称:

Excel.push('{:url("import")}', '用户信息', {
    _: 1,
    '用户名': 'username',
    '昵称': 'nickname'
});

完整示例:题库导入

{extend name="admin@public/container" /}

{block name="content"}
<div class="layui-card">
    <div class="layui-card-body">
        <div class="layui-form-item">
            <button class='layui-btn layui-btn-sm layui-btn-active' id="importTopicBtn">
                <i class="layui-icon">&#xe67c;</i> 导入题库
            </button>
        </div>
    </div>
</div>
{/block}

{block name='script'}
<script>
$(function() {
    $('#importTopicBtn').on('click', function() {
        require(['excel'], function(Excel) {
            Excel.push('{:url("import")}', 'Sheet1', {
                _: 1,  // 第一行是表头
                '序号': 'no',
                '题目': 'name',
                '选项A': 'option_a',
                '选项B': 'option_b',
                '选项C': 'option_c',
                '选项D': 'option_d',
                '正确答案': 'answer',
                '类型': 'type',
                '难度': 'level',
                '解析': 'analysis'
            }, function(item) {
                // 数据过滤和转换
                
                // 跳过题目为空的记录
                if (!item.name || item.name.trim() === '') {
                    return false;
                }
                
                // 转换类型
                if (item.type === '单选题') {
                    item.type = 1;
                } else if (item.type === '多选题') {
                    item.type = 2;
                } else if (item.type === '判断题') {
                    item.type = 3;
                } else {
                    item.type = 1; // 默认单选题
                }
                
                // 转换难度
                if (item.level === '简单') {
                    item.level = 1;
                } else if (item.level === '中等') {
                    item.level = 2;
                } else if (item.level === '困难') {
                    item.level = 3;
                } else {
                    item.level = 1; // 默认简单
                }
                
                // 设置默认值
                if (!item.option_a) item.option_a = '';
                if (!item.option_b) item.option_b = '';
                if (!item.option_c) item.option_c = '';
                if (!item.option_d) item.option_d = '';
                if (!item.analysis) item.analysis = '';
                
                return item;
            });
        });
    });
});
</script>
{/block}

后端代码:

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;

/**
 * 题库管理
 * @class Topic
 * @package app\admin\controller
 */
class Topic extends Controller
{
    /**
     * 导入题目(逐行接收)
     * @auth true
     */
    public function import()
    {
        // Excel.push 逐行上传,每次只接收一条记录
        $data = $this->request->post();
        
        // 数据验证
        $this->_vali([
            'name.require' => '题目不能为空!',
            'answer.require' => '正确答案不能为空!',
            'type.in:1,2,3' => '题目类型不正确!',
        ]);
        
        // 设置默认值
        $data['create_at'] = date('Y-m-d H:i:s');
        $data['status'] = 1;
        
        // 保存数据
        try {
            $this->app->db->name('topic')->save($data);
            $this->success('导入成功');
        } catch (\Exception $e) {
            $this->error('导入失败:' . $e->getMessage());
        }
    }
}

📋 注意事项

Excel.push 注意事项

  1. 表头匹配: Excel表头必须与配置中的表头名称完全匹配(区分大小写)
  2. 工作表名称: 确保工作表名称正确,默认是 Sheet1
  3. 数据起始行: _ 参数表示数据起始行,1表示第一行是表头
  4. 逐行上传: 数据是逐行上传的,后端每次只接收一条记录
  5. 错误处理: 如果某条记录导入失败,会继续处理下一条记录
  6. 进度显示: 会自动显示导入进度和成功/失败统计

PHP后端解析注意事项

  1. 文件存储: 确保服务器有足够的存储空间
  2. 文件路径: 正确处理文件路径,支持本地和云存储
  3. 内存限制: 大文件可能需要调整PHP内存限制
  4. 执行时间: 大文件导入可能需要调整PHP执行时间限制

xlsx.js高级用法注意事项

  1. 文件大小: 建议文件大小不超过10MB
  2. 浏览器兼容: 确保浏览器支持FileReader API
  3. 内存占用: 大文件可能占用较多浏览器内存
  4. 数据格式: 确保Excel文件格式规范,表头清晰

通用注意事项

  1. 文件格式: 确保Excel文件格式正确,表头清晰
  2. 数据验证: 导入前进行数据验证,避免脏数据
  3. 错误处理: 完善的错误处理机制,提示用户具体错误
  4. 权限控制: 使用 auth() 函数控制导入权限

📋 常见问题

Q: Excel.push 如何指定多个工作表? A: 在 Excel.push 的第二个参数中指定工作表名称即可。

Q: Excel.push 如何处理日期格式? A: Excel.push 会自动处理Excel日期格式,将日期码转换为 YYYY-MM-DD HH:ii:ss 格式。

Q: Excel.push 导入失败怎么办? A: Excel.push 会显示失败统计,后端返回 code: 0 的记录会被计入失败数。可以在后端返回具体的错误信息。

Q: 如何自定义Excel.push的进度显示? A: Excel.push 的进度显示是自动的,无法自定义。如果需要自定义,可以使用 xlsx.js 高级用法。

Q: Excel.push 支持哪些文件格式? A: 支持 .xlsx.xls 格式的Excel文件。


提示:

  • 推荐使用 Excel.push,这是最简单易用的方式
  • 大文件推荐使用 PHP后端解析
  • 需要完全自定义处理逻辑时,使用 xlsx.js 高级用法
最近更新:
Contributors: Anyon