簡體   English   中英

PhpSpreadsheet - 下載文件而不是保存它

[英]PhpSpreadsheet - Download file instead of saving it

我需要生成一個excel文件(xls),生成后觸發下載。 我在文檔中找到了這個例子。

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');

它顯示了如何創建一個 excel 文件並將其保存在服務器上。 我怎樣才能將結果提供給客戶並“強迫”他下載呢? 我需要以某種方式獲取$writer的數據。

我目前在沒有 PhpSpreadsheet 的情況下解決它:

// Excel Export 
    $filename = 'export_'.date('d-m-y').'.xls';
    $filename = $validator->removeWhitespace($filename);

    header('Content-type: application/ms-excel');
    header('Content-Disposition: attachment; filename='.$filename);
    exit($response["output"]);  // <-- contains excel file content

但它不適用於我的定界符(分號)。 分號沒有得到解釋,所有內容都被寫入一列。

在此處輸入圖像描述

如果我將它導出為 .csv,那么它就可以工作。 但我需要它作為.xls 或.xlsx

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class DownloadExcel
{
    public static function createExcel(array $data, array $headers = [],
                                       $fileName = 'data.xlsx')
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();

        for ($i = 0, $l = sizeof($headers); $i < $l; $i++) {
            $sheet->setCellValueByColumnAndRow($i + 1, 1, $headers[$i]);
        }

        for ($i = 0, $l = sizeof($data); $i < $l; $i++) { // row $i
            $j = 0;
            foreach ($data[$i] as $k => $v) { // column $j
                $sheet->setCellValueByColumnAndRow($j + 1, ($i + 1 + 1), $v);
                $j++;
            }
        }

        $writer = new Xlsx($spreadsheet);
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment; filename="'. urlencode($fileName).'"');
        $writer->save('php://output');
    }

}

這是我使用 PhpSpreadsheet 和 output 直接創建電子表格到 php://output 以供下載的電子表格。

我遇到了同樣的問題並在這里找到了解決方案: https://github.com/PHPOffice/PhpSpreadsheet/issues/217

我用$writer->save('php://output');結束了我的方法。 然后exit()

我的回答:PHP:

$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$ret['data'] = base64_encode(ob_get_contents());
ob_end_clean();

JS:

var linkSource = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,'+ response.data ;
var downloadLink = document.createElement("a");
var fileName = 'clients.' + format;

downloadLink.href = linkSource;
downloadLink.download = fileName;
downloadLink.click();

我用解決方法解決了它。 我將文件臨時保存在服務器上,然后將內容加載到變量中並將其作為下載文件提供。 然后我從服務器上刪除文件。

解決方法:

$date = date('d-m-y-'.substr((string)microtime(), 1, 8));
$date = str_replace(".", "", $date);
$filename = "export_".$date.".xlsx";

try {
    $writer = new Xlsx($response["spreadsheet"]);
    $writer->save($filename);
    $content = file_get_contents($filename);
} catch(Exception $e) {
    exit($e->getMessage());
}

header("Content-Disposition: attachment; filename=".$filename);

unlink($filename);
exit($content);

調用 ob_end_clean(); 就在 $writer->save('php://output') 之前。

ob_end_clean();
$writer->save('php://output');

這對我有用:

$excel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $excel->getActiveSheet();
$sheet->setTitle('This is a test', true);

ob_end_clean();
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="filename_' . time() . '.xlsx"');
header('Cache-Control: max-age=0');

$xlsxWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($excel, 'Xlsx');
$xlsxWriter = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($excel);
exit($xlsxWriter->save('php://output'));

如果您遇到文件下載損壞的問題,最好檢查文件 output 的頂部是否有任何額外的空格。如果您的 PHP 文件有空白白線,而 HTML 不會有問題,您的 phpspreadsheet文件將。 花了很多時間試圖解決這些問題,但問題出在空格上!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM