0

I have installed PhpSpreadsheet and dompdf successfully using composer. My requirement is that I need to convert an excel sheet into pdf, I got it working using the default settings, this is the code I have used.

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
use PhpOffice\PhpSpreadsheet\Exception;
use PhpOffice\PhpSpreadsheet\IOFactory;
use \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;

$spreadsheet = new Spreadsheet();
 try {
    $sheet = $spreadsheet->getActiveSheet();

    // code to fill in the data

    $spreadsheet->getActiveSheet()->fromArray(
        $data,                // The data to set
        NULL,        // Array values with this value will not be set
        'A2'         // Top left coordinate of the worksheet range where
    );
} catch (Exception $e) {
}

$writer = new Xlsx($spreadsheet);

try {
    IOFactory::registerWriter("PDF", Dompdf::class);
    $pdfwriter = IOFactory::createWriter($spreadsheet, 'PDF');
    $pdfwriter->save($filepath . 'pdf_test.pdf');
} catch (\PhpOffice\PhpSpreadsheet\Writer\Exception $e) {
}

I have skipped out code for brevity, this code works fine and generates a pdf file, I require the pdf to be printed in landscape mode, for that the docs mention a Custom implementation or configuration of the pdf library, so I created a file called PDFBase_DOMPDF that looks like this

use Dompdf\Dompdf;

class PDFBase_DOMPDF extends Dompdf
{

}

And I have created a file called PDFBase_Writer that looks like this.

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;

class PDFBase_Writer extends Dompdf
{
    protected function createExternalWriterInstance()
    {
        $instance = new PDFBase_DOMPDF();
        $instance->setPaper('A4', 'landscape');
        return $instance;
    }

}

I modified the original code to use the new pdf class so the line changed to this.

IOFactory::registerWriter("PDF", PDFBase_Writer::class);

The problem is I get an exception with the following error

Registered writers must implement PhpOffice\PhpSpreadsheet\Writer\IWriter

How exactly do I fix this?

Jude Fernandes
  • 7,437
  • 11
  • 53
  • 90

2 Answers2

0

Reading and writing to a persisted storage is not possible using the base PhpSpreadsheet classes. For this purpose, PhpSpreadsheet provides readers and writers, which are implementations of \PhpOffice\PhpSpreadsheet\Reader\IReader and \PhpOffice\PhpSpreadsheet\Writer\IWriter.

You must load the Excel file like this:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("TestRead.xlsx"); 
stefo91
  • 618
  • 6
  • 16
0

Registered writers must implement PhpOffice\PhpSpreadsheet\Writer\IWriter

PHPSpreadsheet Writer classes must implement all the methods defined in the IWriter interface. You're creating a new Writer, so it needs to provide an implementation of all those methods:

interface IWriter
{
    /**
     * IWriter constructor.
     *
     * @param Spreadsheet $spreadsheet
     */
    public function __construct(Spreadsheet $spreadsheet);

    /**
     * Save PhpSpreadsheet to file.
     *
     * @param string $pFilename Name of the file to save
     *
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
     */
    public function save($pFilename);
}

So your Writer needs to implement a constructor that accepts a Spreadsheet object as an argument, and a save() method that accepts a filename (as a string) argument.

Mark Baker
  • 209,507
  • 32
  • 346
  • 385