【问题标题】:Creating Excel file from MySQL从 MySQL 创建 Excel 文件
【发布时间】:2013-06-12 11:24:57
【问题描述】:

我正在尝试从 MySQL DB 中的表生成 XLS 文件,但 Excel 文件格式不正确并在 Excel 文件生成时出现错误“您尝试打开的文件格式不同于一个指定的”。打开文件时,数据格式不正确。

任何想法我错过了什么?

<?php
$host = 'XXXXXXX';
$dbname = 'XXXXXXXX';
$username = 'XXXXXXXX';
$password = 'XXXXXXXX';

function xlsBOF() {
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    return;
}

function xlsEOF() {
    echo pack("ss", 0x0A, 0x00);
    return;
}

function xlsWriteLabel($Row, $Col, $Value ) {
    $L = strlen($Value);
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    echo $Value;
    return;
}

function xlsWriteNumber($Row, $Col, $Value) {
    echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
    echo pack("d", $Value);
    return;
}

try {
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    echo "Connected to $dbname at $host successfully.";
    $conn = null;
} catch (PDOException $pe) {
    die("Could not connect to the database $dbname :" . $pe->getMessage());
}

$q = "SELECT * FROM tablename";
$qr = mysql_query( $q ) or die( mysql_error() );

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

header("Content-Disposition: attachment;filename=export_".$dbtable.".xls ");

header("Content-Transfer-Encoding: binary ");

xlsBOF();

$col = 0;
$row = 0;

$first = true;

while( $qrow = mysql_fetch_assoc( $qr ) )
{
    if( $first )
    {
      foreach( $qrow as $k => $v )
      {
        xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
        $col++;
      }

      $col = 0;
      $row++;
      $first = false;
    }

    // go through the data
    foreach( $qrow as $k => $v )
    {
      // write it out
      xlsWriteLabel( $row, $col, $v );
      $col++;
    }
    // reset col and goto next row
    $col = 0;
    $row++;
}

xlsEOF();
exit();

【问题讨论】:

  • 请解释“格式不正确”。
  • 为什么不使用现有的优秀 php-excel 库之一
  • @DoulatKhan 请注意您的编辑 - Stack Snippets 用于可在 在浏览器中运行 的代码示例,就在 Stack Overflow 页面 - JavaScript、HTML 和 CSS,运行所需的所有部件。 PHP 不是一种浏览器内语言。而且您不必要的标题编辑实际上添加了拼写错误(“generate”,而不是“genrate”)。

标签: php mysql excel


【解决方案1】:

我不确定 .xls 但对于将 MySQL 结果输出为 CSV 表,fputcsv 函数可以轻松完成:

// Clear any previous output
ob_end_clean();
// I assume you already have your $result
$num_fields = mysql_num_fields($result);

// Fetch MySQL result headers
$headers = array();
$headers[] = "[Row]";
for ($i = 0; $i < $num_fields; $i++) {
    $headers[] = strtoupper(mysql_field_name($result , $i));
}

// Filename with current date
$current_date = date("y/m/d");
$filename = "MyFileName" . $current_date . ".csv";

// Open php output stream and write headers
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='.$filename);
    header('Pragma: no-cache');
    header('Expires: 0');
    echo "Title of Your CSV File\n\n";
    // Write mysql headers to csv
    fputcsv($fp, $headers);
    $row_tally = 0;
    // Write mysql rows to csv
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    $row_tally = $row_tally + 1;
    echo $row_tally.",";
        fputcsv($fp, array_values($row));
    }
    die;
}

【讨论】:

    【解决方案2】:

    使用http://phpexcel.codeplex.com/

    C'est la meilleur solution pour générer un fichier excel Vous pouvez même créer plusieurs feuilles dans le fichier et formater les cellules(couleur、police、bordure ......)

    谷歌翻译

    这是生成 excel 文件的最佳解决方案您甚至可以在文件中创建多个工作表并格式化单元格(颜色、字体、边框...)

    【讨论】:

    • 打开文件时出现的第一个错误是“您尝试打开的文件与文件扩展名指定的格式不同”
    • 打开文件时出现的第一个错误是“您尝试打开的文件与文件扩展名指定的格式不同”。第二个错误是表的字段没有在每一行和每一列中单独下载。但在第一列。并且每个字段之间出现以下字符。 ``
    • 基本上我想要这个解决方案,因为这个功能我将添加到 WordPress 页面模板中,同样将查询数据库并使 XLS 文件可供下载或邮寄。所以我希望这尽可能容易,所以不想使用像 PHPExcel 这样的第三方函数。有什么建议吗?
    【解决方案3】:
    <?php 
     //download.php page code
     //THIS PROGRAM WILL FETCH THE RESULT OF SQL QUERY AND WILL DOWNLOAD IT. (IF YOU HAVE ANY QUERY CONTACT:rahulpatel541@gmail.com)
    //include the database file connection
    include_once('database.php');
    //will work if the link is set in the indx.php page
    if(isset($_GET['name']))
    {
        $name=$_GET['name']; //to rename the file
        header('Content-Disposition: attachment; filename='.$name.'.xls'); 
        header('Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0');
        header('Pragma: no-cache');
        header('Content-Type: application/x-msexcel; charset=windows-1251; format=attachment;');
        $msg="";
        $var="";
        //write your query      
        $sql="select * from tablename";
        $res = mysql_query($sql);
        $numcolumn = mysql_num_fields($res); //will fetch number of field in table
        $msg="<table><tr><td>Sl No</td>";
        for ( $i = 0; $i < $numcolumn; $i++ ) {
            $msg.="<td>";
            $msg.= mysql_field_name($res, $i);  //will store column name of the table to msg variable
            $msg.="</td>";
    
        }
        $msg.="</tr>";
        $i=0;
        $count=1; //used to print sl.no
        while($row=mysql_fetch_array($res))  //fetch all the row as array
        {
    
            $msg.="<tr><td>".$count."</td>";
            for($i=0;$i< $numcolumn;$i++)
            {
                $var=$row[$i]; //will store all the values of row 
                $msg.="<td>".$var."</td>";
            }
            $count=$count+1;
            $msg.="</tr>";
        }
    
        $msg.="</table>";
        echo $msg;  //will print the content in the exel page
    }
    ?>
    
    <?php
    //index.php page
    $name="any file name";
    echo "<a href='download.php?name=".$name."'>Click to download</a>"; //link to download file
    ?>
    

    【讨论】:

    • 请解释一下你的答案
    【解决方案4】:

    这里是简单的Excel文件生成功能,非常快速准确的.xls文件。

    $filename = "sample_php_excel.xls";
    $data = array(
    array("User Name" => "Abid Ali", "Q1" => "$32055", "Q2" => "$31067", "Q3" => 32045, "Q4" => 39043),
    array("User Name" => "Sajid Ali", "Q1" => "$25080", "Q2" => "$20677", "Q3" => 32025, "Q4" => 34010),
    array("User Name" => "Wajid Ali", "Q1" => "$93067", "Q2" => "$98075", "Q3" => 95404, "Q4" => 102055),
    );
    to_xls($data, $filename);
    
    function to_xls($data, $filename){
    $fp = fopen($filename, "w+");
    $str = pack(str_repeat("s", 6), 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); // s | v
    fwrite($fp, $str);
    if (is_array($data) && !empty($data)){
        $row = 0;
        foreach (array_values($data) as $_data){
            if (is_array($_data) && !empty($_data)){
                if ($row == 0){
                    foreach (array_keys($_data) as $col => $val){
                        _xlsWriteCell($row, $col, $val, $fp);
                    }
                    $row++;
                }
                foreach (array_values($_data) as $col => $val){
                    _xlsWriteCell($row, $col, $val, $fp);
                }
                $row++;
            }
        }
    }
    $str = pack(str_repeat("s", 2), 0x0A, 0x00);
    fwrite($fp, $str);
    fclose($fp);
    }
    
    function _xlsWriteCell($row, $col, $val, $fp){
    if (is_float($val) || is_int($val)){
        $str  = pack(str_repeat("s", 5), 0x203, 14, $row, $col, 0x0);
        $str .= pack("d", $val);
    } else {
        $l    = strlen($val);
        $str  = pack(str_repeat("s", 6), 0x204, 8 + $l, $row, $col, 0x0, $l);
        $str .= $val;
    }
    fwrite($fp, $str);
    }
    

    【讨论】:

      【解决方案5】:
      <?php 
        ob_end_clean();
        $num_fields = mysql_num_fields($result);
        $headers = array();
        $headers[] = "[Row]";
        for ($i = 0; $i < $num_fields; $i++) 
           $headers[] = strtoupper(mysql_field_name($result , $i));
      
        $current_date = date("y/m/d");
        $filename = "MyFileName" . $current_date . ".csv";
      
        $fp = fopen('php://output', 'w');
        if ($fp && $result) {
            header('Content-Type: text/csv');
            header('Content-Disposition: attachment; filename='.$filename);
            header('Pragma: no-cache');
            header('Expires: 0');
            echo "Title of Your CSV File\n\n";
            fputcsv($fp, $headers);
            $row_tally = 0;
            // Write mysql rows to csv
            while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
              $row_tally = $row_tally + 1;
              echo $row_tally.",";
              fputcsv($fp, array_values($row));
            }
           die;
         }
      ?>
      

      【讨论】:

      • 请解释一下你的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多