织梦cms栏目内容导出

栏目内容导出概述

织梦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导出能确保数据完整性。