Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Discuz! 中导出数据为 CSV 格式文件需要注意的事项。

[复制链接]
viswow 发表于 2011-6-29 10:08:10 | 显示全部楼层 |阅读模式
在很多时候我们需要导出 excle 文件来作为数据的统计,但是由于导出 excle 文件需要外部类文件的支持,所以 CSV 文件就成为了我们最好的选择。

一般情况下导出 CSV 文件的流程为:
  1. <?php
复制代码
在 CSV 文件中两个单元格之内的东西用半角逗号隔开(,),程序中输出 \n 为换行。所以对于输出的文本,每行文本需要做一些过滤,将每行中的 \n  \r\n \r 都替换掉,不然会造成版式混乱。另外,要注意输出的文本需要为 GBK 编码,不然会造成导出的文件有乱码。

一、 Discuz! 中导出活动数据解析

导出活动数据的代码在:source\module\forum\forum_misc.php 文件中
  1. } elseif($_G['gp_action'] == 'activityexport') {
复制代码


这个判断里面。导出部分如下。
  1. $filename = "activity_{$_G[tid]}.csv";

  2.         include template('forum/activity_export');
  3.         $csvstr = ob_get_contents();
  4.         ob_end_clean();
  5.         header('Content-Encoding: none');
  6.         header('Content-Type: application/octet-stream');
  7.         header('Content-Disposition: attachment; filename='.$filename);
  8.         header('Pragma: no-cache');
  9.         header('Expires: 0');
  10.         if($_G['charset'] != 'gbk') {
  11.                 $csvstr = diconv($csvstr, $_G['charset'], 'GBK');
  12.         }
  13.         echo $csvstr;
复制代码
此处是将数据在 forum/activity_export 模板中,组织格式,然后再输出到 CSV。

二、后台导出用户

后台导出用户数据的部分在:source\admincp\admincp_members.php 中
  1. } elseif($operation == 'export') {
复制代码
判断下:
  1. $detail = "UID,".$lang['username'].",".$subject."\n".$detail;
  2.         $filename = date('Ymd', TIMESTAMP).'.csv';

  3.         ob_end_clean();
  4.         header('Content-Encoding: none');
  5.         header('Content-Type: application/octet-stream');
  6.         header('Content-Disposition: attachment; filename='.$filename);
  7.         header('Pragma: no-cache');
  8.         header('Expires: 0');
  9.         if($_G['charset'] != 'gbk') {
  10.                 $detail = diconv($detail, $_G['charset'], 'GBK');
  11.         }
  12.         echo $detail;
  13.         exit();
复制代码
这里是将需要输出的数据在 $detail 中拼好,然后再输出出来。

三、在插件中导出数据需要的注意事项

在插件中导出需要注意由于在插件选项卡下,默认输出了 cpheader() 所以在输出之前需要 ob_end_clean(); 来清空之前的输出缓存,避免文件中带入了 html 头,同时由于 cpheader() 中将 cpfooter() 注册成为了结束函数,会自动在文件输出的末尾加上
  1. </div>
  2. </body>
  3. </html>
复制代码
为了避免出现这三行代码,需要在插件脚本中增加
  1. define('FOOTERDISABLED',1);
复制代码
这样 cpfooter() 就不会输出结尾数据了。


腐朽的木头 发表于 2011-6-29 10:11:16 | 显示全部楼层
收到 呵呵。。
回复

使用道具 举报

pcyi 发表于 2011-6-30 12:01:31 | 显示全部楼层
支持!
回复

使用道具 举报

yrf999 发表于 2011-9-2 11:55:02 | 显示全部楼层
utf8繁體版導出客戶出來的excel檔
全是亂碼
請問如何修護?
回复

使用道具 举报

邹意— 发表于 2011-9-27 15:15:52 | 显示全部楼层
支持下学习了
回复

使用道具 举报

dustheart 发表于 2011-10-26 11:38:20 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-22 00:24 , Processed in 0.024021 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表