PHP 导出多个 excel 文件

PHP exporting several excel files

我正在尝试从数据库中导出多个 table 并使用 PHP 为每个 table 创建一个 excel 文件。然而,循环是“窃听”的。它不是为每个循环创建一个新文件,而是将所有数据放入同一个文件中。

代码:

  foreach ($pdo->query("SHOW TABLES;") as $allTables) {
    $table = $allTables[0];

    $allDataStmt = $pdo->prepare("SELECT * FROM $table;");
    $allDataStmt->execute();

    $fieldcount = $allDataStmt->columnCount();

    $col_title = "";
    $data = "";
    for ($i = 0; $i < $fieldcount; $i++) {
      $col = $allDataStmt->getColumnMeta($i);
      $column = $col['name'];
      $col_title .= '<Cell ss:StyleID="2"><Data ss:Type="String">' . $column . '</Data></Cell>';
    }

    $col_title = '<Row>' . $col_title . '</Row>';

    while ($row = $allDataStmt->fetch(PDO::FETCH_NUM)) {
      $line = '';
      foreach ($row as $value) {
        if ((!isset($value)) or ($value == "")) {
          $value = '<Cell ss:StyleID="1"><Data ss:Type="String"></Data></Cell>\t';
        } else {
          $value = str_replace('"', '', $value);
          $value = '<Cell ss:StyleID="1"><Data ss:Type="String">' . $value . '</Data></Cell>\t';
        }
        $line .= $value;
      }
      $data .= trim("<Row>" . $line . "</Row>") . "\n";
    }

    $data = str_replace("\r", "", $data);

    header("Content-Type: application/vnd.ms-excel;");
    header("Content-Disposition: attachment; filename=" . $table . ".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
  }
}

如果我在第一次迭代后终止循环,它会从 ONE table 中正确导出数据。如果我让循环 运行 它只会加载包含数据的同一个文件,文件就会损坏。我什至无法在 Excel.

中打开它

我错过了什么?坚持了几个小时。

谢谢!

您尝试在同一个 HTTP 请求中制作多个不同的附件是不可能的。 HTTP 协议不支持下载多个文件。最常见的解决方法是将文件放在一个 zip 存档中以供客户端下载,如下所示:

$zip = new ZipArchive;
$zip_name = "excel_tables.zip";

if ($zip->open($zip_name, ZipArchive::CREATE|ZipArchive::OVERWRITE) === TRUE) {
    foreach ($pdo->query("SHOW TABLES;") as $allTables) {
        // (Your logic to build Excel file)

        $file_content = $col_title . "\n" . $data;

        $file_name = $table . ".xls";
        file_put_contents($file_name, $file_content);

        // Add file to the zip file
        $zip->addFile($file_name);
    }

    $zip->close();
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=' . $zip_name);
    header("Content-Length: " . filesize($zip_name));
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    ob_clean();
    flush();
    readfile(__DIR__ . "/" . $zip_name);
}