【问题标题】:Export mySQL to excel or csv将 mySQL 导出到 excel 或 csv
【发布时间】:2010-11-01 21:41:24
【问题描述】:

我不是 php 专家(只是初学者)但需要一些帮助!

在 Google 搜索了几个小时并尝试了大约 100 种不同的脚本后,我终于找到了一个可以满足我需要的脚本 - 几乎。

基本上,我的网站有一个标记为“导出到 Excel”的按钮。网站访问者点击按钮,下载开始包含指定表中的所有数据。

我在这里找到了这个 - PHP code to convert a MySQL query to CSV

这正是我想要的,除了用户在尝试打开文件时看到以下错误:

错误 - '您尝试打开的文件 'export.xls' 的格式与文件扩展名指定的格式不同。在打开文件之前验证文件没有损坏并且来自受信任的来源。你现在要打开文件吗?'

用户单击“是”并打开包含所有数据的文件!杰出的!除非用户不会打开出现此错误的文件。

如果有人知道解决此问题的方法,我将不胜感激。

非常感谢

TT

【问题讨论】:

  • 您的用户使用的是 Office 2007 吗?你试过 header("ContentType: application/vnd.ms-excel") 吗??
  • @TheTub 查看stackoverflow.com/questions/976483/… 以获取另一个处理同样问题的线程。
  • - 是的,标题已经说明了内容类型。

标签: php mysql excel


【解决方案1】:

或者,您可以更改上述解决方案中的脚本以返回扩展名为 .csv 的文件。 .csv 文件与 Excel 相关联,因此应直接打开。

【讨论】:

  • 嗨 Jeff - 这可以工作并消除错误消息,但文件现在将表中的数据(我键入时有 9 列和大约 90 行)拆分为不均匀的块。一个字段是 3000 个字符,它似乎根本不喜欢这个字段。如果导出为 .xls,那么至少数据以可以使用的表格格式保存。
  • 最有可能的是,您在数据字段中名义上遇到了一些破坏其 CSV 特性的东西。 IOW,以下行不会像您直觉认为的那样工作:name, ssn,birthDate Blow, Joe, 123-45-6789, 2009-09-30 简而言之,如果您的数据字段有逗号,您需要查看您的导出脚本以使用限定符(如双引号)包装这些字段。我几乎每天都在努力将脏数据转换为 CSV 格式。您需要查看原始 CSV(在记事本中),并像解析器一样思考。
  • 我不认为是文件的布局有问题,否则命名为.xls时不起作用。如果在命名为 .xls 时它可以工作,请尝试 .txt - Excel 在读取文件时可能使用的不是 CSV 解析器。
  • 是的 - 我刚刚查看了另一页上的代码,它实际上是制表符分隔的,而不是 CSV。如果.txt不起作用,您可以将代码中的“\t”替换为“,”
  • 有趣;我还在使用 Excel 2003。如果我将逗号分隔的数据放在一个纯文本文件中,将其命名为 foo.xls 并打开它,所有“字段”都会进入一个单元格。但是,如果我用制表符替换逗号,它会正确打开(即,它自己的单元格中的每个字段)。也就是说,我仍然认为最好通过让脚本输出一个干净的 CSV 来解决这个问题,这可能意味着对数据进行一些分析,并在必要时包装字段。
【解决方案2】:

好的,这是 Excel 2007 指定的一项称为扩展强化的功能的结果。您可以将其关闭,但这只能在客户端完成。如果您单击“确定”或“是”,文件仍应打开。更多信息请查看this blog post

编辑:这意味着 Excel 发现文件与文件扩展名指定的类型不同(例如 HTML 或 CSV)。因此 Excel 想要警告您该文件不是它所说的那样。除非您要在服务器上创建本机 Excel 文件然后提示用户下载它们,否则除了每个用户在自己的计算机上关闭扩展强化之外,没有解决此错误的方法。

【讨论】:

  • 谢谢 - 这解释了错误消息。我可能会在下面查看 Jeff 的解决方案,看看我是否可以让数据很好地保存在 .csv 文件中。
【解决方案3】:

如果您错误地将文本文件的第一个字母“ID”设置为 Excel 假设您正在尝试打开 SYLK 文件。

意思是如果第一行和第一列的值是“ID”,Excel 会抛出这个警告。只需将其从“ID”更改为其他任何内容即可。

信用:http://alunr.com/excel-csv-import-returns-an-sylk-file-format-error/

【讨论】:

    【解决方案4】:
    Dim objXL As Excel.Application
    Dim objWkb As Excel.Workbook
    Set objXL = New Excel.Application
    'turn off excel warnings
    objXL.DisplayAlerts = False
    'Open the Workbook
    Set objWkb = objXL.Workbooks.Open(fpath)
    

    【讨论】:

      【解决方案5】:
      functions sendFile($filename,$content_type="application/ms-excel") { 
        header('Content-type: '.$content_type);  
        header('Content-disposition: Attachment; filename=' . $filename);  
        readfile($filename);   
      } 
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,所以我查看了以下链接:PHP code to convert a MySQL query to CSV

        我修改了一个答案以使标题正常工作。

        include('DBFILE.PHP'); 
        $select="SELECT * FROM SOMETable";
        
        
        $result = mysqli_query($conn, $select);
        if (!$result) die('Couldn\'t fetch records');
        $num_fields = mysql_num_fields($result);
        
        //This is what I changed...
        $headers ="";
        while ($property = mysqli_fetch_field($result)) {
            $headers.= $property->name.",";
        }
        $headers.="\n";
        //////
        
        $fp = fopen('php://output', 'w');
        if ($fp && $result) {
            header('Content-Type: text/csv');
            header('Content-Disposition: attachment; filename="export.csv"');
            header('Pragma: no-cache');
            header('Expires: 0');
            fputcsv($fp, $headers);
            while ($row = $result->fetch_array(MYSQLI_NUM)) {
                fputcsv($fp, array_values($row));
            }
            die;
        }
        

        我对此进行了测试,它就像一个魅力,你只需要添加你的数据库连接或包含你拥有的 db.php 文件。

        如果您编辑以下行,您可以更改文件的名称

        header('Content-Disposition: attachment; filename="export.csv"');
        

        将导出更改为您喜欢的任何名称。

        【讨论】:

          猜你喜欢
          • 2015-02-08
          • 2014-05-29
          • 2011-12-30
          • 2010-09-23
          • 1970-01-01
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多