dede批量excel数据导入

99ANYc3cd6
预计阅读时长 32 分钟
位置: 首页 DEDE建站 正文

下面我将为您提供几种主流的实现方法,从最简单直接最规范推荐,并附上详细的步骤和代码示例。

dede批量excel数据导入
(图片来源网络,侵删)

核心思路

无论使用哪种方法,核心思路都是一致的:

  1. 读取Excel文件:使用PHP库(如PHPExcel或其升级版PhpSpreadsheet)将Excel文件中的数据读取出来,转换成一个PHP数组。
  2. 数据处理:遍历这个数组,对每一行数据进行处理,检查数据是否为空、格式化日期、处理特殊字符等。
  3. 插入DedeCMS:根据数据类型(文章、栏目、软件等),调用DedeCMS相应的底层函数或直接操作数据库,将数据插入到系统中。

直接修改后台程序文件(最直接,但不推荐长期维护)

这种方法适合临时使用一次,或者对系统修改不介意的情况,我们以批量导入文章为例。

准备工作:

  1. 下载PHPExcel库:这是读取Excel文件的关键,从GitHub下载它:https://github.com/PHPOffice/PHPExcel

    dede批量excel数据导入
    (图片来源网络,侵删)
  2. 解压并上传:将下载的PHPExcel文件夹解压,然后上传到你的DedeCMS网站的/include/目录下。

  3. 准备Excel模板:制作一个Excel文件,第一行必须是标题行,列名需要和DedeCMS文章表dede_archivesdede_addonarticle(如果使用文章模型)的字段名对应。

    示例Excel列名 (articles_import.xlsx): | title | typeid | shorttitle | writer | source | litpic | pubdate | keywords | description | body | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | | 我的测试文章1 | 1 | 测试短标题1 | admin | 本站 | /images/img1.jpg | 2025-10-27 10:00:00 | 标签1,标签2 | 这是文章1的摘要... |

    这里是文章1的正文内容...

    | | 我的测试文章2 | 1 | 测试短标题2 | admin | 本站 | /images/img2.jpg | 2025-10-27 11:00:00 | 标签3,标签4 | 这是文章2的摘要... |

    这里是文章2的正文内容...

    |

    注意:

    • typeid:必须是DedeCMS中已存在的栏目ID。
    • pubdate:日期格式要正确,可以使用YYYY-MM-DD HH:MM:SS
    • body:这里是文章正文,可以使用HTML标签。

操作步骤:

  1. 找到并打开文件: 登录DedeCMS后台,找到 dede/content_list.php 文件,这个文件是文章列表管理页面,我们在这里添加一个上传按钮和处理逻辑。

  2. 修改 content_list.php

    在文件中找到合适的位置(增加顶级文章”按钮附近),添加一个“批量导入”按钮的HTML代码。

    <!-- 在合适位置添加这个按钮 -->
    <a href="javascript:;" onclick="showImportDialog();" class="coolbg">批量导入Excel</a>

    然后在页面的 <head> 部分或JavaScript区域添加一个简单的弹窗提示(为了简化,这里用window.location直接跳转,实际项目中建议用模态框)。

    <script type="text/javascript">
    function showImportDialog() {
        if(confirm("此操作将直接导入数据,请确保Excel格式正确!")) {
            window.location.href = "article_import.php";
        }
    }
    </script>
  3. 创建新的处理文件 article_import.php

    dede/ 目录下新建一个名为 article_import.php 的文件,并将以下代码粘贴进去。

    <?php
    require_once(dirname(__FILE__)."/config.php");
    require_once(DEDEINC."/PHPExcel.php"); // 引入PHPExcel类库
    // 检查是否有文件上传
    if (empty($_FILES['excel_file']['tmp_name'])) {
        ShowMsg("请先选择要导入的Excel文件!", "-1");
        exit();
    }
    $file_type = pathinfo($_FILES['excel_file']['name'], PATHINFO_EXTENSION);
    if ($file_type != 'xls' && $file_type != 'xlsx') {
        ShowMsg("文件格式不正确,请上传.xls或.xlsx格式的文件!", "-1");
        exit();
    }
    try {
        // 加载Excel文件
        $objPHPExcel = PHPExcel_IOFactory::load($_FILES['excel_file']['tmp_name']);
        $sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
        // 移除表头(第一行)
        unset($sheetData[1]);
        $success_count = 0;
        $fail_count = 0;
        // 遍历每一行数据
        foreach ($sheetData as $row) {
            // 检查关键字段是否为空
            if (empty($row['A']) || empty($row['D']) || empty($row['J'])) { // A=标题, D=栏目ID, J=正文
                $fail_count++;
                continue;
            }
            // 准备文章数据
            $arctitle = trim($row['A']);
            $typeid = intval($row['B']);
            $shorttitle = trim($row['C']);
            $writer = trim($row['D']);
            $source = trim($row['E']);
            $litpic = trim($row['F']);
            $pubdate = !empty($row['G']) ? strtotime($row['G']) : time();
            $keywords = trim($row['H']);
            $description = trim($row['I']);
            $body = $row['J'];
            // 调用DedeCMS文章发布函数
            $arc = array();
            $arc['title'] = $arctitle;
            $arc['typeid'] = $typeid;
            $arc['arcrank'] = 0; // 默认为已审核
            $arc['ismake'] = 1;
            $arc['channel'] = 1; // 文章模型ID
            $arc['senddate'] = time();
            $arc['pubdate'] = $pubdate;
            $arc['mid'] = $cuserLogin->getUserID();
            $arc['description'] = $description;
            $arc['keywords'] = $keywords;
            $arc['shorttitle'] = $shorttitle;
            $arc['source'] = $source;
            $arc['writer'] = $writer;
            $arc['litpic'] = $litpic;
            // 调用核心发布函数
            $id = InsertArticle($arc, $body);
            if ($id > 0) {
                $success_count++;
            } else {
                $fail_count++;
            }
        }
        ShowMsg("导入完成!成功:{$success_count} 条,失败:{$fail_count} 条。", "content_list.php");
        exit();
    } catch (Exception $e) {
        ShowMsg("导入失败:文件读取错误或格式不正确!", "-1");
        exit();
    }
    ?>
  4. 添加上传表单: 为了让article_import.php能接收到文件,我们需要一个上传表单,可以在content_list.php的底部添加一个隐藏的表单,或者通过AJAX提交,为了简单,我们可以在content_list.php的最后加上一个隐藏的表单。

    <!-- 在 content_list.php 文件最后添加 -->
    <form action="article_import.php" method="post" enctype="multipart/form-data" style="display:none;" id="importForm">
        <input type="file" name="excel_file" id="excelFile">
    </form>
    <script>
    function showImportDialog() {
        if(confirm("此操作将直接导入数据,请确保Excel格式正确!")) {
            document.getElementById('importForm').style.display='block';
            document.getElementById('excelFile').click();
            // 注意:这里需要监听文件选择完成后自动提交表单
            // 简化起见,用户选择文件后需要手动点击一个提交按钮
        }
    }
    </script>

    更完善的方案:创建一个独立的导入页面,dede/article_import_page.php,里面只包含文件上传表单和处理逻辑,这样更清晰。


制作一个独立的插件(推荐)

这是最规范、最易于维护和扩展的方法。

  1. 创建插件目录和文件: 在 /dede/templets/ 目录下创建一个新文件夹,excel_import。 在这个文件夹里创建两个文件:

    • index.php (主页面,包含上传表单)
    • import_do.php (处理逻辑)
  2. 编写 index.php (模板文件)

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Excel文章导入工具</title>
        <link rel="stylesheet" href="../static/css/base.css">
    </head>
    <body>
        <div class="tbox">
            <div class="tbox-title">Excel文章导入工具</div>
            <div class="tbox-content">
                <form action="import_do.php" method="post" enctype="multipart/form-data">
                    <p>请选择Excel文件(.xls 或 .xlsx):</p>
                    <p><input type="file" name="excel_file" required></p>
                    <p><button type="submit" class="btn-primary">开始导入</button></p>
                </form>
            </div>
        </div>
    </body>
    </html>
  3. 编写 import_do.php (处理逻辑): 这个文件的核心逻辑和方法一中的 article_import.php 基本一样,但需要引入DedeCMS的初始化文件。

    <?php
    require_once(dirname(__FILE__)."/../config.php");
    require_once(DEDEINC."/PHPExcel.php");
    // ... (这里放和方法一 article_import.php 中完全一样的 try-catch 和数据处理逻辑)
    // 只需要把最后的 ShowMsg 改为页面输出即可
    $success_count = 0;
    $fail_count = 0;
    // ... 循环处理 ...
    // 输出结果
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>导入结果</title>
        <style>body{font-family: Arial, sans-serif; padding:20px;}</style>
    </head>
    <body>
        <h2>导入结果</h2>
        <p>成功导入:<?php echo $success_count; ?> 条</p>
        <p>导入失败:<?php echo $fail_count; ?> 条</p>
        <p><a href="index.php">返回继续导入</a></p>
    </body>
    </html>
  4. 在后台菜单中添加入口: 登录后台,找到“系统” -> “系统基本参数” -> “添加新变量”。

    • 变量名称cfg_excel_import_url
    • 变量类型文本
    • 参数说明Excel导入工具地址
    • 变量值/dede/templets/excel_import/index.php
    • 所属组核心设置

    然后修改 dede/templets/index_body.htm (后台首页模板),在合适的位置添加一个链接:

    <li><a href='{dede:global.cfg_excel_import_url/}' target='_blank'>Excel文章导入</a></li>

使用现成的第三方插件

如果你不想自己写代码,可以在网上搜索“DedeCMS Excel导入插件”或“DedeCMS 批量导入工具”,有很多开发者已经制作了现成的插件,通常只需要下载、上传、安装即可使用。

优点

  • 即插即用,非常方便。
  • 通常带有图形化界面,操作简单。
  • 可能支持多种数据类型(文章、软件、商品等)。

缺点

  • 可能需要付费。
  • 代码质量参差不齐,可能存在安全风险。
  • 不一定兼容你的DedeCMS版本。

重要注意事项和最佳实践

  1. 数据备份:在进行任何批量导入操作前,务必备份数据库!一旦出错,可以快速恢复。
  2. 权限控制:导入功能非常强大,一定要设置好权限,只有管理员或指定角色的用户才能使用。
  3. 数据校验
    • 栏目ID:必须存在,否则文章会发布失败,可以在导入前先校验typeid
    • 用户ID:如果需要指定作者,要确保用户存在。
    • 图片路径:如果Excel中包含了图片路径(litpic),确保这些图片已经上传到服务器的相应目录,或者使用绝对URL。
  4. 性能考虑:如果导入数据量非常大(几千条以上),PHP可能会因为执行时间过长而超时,你可以在代码开头设置 set_time_limit(0); 来解除时间限制,或者分批导入。
  5. 日志记录:建议在导入过程中记录失败的日志,包括失败的原因和行号,方便后续排查和修正。
  6. 使用 PhpSpreadsheetPHPExcel 已经不再更新,推荐使用它的继任者 PhpSpreadsheet,安装方法通常是使用 Composer,但如果你不想用Composer,直接下载其发布包也是可以的,使用方法与PHPExcel非常相似。

希望这份详细的指南能帮助你成功实现DedeCMS的Excel数据导入功能!

-- 展开阅读全文 --
头像
织梦右键查看失效如何修复?
« 上一篇 01-04
c语言 sprintf 头文件
下一篇 » 01-04

相关文章

取消
微信二维码
支付宝二维码

目录[+]