CSV下载不适用于所有页面

时间:2016-08-01 17:59:29

标签: php sql-server csv

我有一个我为报告创建的网站。基本上有3个报告。我在每个页面上都有一个按钮,它调用另一个PHP页面,该页面将填充页面的查询结果下载到CSV文件中。这在一个页面上工作正常,但在另外两个页面上,它在尝试打开时给出了错误。它说:

  

'FileName'的文件格式和扩展名不匹配。该文件可能已损坏或不安全。除非您信任其来源,否则请勿打开它。你想打开吗?

我点击是,然后点击:

  

Excel检测到'FileName'是一个SYLK文件,但无法加载它。文件有错误或不是SYLK文件格式。单击“确定”以尝试以其他格式打开文件。

我点击确定,它打开正常。

在另一页上,它就会打开。

这是ExportToExcel.php的大部分内容

switch ($_POST['ExportToExcel'])
{
    case "QDef":
        $tsql = "select Id,QSrc,QName,QDef,isActive,RunReport,FilePath from pmdb.v_QDefs order by Id";

        $hsql = "select Headings from TableHeadings where TableName = 'v_QDefs' and Headings != 'Edit' order by ID";

        break;
    case "TableUpdates":
        $tsql = "select ID, TableName, UpdateDate from pmdb.TableUpdates order by UpdateDate";
        $hsql = "select Headings from TableHeadings where TableName = 'TableUpdates' and Headings != 'Edit' order by ID";
        break;
}

$filename = $_POST['ExportToExcel'];

header("Content-Type: application/x-csv");
header("Content-Disposition: attachment; filename=$filename.csv");
//define separators (defines columns in excel)
$sep = ",";
$br = "\r\n"; //line break

$getHeadings = $conn->query($hsql);
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC);

$headings = array();
$NumHeadings = count($rHeadings);

for ($i = 0;$i < $NumHeadings; $i++)
{
    $headings[] = $rHeadings[$i]["Headings"];
}
//start of printing column names as names of SQL fields
foreach($headings as $Heading => $value)
{
    echo "$value" . $sep;
}
//end of printing column names
echo $br; //separate the headers and the data

foreach($conn->query($tsql) as $row)
{
    for ($i = 0;$i < $NumHeadings;$i++)
    {
        $CommentPos = strpos($rHeadings[$i]["Headings"],"comment");
        $NewLines = array("\r\n","\n\r","\n","\r");
        $UseValue = str_replace($NewLines, " ",$row[$i]);
        $UseValue = str_replace('"', "'",$row[$i]);
        $pos = strpos($UseValue,",");
        if ($CommentPos === FALSE || $pos === FALSE || isset($UseValue))
        {
            echo '"' . $UseValue . '"' . $sep;
        }
        else
        {
            echo $UseValue . $sep . "Not quoted";
        }
    }
    echo $br;
}

我的顶部有一个include,它有连接字符串,用于连接我的MSSQL DB,它可以正常工作,或者页面上没有显示任何内容。

我只是想知道为什么当所有报告以同样的方式调用页面时,页面对所有报告的工作方式都不一样。

再次编辑

我从下面尝试了几个想法,现在我有了这个:

$filename = $_POST['ExportToExcel'] . '.csv';

$Opened = fopen($filename,'w');

header("Content-Type: text/csv; charset=utf-8'");
header("Content-Disposition: attachment; filename=$filename");

fputcsv($Opened,$headings);

foreach($conn->query($tsql) as $row)
{
    fputcsv($Opened,$row);
}
fclose($Opened);

仍然给了我一张空白的电子表格。显然我还在做错什么?

1 个答案:

答案 0 :(得分:0)

没关系,我更新了我要导出的所有表格的标题,以便第一列不再是ID,而是Id。因为它不再是全部大写,所以没有fputcsv它工作正常,因为无论如何我都没有做任何事情。

$filename = $_POST['ExportToExcel'] . '.csv';

header("Content-Type: text/csv; charset=utf-8'");
header("Content-Disposition: attachment; filename=$filename");

//define separators (defines columns in excel)
$sep = ",";
$br = "\r\n"; //line break

$getHeadings = $conn->query($hsql);
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC);

$headings = array();
$NumHeadings = count($rHeadings);

for ($i = 0;$i < $NumHeadings; $i++)
{
    $headings[] = $rHeadings[$i]["Headings"];
}

//start of printing column names as names of SQL fields
foreach($headings as $Heading => $value)
{
    echo "$value" . $sep;

}

foreach($conn->query($tsql) as $row)
{
    for ($i = 0;$i < $NumHeadings;$i++)
    {
        $CommentPos = strpos($rHeadings[$i]["Headings"],"comment");
        $NewLines = array("\r\n","\n\r","\n","\r");
        $UseValue = str_replace($NewLines, " ",$row[$i]);
        $UseValue = str_replace('"', "'",$row[$i]);
        $pos = strpos($UseValue,",");
        if ($CommentPos === FALSE || $pos === FALSE || isset($UseValue))
        {
            echo '"' . $UseValue . '"' . $sep;
        }
        else
        {
            echo $UseValue . $sep . "Not quoted";
        }
    }
echo $br;
}