PHP之导出CSV文件
序言
Q1:什么是csv文件?
A1:csv即 comma-separated values ,逗号分隔值。是一种通用的相对简单地文件格式,目前被较为广泛的使用。其最广泛的应用就是用来转移表数据。
“CSV”并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:
1.纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
2.由记录组成(典型的是每行一条记录);
3.每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
4.每条记录都有同样的字段序列
Q2:什么是BOM?
A2:BOM即为Byte Order Mark,字节顺序标记(详见百度百科)。在Windows自带的记事本等软件,当其在保存一个utf-8格式编码的文件时,就会默认在文件头加上三个不看见的字符(0xEF 0xBB 0xBF),来确保自身再次打开时,可以以utf-8格式来打开文件,从而杜绝乱码现象。在一般情况下来说,这并不会有什么大的麻烦,但是,对于本文的导出csv中,若导出数据为utf-8编码格式的,当导出的csv文件在windows系统打开时(尤其是用excel)打开时,就会出现乱码情况。所以,为了杜绝出现此类情况,请在导出到csv文件时,记得在文件的最头部加上BOM头,从而使得你导出的csv文件可以正确显示。
正文:
下面,分享一下如何使用PHP导出csv文件。
大体思路是这样子的:由于csv文件是一种由逗号分隔字段的文件格式,所以,我们可以将准备导入的字段用逗号 “,” 隔开,在每一行的尾部加上”\r\n”。
此外还有一点需要注意的地方,那就是文件的BOM头,如果忽略了BOM头的话,你以UTF-8编码形式输出的csv文件在windows中打开很可能会是一堆乱码。该如何解决这个问题呢?一是运用转码函数iconv,将utf-8格式的字符串转换为gb2312格式的,这样在Windows下打开就不会乱码了,还有另外的一个思路就是在文件的开头加上BOM信息头,这样当在windows系统下打开这个文件时,系统就会得知这个文件的编码格式,从而避免了乱码输出的情况。
而对于Csv文件的导出,经博主查看了各路大神的分享之后,对于csv文件的导出总结了大概这两种方法:
方法一,直接以echo的形式直接输出:

/*按csv文件的标准生成字符串,为了避免乱码,该方法使用了将utf-8格式的字符串转换为gb2312的方法
*@param
*$content=array(
* 'fields' => array(
* 'field1' => '字段1',
* 'field2' => '字段2',
* ......
*
* ),
* 'data' => array(
* 0 =>array(
* 'field1' => 'val01',
* 'field2' => 'val02',
* ......
* ),
* 1 =>array(
* 'field1' => 'val11',
* 'field2' => 'val12',
* ......
* ),
* ......
* ),
*
*);
*生成csv表样式为:
* 字段1 字段2 字段3 字段4 ......
* val01 val02 val03 val04 ......
* val11 val12 val13 val14 ......
* .......
*/
public function csvGenerator($content)
{ $str = '';//csv内容所保存的字符串
foreach ($content['fields'] as $val) {
$str .= (iconv('utf-8', 'gb2312', $val) . ",");//设置表头 将表头依次设置为字段1、字段2... }
$str .= "\r\n";
foreach ($content['data'] as $kkk => $row) {
foreach ($content['fields'] as $k => $v) {
$row[$k] = str_replace('"', '""', $row[$k]);
$str .= (iconv('utf-8', 'gb2312', $row[$k]) . ",");
}
$str = substr($str, 0, -1);//去掉每行最后一个逗号;
$str .= "\r\n";
} return $str; //
}


/**导出csv文件(csv文件下载)直接echo的方法:
*@param $filename
* 输出csv文件的文件名
* @param $data
* 要写入csv文件的内容,即经过csvGenerator处理过的字符串;
*/
function csvExport($filename='export.csv',$data){ header("Content-type:application/csv");
header("Content-Disposition:attachment;filename=".$filename);
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header('Expires:0');
header('Pragma:');
echo $data;
return true; }

方法二,以文件的形式输出:

/*按csv文件的标准生成字符串,这里并未对编码方式进行处理,而是采用了在文件头加BOM的方式,详见csvExportWithBOM函数
*@param
*$content=array(
* 'fields' => array(
* 'field1' => '字段1',
* 'field2' => '字段2',
* ......
*
* ),
* 'data' => array(
* 0 =>array(
* 'field1' => 'val01',
* 'field2' => 'val02',
* ......
* ),
* 1 =>array(
* 'field1' => 'val11',
* 'field2' => 'val12',
* ......
* ),
* ......
* ),
*
*);
*生成csv表样式为:
* 字段1 字段2 字段3 字段4 ......
* val01 val02 val03 val04 ......
* val11 val12 val13 val14 ......
* .......
*/
public function csvGenerator($content)
{ $str = '';//csv内容所保存的字符串
foreach ($content['fields'] as $val) {
$str .= ($val . ",");//设置表头 将表头依次设置为字段1、字段2... }
$str .= "\r\n";
foreach ($content['data'] as $kkk => $row) {
foreach ($content['fields'] as $k => $v) {
$row[$k] = str_replace('"', '""', $row[$k]);
$str .= ($row[$k] . ",");
}
$str = substr($str, 0, -1);//去掉每行最后一个逗号;
$str .= "\r\n";
} return $str;
}

输出csv文件

/**@param $filename
* 输出csv文件的文件名
* @param $data
* 要写入csv文件的内容,即经过csvGenerator处理过的字符串;
*/
public function csvExportWithBOM($filename='export.csv', $data)
{
$f=fopen("php://memory",'w');
fwrite($f, chr(0xEF).chr(0xBB).chr(0xBF).$data);//加入BOM头
fseek($f,0);
header('Content-Type: application/csv');
// 告知浏览器想要输出的是一个文件
header('Content-Disposition: attachment; filename="'.$filename.'";');
// make php send the generated csv lines to the browser
fpassthru($f); }

后记
如果要导出的字段值中会出现",",那么务必在生成字符串的时候将英文逗号转为中文逗号,否则该字段值将被分到两个相邻的单元格,从而出现显示错误,另外,如果字段中出现了引号,那么请务必将引号如上例程序中的那样替换掉~
谢谢您的耐心阅读~
PHP之导出CSV文件的更多相关文章
- 导出csv文件示例
导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...
- mysql SQLyog导入导出csv文件
1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 ...
- PHP 读取/导出 CSV文件
工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...
- Web 端 js 导出csv文件(使用a标签)
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- PHP导出CSV文件出现乱码的解决方法
在做项目时碰到使用外语的情况下,我们就会使用UTF-8编码.但是,在用PHP导出CSV文件时,如果写入的数据是使用UTF-8编码的日语.韩语之类的外文,就会出现乱码. 要解决PHP生成CSV文件的乱码 ...
- [转]PL/SQL Developer 导入导出csv文件
PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡, ...
- 导出csv文件数字会自动变科学计数法的解决方法
其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0.解决 ...
- web前端导出csv文件
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- 转:导出csv文件数字会自动变科学计数法的解决方法
导出csv文件数字会自动变科学计数法的解决方法 其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科 ...
- thinkphp导出csv文件,用表格输出excel
1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...
随机推荐
- Nginx https服务器证书安装步骤
本文档指导您如何在 Nginx 服务器中安装 SSL 证书. 说明: 本文档以证书名称 www.domain.com 为例. Nginx 版本以 nginx/1.16.0 为例. 当前服务器的操作系统 ...
- 20190908 On Java8 第十九章 类型信息
第十九章 类型信息 RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息. Java 主要有两种方式在运行时识别对象和类信息: "传 ...
- RocketMQ安装部署及整合Springboot
消息中间件的功能: 通过学习ActiveMq,kafka,rabbitMq这些消息中间件,我们大致能为消息中间件的功能做一下以下定义:可以先从基本的需求开始思考 最基本的是要能支持消息的发送和接收,需 ...
- new String创建了几个对象
String str = new String(“abc”) 到底创建了几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String(& ...
- HDFS基本概念
概念 HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色. 注意:HDFS的设计适合一次写入,多次读出的场景 ...
- win32 socket 编程(三)——TCP/IP
一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...
- DAG
DAG的生成 DAG(Directed Acyclic Graph) 叫做有向无环图,原始的RDD通过一系列的转换就形成了DAG,根据RDD之间的依赖关系的不同将DAG划分成不同的Stage,对于窄依 ...
- ReactiveCocoa 之 优雅的 RACCommand
RACCommand 是一个在 ReactiveCocoa 中比较复杂的类,大多数使用 ReactiveCocoa 的人,尤其是初学者并不会经常使用它. 在很多情况下,虽然使用 RACSignal 和 ...
- layui在当前页面弹出一个iframe层,并改变这个iframe层里的一些内容
layer.open({ type: 2, title: "专家信息", area: ['100%', '100%'], content: '/ZhuanJiaKu/AddZhua ...
- md5sum 计算和校验文件的md5值
1. 命令功能 md5算法一般用于检查文件完整性, 2. 语法格式 md5sum [option] [file] 参数 参数说明 -b 以二进制模式读入文件 -t 以文本模式读入文件 -c 用来从 ...