关于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条评论

发表评论