MSSQL选择导出为CSV

时间:2014-02-10 11:40:54

标签: php sql-server csv export-to-csv

我尝试使用mssql数据库中的选定行创建一个csv文件。 导出有效,但格式错误。

PHP:

require_once("config/config.php");

$connectionInfo = array("Database"=>DB_DB, "UID"=>DB_USER, "PWD"=>DB_PASSWORD);
$conn = sqlsrv_connect(DB_HOST, $connectionInfo);

if ($conn === false ) {
    die (print_r(sqlsrv_errors(), true));
}

$sql = "SELECT * FROM [RC.Appointments]";
$result = sqlsrv_query($conn, $sql);

if (!$result) die ('Couldn\'t fetch records');

$headers = array();

foreach (sqlsrv_field_metadata($result) as $fieldMetadata) {
    $headers[] = $fieldMetadata['Name'];
}

$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 = sqlsrv_fetch_array($result, SQLSRV_FETCH_NUMERIC)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

不知道为什么没有标题,我需要按列分开数据。 问题是由缺少的标题引起的吗?

sublimetext中的输出

appointment_id,terminname,datum
151,"Bitte Terminnamen vergeben",18.02.2014
152,"Bitte Terminnamen vergeben",19.02.2014
153,"Bitte Terminnamen vergeben",20.02.2014
154,"Bitte Terminnamen vergeben",25.02.2014
155,"Bitte Terminnamen vergeben",26.02.2014
156,"Bitte Terminnamen vergeben",27.02.2014
157,"Bitte Terminnamen vergeben",31.12.2014

2 个答案:

答案 0 :(得分:2)

从带有sublimetext的第二个输出开始,$headers数组不包含任何内容。

因此需要检查语句$headers[] = sqlsrv_get_field($result , $i);

因为它进一步倾倒数组而不是打印它,我会尝试:fputcsv($fp, array_values($headers));

为了正确理解Excel,请将分隔符更改为;fputcsv($fp, array_values($headers), ';');

答案 1 :(得分:0)

问题是sqlsrv_get_field()返回当前字段中的数据而不是名称,并且必须通过调用sqlsrv_fetch()来设置它以使用正确的索引。但这不是你想要做的。你需要做的是获得可以这样做的标题:

foreach( sqlsrv_field_metadata($result) as $fieldMetadata)
{
    $headers[] = $fieldMetadata['Name'];
}

正如Alex已经指出的那样,将标头写入csv文件的正确方法是:

fputcsv($fp, array_values($headers));

现在,关于文件在Excel中的显示方式,您可以使用文本导入向导导入文件here