phpspreadsheet读取模板excel文件导出空白的PDF是为什么
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class TaskController extends Controller
{
public function store(Request $request)
{
$spreadsheet = IOFactory::load(storage_path() . '/file/tpl/shipmentStatement.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '7800');
$writer = new Tcpdf($spreadsheet);
$filename = storage_path() . '/file/tmp/shipmentStatement'. date('YmdHis').'.pdf';
$writer->save($filename);
}
}
这个问题可能出在Tcpdf的设置上。可以尝试设置一些选项来解决这个问题,比如设置页面方向和尺寸,以及缩放等级。可以尝试以下代码:
$writer = new Tcpdf($spreadsheet);
$writer->setPaperOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);
$writer->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A4);
$writer->setPageScale(1.5);
$filename = storage_path() . '/file/tmp/shipmentStatement'. date('YmdHis').'.pdf';
$writer->save($filename);
如果还是不行,可以尝试更改PDF输出器为Dompdf或MPDF。这些都是第三方库,需要通过Composer安装。可以在composer.json文件中加入以下代码来安装:
"require": {
"phpoffice/phpspreadsheet": "^1.18",
"dompdf/dompdf": "^0.8.6"
}
然后在代码中使用以下代码:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Dompdf');
或者使用以下代码:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf');
答案参考来自 https://www.wodianping.com/
因为没有指定任何样式,所以空白的PDF出来了。需要在代码中指定样式才能导出格式化的PDF文件。
(参考一下ChatGPT示例代码)
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load('template.xlsx');
$styleArray = [
'font' => [
'name' => 'Arial',
'bold' => true,
],
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
// 设置样式
$spreadsheet->getActiveSheet()->getStyle('A1:D4')->applyFromArray($styleArray);
// 输出PDF
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf');
$writer->save('output.pdf');