摘要:本文主要向大家介绍了PHP语言 导出CSV抽象类,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。
本文主要向大家介绍了PHP语言 导出CSV抽象类,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。
php 导出CSV抽象类,根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。
ExportCSV.class.php
[php] view plain copy
1. <?php
2. /** php Export CSV abstract class,根据总记录数与每批次记录数,计算总批次,循环导出。
3. * Date: 2014-05-16
4. * Author: fdipzone
5. * Ver: 1.0
6. *
7. * Func:
8. * public setPageSize 设置每批次导出的记录条数
9. * public setExportName 设置导出的文件名
10. * public setSeparator 设置分隔符
11. * public setDelimiter 设置定界符
12. * public export 执行导出
13. * private getPageCount 计算导出总批次
14. * private setHeader 设置导出文件header
15. * private formatCSV 将数据格式化为csv格式
16. * private escape 转义字符串
17. * abstract getExportTotal 获取总记录条数,抽象方法,需继承类实现
18. * abstract getExportFields 获取导出的列名,抽象方法,需继承类实现
19. * abstract getExportData 获取每页记录,抽象方法,需继承类实现
20. */
21.
22. abstract class ExportCSV{ // class start
23.
24. // 定义子类必须要实现的方法
25.
26. /** 获取总记录条数
27. * @return int
28. */
29. abstract protected function getExportTotal();
30.
31. /** 获取导出的列名
32. * @return Array
33. */
34. abstract protected function getExportFields();
35.
36. /** 获取每批次数据
37. * @param int $offset 偏移量
38. * @param int $limit 获取的记录条数
39. * @return Array
40. */
41. abstract protected function getExportData($offset, $limit);
42.
43.
44. // 定义类属性
45. protected $total = 0; // 总记录数
46. protected $pagesize = 500; // 每批次导出的记录数
47. protected $exportName = 'export.csv'; // 导出的文件名
48. protected $separator = ','; // 设置分隔符
49. protected $delimiter = '"'; // 设置定界符
50.
51.
52. /** 设置每次导出的记录条数
53. * @param int $pagesize 每次导出的记录条数
54. */
55. public function setPageSize($pagesize=0){
56. if(is_numeric($pagesize) && $pagesize>0){
57. $this->pagesize = $pagesize;
58. }
59. }
60.
61.
62. /** 设置导出的文件名
63. * @param String $filename 导出的文件名
64. */
65. public function setExportName($filename){
66. if($filename!=''){
67. $this->exportName = $filename;
68. }
69. }
70.
71.
72. /** 设置分隔符
73. * @param String $separator 分隔符
74. */
75. public function setSeparator($separator){
76. if($separator!=''){
77. $this->separator = $separator;
78. }
79. }
80.
81.
82. /** 设置定界符
83. * @param String $delimiter 定界符
84. */
85. public function setDelimiter($delimiter){
86. if($delimiter!=''){
87. $this->delimiter = $delimiter;
88. }
89. }
90.
91.
92. /** 导出csv */
93. public function export(){
94.
95. // 获取总记录数
96. $this->total = $this->getExportTotal();
97.
98. // 没有记录
99. if(!$this->total){
100. return false;
101. }
102.
103. // 计算导出总批次
104. $pagecount = $this->getPageCount();
105.
106. // 获取导出的列名
107. $fields = $this->getExportFields();
108.
109. // 设置导出文件header
110. $this->setHeader();
111.
112. // 循环导出
113. for($i=0; $i<$pagecount; $i++){
114.
115. $exportData = '';
116.
117. if($i==0){ // 第一条记录前先导出列名
118. $exportData .= $this->formatCSV($fields);
119. }
120.
121. // 设置偏移值
122. $offset = $i*$this->pagesize;
123.
124. // 获取每页数据
125. $data = $this->getExportData($offset, $this->pagesize);
126.
127. // 将每页数据转换为csv格式
128. if($data){
129. foreach($data as $row){
130. $exportData .= $this->formatCSV($row);
131. }
132. }
133.
134. // 导出数据
135. echo $exportData;
136. }
137.
138. }
139.
140.
141. /** 计算总批次 */
142. private function getPageCount(){
143. $pagecount = (int)(($this->total-1)/$this->pagesize)+1;
144. return $pagecount;
145. }
146.
147.
148. /** 设置导出文件header */
149. private function setHeader(){
150. header('content-type:application/x-msexcel');
151.
152. $ua = $_SERVER['HTTP_USER_AGENT'];
153.
154. if(preg_match("/MSIE/", $ua)){
155. header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');
156. }elseif(preg_match("/Firefox/", $ua)){
157. header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');
158. }else{
159. header('content-disposition:attachment; filename="'.$this->exportName.'"');
160. }
161.
162. ob_end_flush();
163. ob_implicit_flush(true);
164. }
165.
166.
167. /** 格式化为csv格式数据
168. * @param Array $data 要转换为csv格式的数组
169. */
170. private function formatCSV($data=array()){
171. // 对数组每个元素进行转义
172. $data = array_map(array($this,'escape'), $data);
173. return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n";
174. }
175.
176.
177. /** 转义字符串
178. * @param String $str
179. * @return String
180. */
181. private function escape($str){
182. return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str);
183. }
184.
185. } // class end
186.
187. ?>
demo
[php] view plain copy
1. <?php
2.
3. // ExportCSV abstract class
4. require "ExportCSV.class.php";
5.
6. // 定义继承类
7. class myexport extends ExportCSV{
8.
9. // 要导出的数据,实际情况会从db读取
10. protected $data = array(
11. array('1','傲雪星枫"','男'),
12. array('2','傲雪星枫","','男'),
13. array('3','傲雪星枫","','男'),
14. array('4',"傲雪星枫\"\"\r\n换行",'男'),
15. array('5','傲雪星枫,,','男'),
16. array('6','傲雪星枫"','男'),
17. array('7','傲雪星枫','男'),
18. array('8','傲雪星枫','男'),
19. array('9','傲雪星枫','男'),
20. array('10','傲雪星枫','男')
21. );
22.
23. /* 返回总导出记录数
24. * @return int
25. */
26. protected function getExportTotal(){
27. return count($this->data);
28. }
29.
30. /** 返回导出的列名
31. * @return Array
32. */
33. protected function getExportFields(){
34. $title = array('id','name','gender');
35. return $title;
36. }
37.
38. /* 返回每批次的记录
39. * @param int $offset 偏移量
40. * @param int $limit 获取的记录条数
41. * @return Array
42. */
43. protected function getExportData($offset, $limit){
44. return array_slice($this->data, $offset, $limit);
45. }
46.
47. }
48.
49. // 导出
50. $obj = new myexport();
51. $obj->setPageSize(1);
52. $obj->setExportName('myexport.csv');
53. $obj->setSeparator(',');
54. $obj->setDelimiter('"');
55. $obj->export();
56.
57. ?>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号