【问题标题】:Exporting data from php to excel将数据从php导出到excel
【发布时间】:2012-07-23 07:33:58
【问题描述】:

我需要将 php 中的数据(从 mysql 数据库中检索到的数据)导出到 excel。我正在使用 Zend 框架。在导出到 Excel 之前,我需要对我的数据进行一些更改。实际上,我真正需要的是生成每月现金簿。

我已经阅读了很多文件,但最终还是一团糟。我真的不明白我应该如何开始。我真的需要梨吗?我需要下载任何类库吗?没有简单的方法吗?

提前致谢

【问题讨论】:

  • 我建议导出为 CSV,它本质上是一个基于文本的文件,因此非常易于管理。
  • 根据您的要求,CSV 文件可能就足够了,就这么简单!
  • 实际上你需要使用一个库来做到这一点。当然,它在某种程度上适用于 csv,但是..对于更详细的 xls 文件(带有标准化列...... int、float 等),使用库更容易

标签: php export-to-excel


【解决方案1】:

我建议您使用出色的 PHPExcel 库。真的很强大,支持多种格式,可以做可视化格式,好用。

您可以在他们的网页上找到更多相关信息: http://phpexcel.codeplex.com/PHPExcel 已经搬到https://github.com/PHPOffice/PHPExcel

2019:

PHPExcel 现在已被PhpSpreadsheet GitHub 取代 .

使用示例:

    $objPHPExcel = new PHPExcel();
    /** You can set many properties */
    $objPHPExcel->getProperties()->setCreator("My company")
                 ->setLastModifiedBy("John Doe")
                 ->setTitle("Annual report")
                 ->setSubject("Sales")
                 ->setDescription("Annual sales report by John Doe")
                 ->setCategory("Finance");

    /** Choose one of sheets */
    $activeSheet = $objPHPExcel->setActiveSheetIndex(0);
    /** Simply set value of cell */
    $activeSheet->setCellValue("A1", 'plural');

当然,您可以做更多事情,阅读 excel 文件、设置视觉样式、创建绘图、表达式等等。

【讨论】:

  • 是的,当然。它适用于任何框架。你只需要 php,它应该可以工作。
  • 请注意,所有出色的选项和格式都是有代价的。内存使用效率很低,处理大文件很慢并且可能会耗尽内存!非常适合较小的文件。
  • GitHub 上也提供了相同的库,它似乎是最新的。它还包括一个composer.json 文件,如果你喜欢这种东西的话。 github.com/PHPOffice/PHPExcel
【解决方案2】:

我写了一个 94 行的库存差异报告,其中我从 MySQL 中获取数据(每个表 6k+ 记录),从从多个表中提取的 MySQL 数据创建一个多维数组,然后将所有内容转储到一个字符串中并生成一个 .xls因此:

<?php
////////////////////////////////// BEGIN SETUP
    $filename ="document_name.xls";
    header('Content-type: application/ms-excel');
    header('Content-Disposition: attachment; filename='.$filename);
////////////////////////////////// END SETUP
////////////////////////////////// BEGIN GATHER
    // Your MySQL queries, fopens, et cetera go here.
    // Cells are delimited by \t
    // \n is just like you might expect; new line/row below
    // E.G:
    $stuff="PART\tQTY\tVALUE\t\n";
    $stuff=$stuff."01-001-0001\t37\t28.76\t\n";
    $stuff=$stuff."01-001-0002\t6\t347.06\t\n";
    $stuff=$stuff."01-001-0003\t12\t7.11\t\n";
////////////////////////////////// END GATHER
// The point is to get all of your data into one string and then:
////////////////////////////////// BEGIN DUMP
    echo $stuff;
////////////////////////////////// END DUMP
?>

无需扩展。

唯一需要注意的是,我还没有弄清楚如何在 Excel 不告诉我数据可能已损坏的情况下吐出 .xls - 而且我没有尝试进行任何格式化或任何比简单的“导出”更复杂的事情“ 数据。文件/数据当然没问题,但它确实会从 Excel 生成警告。

编辑:我应该注意“设置”和“转储”来自以下内容:daniweb.com

【讨论】:

  • 这不是 Excel,而是带有虚假 MIME 类型的 CSV。
【解决方案3】:

您可以使用phpexcel 库。它允许您写入和读取不同的电子表格文件格式

对于与zend的集成,您可以通过关注link获得帮助。

【讨论】:

    【解决方案4】:

    您可以使用 CSV 为 Excel 制作可导入的格式。这是最简单的方法。

    CSV 看起来像这样:

    "my first cellcontent", "my second cell content", "my third cell content"
    "second line, first cell content", "etc", "etc
    

    每一行代表一个 Excel 行,您将单元格内容放在双引号之间,并用逗号分隔。 如果您的数据中有一些内容,请注意\r\n,它可能会破坏您的 CSV 并创建不需要的新行。

    【讨论】:

      【解决方案5】:

      用一点谷歌你会发现这个:http://www.the-art-of-web.com/php/dataexport/

      准备数据

      $data = array(
          array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
          array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
          array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
          array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
          array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
          array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
          array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
      );
      

      第一步是以制表符分隔的格式输出数据(也可以使用 CSV,但稍微复杂一些)。为此,我们使用以下代码:

      <?php
          header("Content-Type: text/plain");
      
          $flag = false;
          foreach( $data as $row ) {
              if( !$flag ) {
              // display field/column names as first row
              echo implode( "\t", array_keys( $row ) ) . "\r\n";
              $flag = true;
          }
          echo implode( "\t", array_values( $row ) ) . "\r\n";
      }
      exit;
      
      ?>
      

      我们将内容类型设置为 text/plain 以便可以更轻松地在浏览器中查看输出。否则,由于没有 HTML 格式,输出将显示为单行文本。

      输出的第一行将是列标题(在这种情况下使用字段名称)。值用制表符 \t 分隔,行用换行符 \n 分隔。输出应如下所示:

      firstname  lastname  age
      Mary Johnson 25 
      Amanda Miller 18 
      James Brown 31 
      Patricia    Williams     7 
      Michael Davis 43 
      Sarah Miller 24 
      Patrick Miller 27
      

      此代码中已经存在一个可能不会立即明显的弱点。如果要输出的字段之一已经包含一个或多个制表符,或者更糟的是一个换行符怎么办?因为我们依赖这些字符来指示分列和换行,所以这将抛弃整个过程。

      解决方案是“转义”制表符。在这种情况下,我们将用文字 \t 替换制表符,用文字 \n 替换换行符,这样它们就不会影响格式:

      <?php
          function cleanData( &$str ) {
              $str = preg_replace( "/\t/", "\\t", $str );
              $str = preg_replace("/\r?\n/", "\\n", $str);
          }
      
          header("Content-Type: text/plain");
          $flag = false;
          foreach( $data as $row ) {
              if( !$flag ) {
                  // display field/column names as first row
                  echo implode( "\t", array_keys( $row ) ) . "\r\n";
                  $flag = true;
              }
              array_walk( $row, 'cleanData' );
              echo implode( "\t", array_values( $row ) ) . "\r\n";
          }
          exit;
      
      ?>
      

      现在,在回显每一行之前,所有制表符都被替换为“\t”,这样我们的列就不会被打断。此外,数据中的任何换行符都将替换为“\n”。

      【讨论】:

      • 这不是excel。这是一个制表符分隔的文件。
      • 我喜欢这个简单的解决方案,当你只想导出简单的数据时不需要庞大的库
      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2013-10-25
      • 2020-01-27
      • 2018-06-27
      • 2013-02-26
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多