PHP语言 导出CSV抽象类
小标 2018-07-12 来源 : 阅读 927 评论 0

摘要:本文主要向大家介绍了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频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程