使用PHP将数据库结果导出为CSV

时间:2013-05-14 13:35:42

标签: php mysql database excel export

我已经通过这个网站进行了搜索,并发现了很多关于同样事情的线索,但没有一个像我这样完全没有新手,因为我不能正确理解答案。

我从数据库中选择了数据并显示在网页上的表格中。我现在需要在此表下方的链接,该链接将此数据导出为CSV文件。

我在本网站上找到的答案之一是:Create a CSV File for a user in PHP

然而,答案对我来说真的没有意义,我不知道如何处理代码。

以下是该答案的代码:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

$array = array(
    array("data11", "data12", "data13"),
    array("data21", "data22", "data23"),
    array("data31", "data32", "data23"));
outputCSV($array);

function outputCSV($data) {
    $outstream = fopen("php://output", "w");
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals); // add parameters if you want
    }
    array_walk($data, "__outputCSV", $outstream);
    fclose($outstream);
}

我有很多问题需要先创建一个excel文件吗?如果是这样,它需要是空白的吗?

这是什么?:

$array = array(
    array("data11", "data12", "data13"),
    array("data21", "data22", "data23"),
    array("data31", "data32", "data23"));

这应该是我的数据吗?我如何改变它以适应我的数据?

为什么在定义函数之前调用函数?

函数中的这些变量是什么($ vals,$ key,$ filehandler)以及它们在哪里创建?

我如何使用此代码,因为很多人似乎认为它是完美的。

我从头到尾都需要帮助,因为我是一个完整的PHP新手

我已经完成了下面的一个答案,现在我有了这个代码

$i=0;
                        $csv="";
                        for ($a=0; $a<=$count; $a++) {
                            $i++;
                            $csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['FeedbackName'])).",".
                                  preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['BranchName']));
                            $csv.="\n";
                        }

                        if ($i>0) {
                            header("Pragma: public");
                            header("Expires: 0");
                            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                            header("Cache-Control: private",false);
                            header("Content-Type: application/octet-stream");
                            header("Content-Disposition: attachment; filename=\"table.csv\";" );
                            header("Content-Transfer-Encoding: binary");

                            echo $csv;
                        } else {
                            return "Nothing to download!";
                        }

当我运行页面虽然没有变化时,数据仍然显示在页面上。但没有创建csv文件且没有错误发生

4 个答案:

答案 0 :(得分:1)

代码创建了一个新的文件对象,输出到标准输出,然后由于之前发送的标题而提供给用户。

这是你的数据;一组关联数组。你如何填写它取决于你。

在定义函数之前调用函数是因为PHP首先完全解析顶级文件,因此函数实际上将在调用时定义。这不适用于if语句中的函数。

函数的值由标准函数fputcsv提供。

您使用的代码几乎与呈现的完全相同。

答案 1 :(得分:0)

第3行 - 查询你的数据库(这取决于你如何连接到数据库,我正在使用类)
第4行 - 获取数据(这取决于你如何连接到数据库)

但您可以使用连接,只需获取数据,当您执行此操作时,不要显示数据库中的数据,将其添加到变量$csv.='some string'。当您获取所有数据时,显示header(它将创建csv文件),然后显示您的所有数据。

"," - 新细胞
"\n" - 新行
这就是我使用preg_replace的原因,因为如果您的数据库中的单元格为,,则此逗号会创建新单元格,而您不希望这样,因此您可以将其替换为;

您无需创建csv文件,您的文件名称在此行header("Content-Disposition: attachment; filename=\"table.csv\";" ); - table.csv

$i=0;
$csv="";
$res=$db->query('SELECT * FROM `table_name`');
while ($row=$res->fetch()) {
    $i++;
    $csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$row['col1'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col2'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col3'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col4'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col5']));
    $csv.="\n";
}

if ($i>0) {
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"table.csv\";" );
    header("Content-Transfer-Encoding: binary");

    echo $csv;
} else {
    return "Nothing to download!";
}

答案 2 :(得分:0)

您突出显示的部分是二维数组值,非常类似于电子表格(在本例中为CSV文件)。最外面的数组将您可以想象为行的数组保存在一起。该数组中的每个值都写入一列。所以从这个:

$array = array(
  array("data11", "data12", "data13"),
  array("data21", "data22", "data23"),
  array("data31", "data32", "data23"));

,你会得到一张这样的表:

----------------------------
| data11 | data12 | data13 |
----------------------------
| data21 | data22 | data23 |
----------------------------
| data31 | data32 | data33 |
----------------------------

您如何更改此数据取决于您从数据库中获取数据的方式,但基本原则是相同的:将所有数据放在array中,有一个{{1}对于每一行,并在行数组中包含该行中的值。

变量是传递给您为array_walk函数提供的回调函数的参数。 array接受一个数组,遍历其中的每个项目,并在项目上应用函数,在这种情况下,它遍历行数组,并将每个行数组作为CSV写入打开的文件。因此array_walk将始终包含行数组,此处忽略$vals但它将包含所访问的数组项的索引或键,$key是传递的$filehandler变量in,这是用于将值写入文件的打开文件处理程序。

最后,在PHP中,您可以在函数之后定义函数,只要它们在同一范围内即可。

答案 3 :(得分:0)

header函数用于向用户代理发送有关响应的附加信息。这些adtional信息以HTTP header-fields传递。请参阅header

header("Content-type: text/csv");:此代码会告知用户代理或浏览器,它将收到的内容是CSV文件。请参阅Content-type

header("Content-Disposition: attachment; filename=file.csv");:此代码告诉用户代理或浏览器将此内容作为附件接收,并且此附件的名称为file.csv。浏览器可能会将此内容保存在“下载”文件夹中,或者向用户请求本地保存该文件,具体取决于浏览器设置。见Content-Disposition

header("Pragma: no-cache");:相应地使用HTTP/1.1. specification,此指令与Cache-Control: no-cache的含义相同。 Pragma: no-cache指令用于向后兼容HTTP / 1.0。见Pragma

header("Expires: 0");此代码阻止用户代理缓存生成的内容。因此,每次用户询问内容时,浏览器都会向服务器发出请求。请参阅Expires

$array = array(
        array("data11", "data12", "data13"),
        array("data21", "data22", "data23"),
        array("data31", "data32", "data23"));

此代码创建一个3x3二维数组,即3行和3列。

outputCSV($array);:此代码将调用outputCSV函数,将二维数组作为参数传递

$outstream = fopen("php://output", "w");: fopen函数用于打开文件进行读写。此函数返回该文件的处理程序,因此您可以在该文件中执行i / o操作。见fopen

当你使用"php://output"时,你告诉PHP文件处理程序的任何写操作都将在标准输出中完成。因此命令fwrite($fhandler, "Hello World!")具有与echo "Hello World!"相同的结果。见php://

"w"表示该文件仅为写入操作打开。

array_walk($data, "__outputCSV", $outstream)用于为作为第一个参数传递的数组的每个元素执行一个函数。这样,它将执行执行fputcsv的__outputCSV函数。见array_walk

fputcsv将数组内容写入文件中。数组的每个元素将由分隔符分隔。默认定界符是(逗号)。见fputcsv

由于您有3x3阵列,array_walk将执行fputcsv功能3次。第一次为array("data11", "data12", "data13"),第二次为array("data21", "data22", "data23"),最后一次为array("data31", "data32", "data23")

反过来,fputcsv将输出以下内容:

"data11","data12","data13"
"data21", "data22", "data23"
"data31", "data32", "data23"

最后,使用了fclose。这将输出先前与fputcsv一起发送的缓冲数据,并将关闭该文件。见fclose