序言

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文件的更多相关文章

  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. gitlab上传代码及报错总结

    将目录变成git可管理的仓库 git init 将文件添加到暂存区中 git add README.md 将文件提交到仓库 git commit -m "fisrt commit" ...

  2. Echats

    网址:https://www.echartsjs.com 1.特性 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  3. STL关联式容器之set\map ----以STL源码为例

    关联式容器的特征:所用元素都会根据元素的键值自动被排序. set STL 中的关联式容器低层数据结构为红黑树,其功能都是调用低层数据结构中提供的相应接口. set元的元素不会像map那样同时拥有键(k ...

  4. JAVA总结--正则表达式

    正则表达式定义: pattern 对象是一个正则表达式的编译表示.Matcher 对象是对输入字符串进行解释和匹配操作的引擎.PatternSyntaxException 是一个非强制异常类,它表示一 ...

  5. HDFS中NameNode和Secondary NameNode工作机制

    NameNode工作机制 0)启动概述 Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作.一旦在内存中成功建立文件系统元数据的映像,则创建一个 ...

  6. 厉害了,Apache架构师们遵循的 30 条设计原则

    作者:Srinath 翻译:贺卓凡,来源:公众号ImportSource Srinath通过不懈的努力最终总结出了30条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构师团队或 ...

  7. 第九届蓝桥杯A组第三题: 乘积尾零

    标题:乘积尾零如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6 ...

  8. 08-js流程控制、循环、元素操作

    # js流程控制 > 流程控制用于基于不同的条件来执行不同的动作. ### if语句 >if... else ... >if ... else if ... else... > ...

  9. JavaScript异步的底层原理

    JavaScript引擎属于单线程作业,意味着:在同一时间只能执行一个代码块,这些代码块的执行就阻塞了异步事件的处理. 因此,出现了"任务队列"(task queue),我们可以将 ...

  10. javascript Math取整&获取随机数

    1.方法介绍 Math.ceil(n) 上取整,大于等于n返回与它最接近的整数 Math.floor(n) 下取整,小于等于n返回与它最接近的整数 Math.round(n) 四舍五入取整 Math. ...