【问题标题】:How to Export from PHP to Excel (xlsx)如何从 PHP 导出到 Excel (xlsx)
【发布时间】:2018-10-31 07:50:21
【问题描述】:

我正在尝试从 PHP 中的 MSSQL 查询导出到 xlsx 文件。我无权访问托管我的网站的服务器,因此我无法使用尚未内置于 PHP 中的任何内容。我正在使用 PHP 5.4。到目前为止,我已经创建了一个<a></a>,它引用了一个应该从我的 MSSQL DB 中提取数据的 php 页面。相反,它给了我一个 xls 格式的空白文件。当我打开它时,它会抛出一个错误,即下载文件夹中没有 stylesheet.css 文件,然后打开一个空白的 xls 工作簿。这是我的 ExportToExcel.php 文件:

$tsql = "select ID, TableName, UpdateDate from pmdb.TableUpdates order by UpdateDate";
//echo $tsql . "<br>";
$getqueries = $conn->query($tsql);
//echo "<BR>";
//var_dump($getqueries);
$result = $getqueries->fetchALL(PDO::FETCH_ASSOC);  
$filename = "TableUpdates";
//var_dump($tsql);

header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=$filename.xls");

/*******Start of Formatting for Excel*******/

//define separators (defines columns in excel & tabs in word)
$sep = "\t"; //tabbed character
$br = "\r\n"; //line break

//start of printing column names as names of SQL fields
//$max = sqlsrv_num_fields($result);
/* for ($i = 0; $i < $max; $i++) {
echo sqlsrv_field_metadata($result,$i) . "\t";
}
print("\n"); */

foreach( sqlsrv_field_metadata( $result ) as $fieldMetadata ) {
foreach( $fieldMetadata as $name => $value) {
   echo "$value" . $sep;
}
}   
echo $br;

//end of printing column names

//start while loop to get data
while($row = sqlsrv_fetch($result))
{
    $schema_insert = "";
    for($j=0; $j<sqlsrv_num_fields($result);$j++)
    {
        if(!isset($row[$j]))
            $schema_insert .= "NULL".$sep;
        elseif ($row[$j] != "")
            $schema_insert .= "$row[$j]".$sep;
        else
            $schema_insert .= "".$sep;
    }
    $schema_insert = str_replace($sep."$", "", $schema_insert);
    $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
    $schema_insert .= "\t";
    print(trim($schema_insert));
    print "\n";
}

我从其他问题中得到了大部分答案,但他们也没有答案。

编辑

我已经走得更远了。我现在可以将数据打印到 excel 中,尽管它仍然会抛出错误

.的文件格式和扩展名。 . .不匹配。 . .

加载过程中的问题:缺少文件:C:\Users\username\Downloads\StyleSheet.css

,但所有内容都打印在一列中。它以逗号分隔,但所有值都在同一列中。这是代码的新部分:

//define separators (defines columns in excel & tabs in word)
$sep = ","; //tabbed character
$br = "<br>"; //line break

$hsql = "select Headings from TableHeadings where TableName = 'TableUpdates' order by ID";
$getHeadings = $conn->query($hsql);
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC);

$headings = array($rHeadings[0]["Headings"],$rHeadings[1]["Headings"],$rHeadings[2]["Headings"]);

//start of printing column names as names of SQL fields
foreach($headings as $Heading => $value)
{
    echo "$value" . $sep;
}
echo $br;
for ($i = 0;$i < 3;$i++)
{
    for($l = 0;$l < 3;$l++)
    {
        if ($l == 0)
        {
            echo $result[$i]["ID"] . $sep;
        }
        elseif ($l == 1)
        {
            echo $result[$i]["TableName"] . $sep;
        }
        else
        {
            echo $result[$i]["UpdateDate"];
        }
    }
    echo $br;
}

我怎样才能让它回显每个值,然后移动到下一个单元格?它确实有逗号,但看起来像这样:

ID,TableName,UpdateDate,
1,pmdb.MaterialTracking,2016-07-08 13:45:05.963
2,pmdb.OSP_OPR_Report,2016-07-08 13:45:45.883
3,pmdb.COEI_OPR_Report,2016-07-08 13:45:47.920

【问题讨论】:

  • 您没有创建 xls 文件。 .xls 是一种复合 ole 格式。您正在生成一个 .csv 文件并 LYING 以超越其类型。这就是 Excel 告诉您格式不匹配的原因。你无法绕过这个,因为 Excel 知道你在骗它。要么使用合适的 excel 库,要么告诉 Excel 这是一个 csv 文件,正确的方法。
  • @MarcB 我认为这是正确的库header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")。如果不是,那么什么是或如何将其更改为 csv?如果我是新手,我早就做了。
  • 那不是图书馆。那只是告诉客户“我正在向您发送这种类型的文件”。然后你发送完全不同类型的数据
  • @MarcB 我不知道。我以为那是图书馆。那我在哪里指定库呢?我应该将标头更改为什么,以便它可以看到我正在发送 csv?

标签: php sql-server excel


【解决方案1】:

我已经修复了header,以便 Excel 知道它正在打开的是一个 csv 文件。我不再收到任何错误。

header("Content-Type: application/x-csv");
header("Content-Disposition: attachment; filename=$filename.csv");

我仍然没有任何其他库,所以不会有任何格式,只是一个 csv 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多