栏目内容导出概述
织梦CMS的栏目内容导出功能允许将指定栏目下的文章数据批量导出为SQL、CSV、Excel、XML等格式,用于数据迁移、备份存档或数据分析。织梦CMS后台没有内置的导出功能,但可以通过编写PHP脚本轻松实现。
一、导出为CSV文件(Excel可打开)
<?php
require_once(dirname(__FILE__)."/include/common.inc.php");
$typeid=isset($_GET['typeid']) ? intval($_GET['typeid']) : 0;
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="articles_export.csv"');
// BOM头确保Excel正确识别UTF-8
echo "\xEF\xBB\xBF";
// CSV标题行
echo "ID,标题,栏目,发布时间,点击量,关键词,描述,内容\n";
$sql="SELECT a.id,a.title,a.pubdate,a.click,a.keywords,a.description,
ad.body,t.typename
FROM dede_archives a
LEFT JOIN dede_addonarticle ad ON a.id=ad.aid
LEFT JOIN dede_arctype t ON a.typeid=t.id
WHERE 1=1 ".($typeid>0?"AND a.typeid={$typeid}":"")."
ORDER BY a.id ASC";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row=$dsql->GetArray()){
$title=str_replace('"', '""', $row['title']);
$body=str_replace('"', '""', strip_tags($row['body']));
$pubdate=date('Y-m-d H:i:s', $row['pubdate']);
echo "\"{$row['id']}\",";
echo "\"{$title}\",";
echo "\"{$row['typename']}\",";
echo "\"{$pubdate}\",";
echo "\"{$row['click']}\",";
echo "\"{$row['keywords']}\",";
echo "\"{$row['description']}\",";
echo "\"{$body}\"\n";
}
?>
二、导出为SQL文件
<?php
// 导出指定栏目的完整SQL(适合迁移)
require_once(dirname(__FILE__)."/include/common.inc.php");
$typeid=3;
$filename="export_type_{$typeid}.sql";
header('Content-Type: text/plain; charset=utf-8');
header("Content-Disposition: attachment; filename={$filename}");
// 导出栏目结构
$type=$dsql->GetOne("SELECT * FROM dede_arctype WHERE id={$typeid}");
echo "-- 栏目数据\n";
echo "INSERT INTO dede_arctype VALUES(";
// 输出字段值...
echo ");\n\n";
// 导出文章数据
$sql="SELECT * FROM dede_archives WHERE typeid={$typeid}";
$dsql->SetQuery($sql);
$dsql->Execute();
echo "-- 文章数据\n";
while($row=$dsql->GetArray()){
$values=array_map(function($v) use ($dsql) {
return "'".$dsql->EscapeString($v)."'";
}, $row);
echo "INSERT INTO dede_archives VALUES(".implode(',',$values).");\n";
}
?>
三、导出为XML/RSS格式
<?php
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<articles>';
$sql="SELECT a.id,a.title,a.keywords,a.description,ad.body,t.typename
FROM dede_archives a
LEFT JOIN dede_addonarticle ad ON a.id=ad.aid
LEFT JOIN dede_arctype t ON a.typeid=t.id
WHERE a.typeid={$typeid}";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row=$dsql->GetArray()){
echo '<article>';
echo '<title><![CDATA['.$row['title'].']]></title>';
echo '<category>'.$row['typename'].'</category>';
echo '<description><![CDATA['.$row['description'].']]></description>';
echo '<content><![CDATA['.$row['body'].']]></content>';
echo '</article>';
}
echo '</articles>';
?>
四、压缩批量导出(含图片)
<?php
// 将栏目文章及关联图片打包为ZIP
$typeid=3;
$zip=new ZipArchive();
$zipname="export_type_{$typeid}_".date('Ymd').".zip";
if($zip->open($zipname, ZipArchive::CREATE)===TRUE){
// 导出文章数据为CSV
$csv=generateCSV($typeid);
$zip->addFromString("articles.csv", $csv);
// 导出栏目下的图片
$sql="SELECT litpic FROM dede_archives
WHERE typeid={$typeid} AND litpic !=''";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row=$dsql->GetArray()){
$imgPath=dirname(__FILE__).$row['litpic'];
if(file_exists($imgPath)){
$zip->addFile($imgPath, 'images/'.basename($row['litpic']));
}
}
$zip->close();
header('Content-Type: application/zip');
header("Content-Disposition: attachment; filename={$zipname}");
readfile($zipname);
unlink($zipname);
}
?>
导出建议:大批量数据导出时建议分批处理(每批500-1000条),避免PHP执行超时。在导出前设置
set_time_limit(0) 取消超时限制。对于包含大量图片的栏目,ZIP导出能确保数据完整性。