【问题标题】:How to fix phpspreadsheet excel not downloading in php?如何修复phpspreadsheet excel没有在php中下载?
【发布时间】:2019-03-26 07:12:47
【问题描述】:

我正在为我工​​作的公司创建一个 Web 门户。现在,我被困在使用 PhpSpreadSheet 生成 Excel 报告中。我无法下载文件,而只是从我的 phpfile 所在的位置保存 excel 文件。但如果我在我的 url 'Get_summary_excel.php' 中调用这个文件,它将下载。

这是我在“Get_summary_excel.php”中的代码

需要“../../action/connection.php”; 需要'../API/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Helper\Sample;
use PhpOffice\PhpSpreadsheet\Style\Border;
// error_reporting(E_ALL);


$filename = "userReports";
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();


$headerstyle = array(
    'font'  => array(
        'bold'  => true,
        'color' => array('rgb' => '000000'),
        'size'  => 12,
        'name'  => 'Verdana'
    ),
    'alignment' => array(
            'horizontal' => \PHPOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
    )
    );

$company_name_style = array(
    'font'  => array(
        'bold'  => true,
        'color' => array('rgb' => '000000'),
        'size'  => 10,
        'name'  => 'Verdana'
    ),
    'alignment' => array(
        'horizontal' => \PHPOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        'vertical' => \PHPOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
    )
    );

$titlestyle = array(
    'font'  => array(
        'bold'  => true,
        'color' => array('rgb' => '000000'),
        'size'  => 14,
        'name'  => 'Verdana'
    ),
    'alignment' => array(
            'horizontal' => \PHPOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
    )
    );

$titledatestyle = array(
    'font'  => array(
        'bold'  => true,
        'color' => array('rgb' => '000000'),
        'size'  => 10,
        'name'  => 'Verdana'
    )
    );

$titleborder = array(
    'borders' => array(
    'allBorders' => array(
          'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, //BORDER_THIN BORDER_MEDIUM BORDER_HAIR
          'color' => array('rgb' => '000000')
    )
  )
);

$contentstyle = array(
    'alignment' => array(
        'vertical' => \PHPOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP,
        'horizontal' => \PHPOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT,
    )
    );


    $sheet->mergeCells('B1:D2');
    $sheet->mergeCells('B5:D6');
    $sheet->mergeCells('B7:D7');

    $sheet->setCellValue('B1',"KABUKLOD SA KAUNLARAN CREDIT, INC.");
    $sheet->setCellValue('B5',"REPORT");
    $sheet->setCellValue('B7',date("M d Y"));
    $sheet->setCellValue('B9', 'Subject')
          ->setCellValue('C9', 'Datetime')
          ->setCellValue('D9', 'Status');

    foreach(range('B','D') as $columnID) {
        $sheet->getColumnDimension($columnID)->setAutoSize(true);
    }

        $string =   "solved,pending";
        $array  =   array_map("strval",explode(',', $string));
        $array  =   implode("','",$array);

        $query  =   "SELECT * FROM tbl_concern WHERE status IN ('".$array."') ORDER BY status";
        $stmt = $con->prepare($query);
        $stmt->execute();
        $result = $stmt->get_result();

        $counter = 10;
        while($row = $result->fetch_array()){
            $sheet->setCellValue('B'.$counter, ''.$row['subject'])
                ->setCellValue('C'.$counter, ''.$row['datetime'])
                ->setCellValue('D'.$counter, ''.$row['status']);
                $counter++;
                //   $sheet->getRowDimension(6)->setRowHeight(40);
        }

    $sheet->getColumnDimension('B')->setAutoSize(false);
    $sheet->getColumnDimension('D')->setAutoSize(false);
    $sheet->getColumnDimension('B')->setWidth(30);
    $sheet->getColumnDimension('D')->setWidth(20);
    // $sheet->getRowDimension('4')->setRowHeight(20);
    $sheet->getStyle('B1')->applyFromArray($company_name_style);
    $sheet->getStyle('B9:B'.$sheet->getHighestRow())->getAlignment()->setWrapText(true);
    $sheet->getStyle('B5')->applyFromArray($titlestyle);
    $sheet->getStyle('B7')->applyFromArray($titledatestyle);
    $sheet->getStyle('B5:D7')->applyFromArray($titleborder);
    $sheet->getStyle('C5:D'.$sheet->getHighestRow())->applyFromArray($contentstyle);
    $sheet->getStyle('B9:D9')->applyFromArray($headerstyle);
    $sheet->getStyle('B9:D9')->getFont()->setBold(true);
    $sheet->setShowGridLines(false);



    $spreadsheet->getActiveSheet()->setTitle('userReport');

    $spreadsheet->setActiveSheetIndex(0);

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

    $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
    $writer->save('php://output');
    exit;

这是我的javascript

$.ajax({
    type: "GET",
    url: "../phpfile/GET_summary_excel.php",
    data: "solved=" + d_solved + "&ongoing=" + d_ongoing + "&pending=" + 
    d_pending + "&fileformat=" + type,
    beforeSend: function () {

    },
    success: function (msg) {
        console.log(msg);
    }
});

我希望用户下载报告。

【问题讨论】:

  • 您说“我无法下载文件,而只是保存”还说“在我的 url 'Get_summary_excel.php' 中调用此文件它将下载”,请澄清
  • 我想说的是,如果我按下一个将调用 GET_summary_excel.php 的按钮,它只会保存到我的 phpfile 所在的位置。但如果我尝试在不使用 ajax 的情况下将实际的 GET_summary_excel.php 输入到 url,它将下载到浏览器。
  • 您在之前的评论中提到了 Ajax。您不能通过 Ajax 下载文件。数据成为 JavaScript 中的变量,而不是磁盘上的文件。而是使用常规的 HTTP GET 请求

标签: php phpspreadsheet


【解决方案1】:

您不需要创建 ajax 请求,只需打开一个新选项卡到“Get_summary_excel.php” URL 并使用您的所有参数,然后您的文件就会被下载。

【讨论】:

  • 所以你想说的是使用 window.location.assign("GET_Summary_download.php") 打开新标签,它会下载?
  • 是的,它会下载文件。或者你可以创建一个
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2016-10-07
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多