PhpSpreadsheet中文false
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PhpSpreadsheet中文false相关的知识,希望对你有一定的参考价值。
参考技术A 由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本。公式中的false是表示精确匹配的意思。Spreadsheet是电子表格的意思,phpSpreadsheet是一个用纯PHP编写的库,提供一组类,使您可以读取和写入不同的电子表格文件格式。
PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用。
PhpSpreadsheet - 下载文件而不是保存它
【中文标题】PhpSpreadsheet - 下载文件而不是保存它【英文标题】:PhpSpreadsheet - Download file instead of saving it 【发布时间】:2020-03-17 03:45:58 【问题描述】:我需要生成一个excel文件(xls)并在生成后触发下载。 我在documentation 中找到了这个例子。
<?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
【问题讨论】:
你好,你可以试试链接:github.com/PHPOffice/PhpSpreadsheet/issues/… 不起作用,它在$handle = $writer->save('php://memory');
崩溃
【参考方案1】:
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 创建电子表格并直接输出到 php://output 以供下载。
【讨论】:
非常好,但是如果您之前发送了任何输出标头,则下载的文件将包含 html 数据,excel 会将其视为损坏的文件,因此您可以在ob_clean();
之前添加以防万一 @987654323 @.
我现在无法确认您的方法是否适合我,因为我目前正在从事另一个项目。但我肯定会回到这个答案,如果它有效,我会接受它。【参考方案2】:
我遇到了同样的问题,在这里找到了解决方案:https://github.com/PHPOffice/PhpSpreadsheet/issues/217
我用$writer->save('php://output');
结束了我的方法,然后是exit()
【讨论】:
【参考方案3】:我的回答: 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();
【讨论】:
【参考方案4】:调用 ob_end_clean();就在 $writer->save('php://output') 之前。
ob_end_clean();
$writer->save('php://output');
【讨论】:
【参考方案5】:我通过解决方法解决了这个问题。我将文件临时保存在服务器上,然后将内容加载到变量中并将其作为下载文件提供。然后我从服务器上删除文件。
解决方法:
$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);
【讨论】:
以上是关于PhpSpreadsheet中文false的主要内容,如果未能解决你的问题,请参考以下文章