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

核心思路
无论使用哪种方法,核心思路都是一致的:
- 读取Excel文件:使用PHP库(如
PHPExcel或其升级版PhpSpreadsheet)将Excel文件中的数据读取出来,转换成一个PHP数组。 - 数据处理:遍历这个数组,对每一行数据进行处理,检查数据是否为空、格式化日期、处理特殊字符等。
- 插入DedeCMS:根据数据类型(文章、栏目、软件等),调用DedeCMS相应的底层函数或直接操作数据库,将数据插入到系统中。
直接修改后台程序文件(最直接,但不推荐长期维护)
这种方法适合临时使用一次,或者对系统修改不介意的情况,我们以批量导入文章为例。
准备工作:
-
下载PHPExcel库:这是读取Excel文件的关键,从GitHub下载它:https://github.com/PHPOffice/PHPExcel
(图片来源网络,侵删) -
解压并上传:将下载的
PHPExcel文件夹解压,然后上传到你的DedeCMS网站的/include/目录下。 -
准备Excel模板:制作一个Excel文件,第一行必须是标题行,列名需要和DedeCMS文章表
dede_archives和dede_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标签。
操作步骤:
-
找到并打开文件: 登录DedeCMS后台,找到
dede/content_list.php文件,这个文件是文章列表管理页面,我们在这里添加一个上传按钮和处理逻辑。 -
修改
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> -
创建新的处理文件
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(); } ?> -
添加上传表单: 为了让
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,里面只包含文件上传表单和处理逻辑,这样更清晰。
制作一个独立的插件(推荐)
这是最规范、最易于维护和扩展的方法。
-
创建插件目录和文件: 在
/dede/templets/目录下创建一个新文件夹,excel_import。 在这个文件夹里创建两个文件:index.php(主页面,包含上传表单)import_do.php(处理逻辑)
-
编写
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> -
编写
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> -
在后台菜单中添加入口: 登录后台,找到“系统” -> “系统基本参数” -> “添加新变量”。
- 变量名称:
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版本。
重要注意事项和最佳实践
- 数据备份:在进行任何批量导入操作前,务必备份数据库!一旦出错,可以快速恢复。
- 权限控制:导入功能非常强大,一定要设置好权限,只有管理员或指定角色的用户才能使用。
- 数据校验:
- 栏目ID:必须存在,否则文章会发布失败,可以在导入前先校验
typeid。 - 用户ID:如果需要指定作者,要确保用户存在。
- 图片路径:如果Excel中包含了图片路径(
litpic),确保这些图片已经上传到服务器的相应目录,或者使用绝对URL。
- 栏目ID:必须存在,否则文章会发布失败,可以在导入前先校验
- 性能考虑:如果导入数据量非常大(几千条以上),PHP可能会因为执行时间过长而超时,你可以在代码开头设置
set_time_limit(0);来解除时间限制,或者分批导入。 - 日志记录:建议在导入过程中记录失败的日志,包括失败的原因和行号,方便后续排查和修正。
- 使用
PhpSpreadsheet:PHPExcel已经不再更新,推荐使用它的继任者PhpSpreadsheet,安装方法通常是使用 Composer,但如果你不想用Composer,直接下载其发布包也是可以的,使用方法与PHPExcel非常相似。
希望这份详细的指南能帮助你成功实现DedeCMS的Excel数据导入功能!
