我正在尝试从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
答案 0 :(得分:0)
我修复了header
,以便Excel知道它是一个正在打开的csv文件。我不再得到任何错误。
header("Content-Type: application/x-csv");
header("Content-Disposition: attachment; filename=$filename.csv");
我仍然没有任何其他库,所以不会有任何格式,只是一个csv文件。
答案 1 :(得分:0)
如果有人实际上正在寻找原始问题的答案,请查看packagist.org for excel。 今天最好的那个看起来像phpspreadsheet。