PHP
关于laravel学习--数据CSV导出
今天给大家介绍自己写的多数据导出的封装方法,体验一下多数据情况下导出的便利
数据导出有两种方式,一种是普通的表格导出,另一种是CSV,今天我给大家介绍的是另外一种导出方式,便是CSV方式导出,这种方式导出的好处是在数据量多的情况下,不易出现奔溃,可以进行上千万的数据导出,下面我便给大家介绍我自己封装的一个方法。
首页,我们在自己写的公共方法类中,封装我们自己编写的方法,这样我们便可以很方便的,随时随地的调用这个方法,代码如下:
/** * 导出数据基本方法(格式为cvs) * @param array $columnName (数据标题名称) * @param string $fileName (导出文件名称) * @param int $totalExportCount (要导出的数据总数) * @param int $preCount (每多少条数据循环一次) * @param $callback (回调函数) */ static function excelData($columnName = array(), $fileName = '', $totalExportCount = 0, $preCount = 10000, $callback) { //设置时间 set_time_limit(0); //设置头部 header('Content-Type: application/vnd.ms-excel;charset=utf-8'); header("Content-Disposition:filename=" . $fileName . ".csv"); // 打开PHP文件句柄,php://output 表示直接输出到浏览器 $fp = fopen('php://output', 'a'); // 将中文标题转换编码,否则乱码 foreach ($columnName as $i => $v) { $columnName[$i] = $v; } // 将标题名称通过fputcsv写到文件句柄 fputcsv($fp, $columnName); for ($i = 0; $i < intval($totalExportCount / $preCount) + 1; $i++) { $exportData = call_user_func_array(array($callback['className'], $callback['funcName']), array( 'pageNumber' => $i, 'pageSize' => $preCount, 'params' => $callback['params'] )); foreach ($exportData as $item) { $rows = array(); foreach ($item as $exportObj) { $rows[] = $exportObj; } fputcsv($fp, $rows); } // 将已经写到csv中的数据存储变量销毁,释放内存占用 unset($exportData); ob_flush(); flush(); } exit (); }
这里我们可以定义头部标题、数据量等等,默认是1000条,并且我们在外部调用的时候用到回调函数,这样便可以将数据源源不断的放入,而不是一次性的读取10000条数据,想想这样如果数据量大的话,对程序性能也不好是吧。下面我们便在外部进行调用,代码如下:
/** * 导出文章访问统计记录 */ static function excelStatisticArticle() { $fileName = 'statisticArticleRecord'; $columnName = array('ID', '博客ID', '博客名称', '访问IP', '访问者城市', '操作时间'); $where = array(); $totalExportCount = ManageStatisticArticle::getCount($where); self::excelData($columnName, $fileName, $totalExportCount, 10000, array( 'className' => __CLASS__, 'funcName' => 'excelStatisticArticleRecord', 'params' => $where )); }
这个便是我们的外部调用方法,其中excelStatisticArticleRecord方法是我们获取数据,组合数据的主要方法,而这里我们也是用到了回调函数进行不断的调用该方法,这样有利于程序的性能,下面是excelStatisticArticleRecord方法的代码:
/** * 获取导出文章访问统计记录数据 * @param int $number * @param int $PageSize * @param int $params * @return array */ static function excelStatisticArticleRecord($number = 0, $PageSize = 0, $params = 0) { $dataList = self::arObjects2Array(ManageStatisticArticle::getList($params, $order = array(), $PageSize)); $data = array(); foreach ($dataList as $key => $value) { //获取博客名称 $article = self::arObject2Array(ManageArticle::get($value['articleId'])); //重组数组 $data[$key] = array( 'id' => $value['id'], 'article_id ' => $value["articleId"], 'articleName' => $article["title"], 'ip' => $value['ip'], 'address' => $value['address'], 'createAt' => date("Y-m-d H:i:s", $value['createAt']), ); } return $data; }
这样我们便完成了该方法的调用已经回调获取数据,这样我们便可以成功通过CSV格式导出数据库数据。
这个方法关键在于导出函数封装,然后外部整理好导出头部标题,获取要导出数据总量、再整理一个获取数据的方法(通过分页获取有利于性能),然后通过回调函数,将这个3给作为参数传入,这样便可以成功实现该功能。
今天就为大家介绍到这里,如果觉得OK,请点赞支持下博主。
0条评论