首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

Discuz! 导出数据CSV 格式文件的开发流程和注意事项

ARCHY 2015-7-7 [Discuz开发] 来自PC 复制链接
24188
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
在很多时候我们需要导出 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() 就不会输出结尾数据了。



上一篇:Discuz静态资源-远程附件、CSS和JS使用cdn加速的方法
下一篇:uid tid 等 id长度拓展 SQL 及生成工具
UC955 发表于 2015-7-8 12:14:47 来自PC
沙发,不要老逼我做沙发
我心依旧 发表于 2015-7-8 14:39:50 来自PC
强烈支持,站帮网有你更精彩
http://mminz.taobao.com/ 个人淘宝  网站收录目录http://shoulu.fenxiangshe.cn/ 分享社 http://fenxiangs
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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