在很多时候我们需要导出 excle 文件来作为数据的统计,但是由于导出 excle 文件需要外部类文件的支持,所以 CSV 文件就成为了我们最好的选择。
一般情况下导出 CSV 文件的流程为:
在 CSV 文件中两个单元格之内的东西用半角逗号隔开(,),程序中输出 \n 为换行。所以对于输出的文本,每行文本需要做一些过滤,将每行中的 \n \r\n \r 都替换掉,不然会造成版式混乱。另外,要注意输出的文本需要为 GBK 编码,不然会造成导出的文件有乱码。
一、 Discuz! 中导出活动数据解析
导出活动数据的代码在:source\module\forum\forum_misc.php 文件中
- } elseif($_G['gp_action'] == 'activityexport') {
复制代码
这个判断里面。导出部分如下。
- $filename = "activity_{$_G[tid]}.csv";
- include template('forum/activity_export');
- $csvstr = ob_get_contents();
- ob_end_clean();
- header('Content-Encoding: none');
- header('Content-Type: application/octet-stream');
- header('Content-Disposition: attachment; filename='.$filename);
- header('Pragma: no-cache');
- header('Expires: 0');
- if($_G['charset'] != 'gbk') {
- $csvstr = diconv($csvstr, $_G['charset'], 'GBK');
- }
- echo $csvstr;
复制代码 此处是将数据在 forum/activity_export 模板中,组织格式,然后再输出到 CSV。
二、后台导出用户
后台导出用户数据的部分在:source\admincp\admincp_members.php 中
- } elseif($operation == 'export') {
复制代码 判断下:
- $detail = "UID,".$lang['username'].",".$subject."\n".$detail;
- $filename = date('Ymd', TIMESTAMP).'.csv';
- ob_end_clean();
- header('Content-Encoding: none');
- header('Content-Type: application/octet-stream');
- header('Content-Disposition: attachment; filename='.$filename);
- header('Pragma: no-cache');
- header('Expires: 0');
- if($_G['charset'] != 'gbk') {
- $detail = diconv($detail, $_G['charset'], 'GBK');
- }
- echo $detail;
- exit();
复制代码 这里是将需要输出的数据在 $detail 中拼好,然后再输出出来。
三、在插件中导出数据需要的注意事项
在插件中导出需要注意由于在插件选项卡下,默认输出了 cpheader() 所以在输出之前需要 ob_end_clean(); 来清空之前的输出缓存,避免文件中带入了 html 头,同时由于 cpheader() 中将 cpfooter() 注册成为了结束函数,会自动在文件输出的末尾加上
为了避免出现这三行代码,需要在插件脚本中增加
- define('FOOTERDISABLED',1);
复制代码 这样 cpfooter() 就不会输出结尾数据了。
|