在做导出一个信息表为excel文件这个功能完成之后,自己用得好好的,但是到HR那边就告诉我导出的文件无法用她电脑上的office打开,心想,兼容没做好,想问下她的版本号,结果半天没回复消息。

我老大来了句:转csv文件吧,没有兼容性的说法。

然后开始折腾csv,在这之前我只是见过“导出csv文件”的字样,没有涉及过这个。

当然一开始要去了解一下csv是什么: https://baike.baidu.com/item/CSV/10739。

先附上代码:

public function exportCSVAction()
{
$id = (int)$this->_req->getParam('cid',0);
$reg = new RegistrationModel();
$studentsArr = $reg->getStudents($id); // 获取课程及报名学员信息 $fileName = $studentsArr['info']['title']; //这里定义表名。简单点的就直接 $fileName = time(); header('Content-Type: application/vnd.ms-excel'); //header设置
header("Content-Disposition: attachment;filename=".$fileName.".csv");
header('Cache-Control: max-age=0'); $fp = fopen('php://output','a'); //打开php文件句柄,php://output表示直接输出到PHP缓存,a表示将输出的内容追加到文件末尾 $head = array('工号','部门名','岗位名','学员名','报名时间','状态','课程建议'); //表头信息
foreach($head as $k=>$v){
$head[$k] = iconv("UTF-8","GBK//IGNORE",$v); //将utf-8编码转为gbk。理由是: Excel 以 ANSI 格式打开,不会做编码识别。如果直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码。
}
fputcsv($fp,$head); //fputcsv() 函数将行格式$head化为 CSV 并写入一个打开的文件$fp。 // if (!empty($studentsArr['students'])) {
$data = []; //要导出的数据的顺序与表头一致;提前将最后的值准备好(比如:时间戳转为日期等)
foreach ($studentsArr['students'] as $key => $val) {
$data['empno'] = "xm-".$val['empno'];
$data['dept'] = $val['dept_name'].'-'.$val['job_name'];
$data['post'] = $val['post'];
$data['username'] = $val['username'];
$data['create_time'] = " ".date('Y-m-d H:i', $val['create_time']); //excel对大数字会自动转科学计数法表示,所以这里加个“”空格是将数字转字符串,这个有多种方式,具体怎么方便怎么来。 switch ($val['status']) {
case 0:
$data['status'] = '请假';
break;
case 1:
$data['status'] = '正常';
break;
case 2:
$data['status'] = '已取消';
break;
case 3:
$data['status'] = '缺席';
break;
}
$data['advices'] = $val['advices']; foreach($data as $i=> $item){ //$item为一维数组哦
$data[$i] = iconv("UTF-8","GBK//IGNORE",$item); //转为gbk的时候可能会遇到特殊字符‘-’之类的会报错,加 ignore表示这个特殊字符直接忽略不做转换。
}
fputcsv($fp,$data);
}
exit; //记得加这个,不然会跳转到某个页面。
// } }

过程中遇到知识点:

*    iconv的使用:http://php.net/manual/zh/function.iconv.php;
* fputcsv的使用:http://php.net/manual/zh/function.fputcsv.php。

注意点:

  1. 页面导出按钮应该直接使用url地址跳转的方式,如果使用ajax跳转到导出方法会无法导出文件,并返回一堆乱码的数据。

    这是因为ajax请求需要有返回数据,返回数据就会带有自己的请求头部,会与下载文件头部冲突掉,导致文件无法下载。

  2. 我这里的工号其实有存在前面的数字为0的情况(比如:0123、0001),导出的文件用excel打开后就变成123、1 啦,这明显不合我的要求。

    解决方式是在要处理的字段前加个转义符‘`’(英文输入法下的tab键上方的键),据说微信导数据是这样处理的。

    我的解决方式是:因为是公司工号,我加了公司前缀,比如: c_0123;

PHP实现导出CSV文件的更多相关文章

  1. 导出csv文件示例

    导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...

  2. mysql SQLyog导入导出csv文件

    1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 ...

  3. PHP 读取/导出 CSV文件

    工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...

  4. Web 端 js 导出csv文件(使用a标签)

    前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...

  5. PHP导出CSV文件出现乱码的解决方法

    在做项目时碰到使用外语的情况下,我们就会使用UTF-8编码.但是,在用PHP导出CSV文件时,如果写入的数据是使用UTF-8编码的日语.韩语之类的外文,就会出现乱码. 要解决PHP生成CSV文件的乱码 ...

  6. [转]PL/SQL Developer 导入导出csv文件

    PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡, ...

  7. 导出csv文件数字会自动变科学计数法的解决方法

    其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0.解决 ...

  8. web前端导出csv文件

    前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...

  9. 转:导出csv文件数字会自动变科学计数法的解决方法

    导出csv文件数字会自动变科学计数法的解决方法   其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科 ...

  10. thinkphp导出csv文件,用表格输出excel

    1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...

随机推荐

  1. Linux 文件、目录操作

    Linux中的路径只能使用/,不能使用\ 或\\. cd   切换目录 cd  /    切换到系统根目录,cd即change dir cd  /bin  切换到根目录下的bin目录 cd  ..  ...

  2. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...

  3. Ubuntu-Server18.04开启无线网卡并配置静态ip

    手里有一个笔记本快10年了,还是奔腾处理器,最近把它做成了Ubuntu-Server的系统,花了点时间折腾无线网卡,稍微记录一下,希望看见的人能少踩点坑. 1. 制作U盘启动工具,从Ubuntu官网下 ...

  4. 论AMD内核如何使用Android Studio虚拟机

    其实之前和老师求证过AMD内核要用虚拟机的话应求助第三方模拟器(不然速度太慢)或直接使用真机测试,当时拿着虚拟机的报错简单搜索了下只翻到了一个用谷歌第三方工具的(检索时关键词不对的锅),觉得麻烦就没去 ...

  5. List集合去重各种方式汇总

    package com.sb.test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java. ...

  6. 数据库自学笔记(2)--- HAVING和WHERE, ANY 和 ALL,IN和EXIST。

    1.HAVING和WHERE: WHERE 和 HAVING 的作用对象不一样.WHERE作用于基本表或视图,挑出满足条件的元组.HAVING作用于组(group),一般配合GROUP BY 使用. ...

  7. IDEA创建mybatisDemo,并实现简单的CRUD

    Mybatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.在Java或者Java Web项目中,添加Mybatis必须的核心包,就能对数据表进行增删改查操作了.下面以MySQL数据库o ...

  8. [CF1311C] Perform the Combo

    Solution 前缀和搞一下即可 #include <bits/stdc++.h> using namespace std; #define int long long const in ...

  9. MySQL int、char、varchar 最大值是多少?

    1.int(len) (1)max(len) = 255 (2)存储范围: 带符号整数:-2147483648-2147483647. 无符号(unsigned)整数:0-4294967295. 2. ...

  10. grid 布局(2)

    目录 grid 布局(2) grid区域属性 网格线名称 grid-template-areas 属性 grid-auto-flow 容器内子元素的属性 grid 布局(2) grid区域属性 网格线 ...