2013-06-09 3 views
1

Я генерирую отчеты Excel, загружая листы Excel, которые я сгенерировал с помощью Excel, и заполняю некоторые данные с помощью кода PHP.Создание PDF с PHPExcel не удается

Теперь я хотел преобразовать эти листы Excel в PDF, и поскольку я видел, что PHPExcel 1.7.x поддерживает создание PDF, я подумал: «Совершенно, мне не нужно проходить OpenOffice Engine, потому что этот движок не был полезен для создания PDF-файлов для веб-пользователей в режиме реального времени.

Но: Кроме того, у меня не было возможности использовать PDF-редактор PHPExcel для записи загруженного шаблона Excel. Невозможно было загрузить и записать доставленные файлы xls.

Я попытался создать excel только с помощью кода PHP и отказаться от шаблона excel: excel-to-pdf уже завершился неудачей с помощью простейшего сгенерированного excel, объединяющего две ячейки. Является ли этот писатель совершенно непригодным для такой задачи? Приложение, 2013-06-09: Извините, это можно понять неправильно: это может быть моя ошибка или я просто не понял основных принципов.

Следующая простая генерация кода первенствует терпит неудачу, если речь идет о выходе Ф:

<?php 
/** Error reporting */ 
error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 
date_default_timezone_set('Europe/London'); 

if (PHP_SAPI == 'cli') 
    die('This example should only be run from a Web Browser'); 

/** Include PHPExcel */ 
require_once 'app/_includes/PHPExcel_1.7/PHPExcel.php'; 

$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; 
$rendererLibrary = 'tcpdf'; 
$rendererLibraryPath = '/inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/'. $rendererLibrary; 
if (!PHPExcel_Settings::setPdfRenderer(
     $rendererName, 
     $rendererLibraryPath 
    )) { 
    die(
     'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . 
     '<br />' . 
     'at the top of this script as appropriate for your directory structure' 
    ); 
} 
// Create new PHPExcel object 
$objPHPExcel = new PHPExcel(); 

// Set document properties 
$objPHPExcel->getProperties()->setCreator("Company X") 
       ->setDescription("Test document for PDF, generated using PHP classes."); 
$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); 

// Add some data 
$objPHPExcel->setActiveSheetIndex(0) 
      ->setCellValue('A1', 'Date') 
      ->setCellValue('B1', 'Time') 
      ->setCellValue('B2', 'Start') 
      ->setCellValue('C2', 'End'); 
// This line generated errors inside the output pdf -> corrupts PDF 
$objPHPExcel->setActiveSheetIndex(0)->mergeCells('B1:C1'); 

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8); 
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(14); 
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(4); 

// Rename worksheet 
$objPHPExcel->getActiveSheet()->setTitle('Simple'); 
$objPHPExcel->getActiveSheet()->setShowGridLines(false); 

// Set active sheet index to the first sheet, so Excel opens this as the first sheet 
$objPHPExcel->setActiveSheetIndex(0); 


// Redirect output to a client.s web browser (PDF) 
header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment;filename="p1.pdf"'); 
header('Cache-Control: max-age=0'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); 
$objWriter->save('php://output'); 
exit; 

Приложения, 2013-06-09: Это начало сгенерированный файл PDF:

Notice: Array to string conversion in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1236 

Call Stack: 
    0.0010  257896 1. {main}() /inet/xxx/HTTP/devel/p1.php:0 
    0.0243 7798872 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799224 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799728 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0243 7800064 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0309 8678376 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 
    0.0313 8683176 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 


Warning: Illegal string offset 'width' in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1257 

Call Stack: 
    0.0010  257896 1. {main}() /inet/xxx/HTTP/devel/p1.php:0 
    0.0243 7798872 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799224 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799728 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0243 7800064 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0309 8678376 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 
    0.0313 8683176 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 


Warning: Invalid argument supplied for foreach() in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1315 

Call Stack: 
    0.0010  257896 1. {main}() /inet/xxx/HTTP/devel/p1.php:0 
    0.0243 7798872 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799224 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/p1.php:62 
    0.0243 7799728 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0243 7800064 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 
    0.0309 8678376 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 
    0.0313 8683176 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 
    0.0320 8701296 8. PHPExcel_Writer_HTML->_assembleCSS() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:1267 

%PDF-1.7 

Приложение, 2013-06-10: Я попробовал пример 21pdf.php, с tcpdf. Это показывает мне некоторые предупреждения, но PDF-файл генерируется. Это является выходом PHP:

21:55:52 Create new PHPExcel object 
21:55:52 Set document properties 
21:55:52 Add some data 
21:55:52 Add comments 
21:55:52 Add rich-text string 
21:55:52 Merge cells 
21:55:52 Protect cells 
21:55:52 Set cell number formats 
21:55:52 Set column widths 
21:55:52 Set fonts 
21:55:52 Set alignments 
21:55:52 Set thin black border outline around column 
21:55:52 Set thick brown border outline around Total 
21:55:52 Set fills 
21:55:52 Set style for header row using alternative method 
21:55:52 Unprotect a cell 
21:55:52 Add a hyperlink to the sheet 
21:55:52 Add a drawing to the worksheet 
21:55:52 Add a drawing to the worksheet 
21:55:52 Add a drawing to the worksheet 
21:55:52 Play around with inserting and removing rows and columns 
21:55:52 Set header/footer 
21:55:52 Set page orientation and size 
21:55:52 Rename first worksheet 
21:55:52 Create a second Worksheet object 
21:55:52 Add some data 
21:55:52 Set the worksheet tab color 
21:55:52 Set alignments 
21:55:52 Set column widths 
21:55:52 Set fonts 
21:55:52 Add a drawing to the worksheet 
21:55:52 Set page orientation and size 
21:55:52 Rename second worksheet 
21:55:52 Hide grid lines 
21:55:52 Set orientation to landscape 
21:55:52 Write to PDF format using tcPDF 
Notice: Array to string conversion in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1236 Call Stack: 0.0010 258104 1. {main}() /inet/xxx/HTTP/devel/21pdf.php:0 0.1375 8979304 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8979656 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8980096 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1375 8980432 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1569 9542416 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 0.2014 9683184 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 Warning: Illegal string offset 'width' in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1257 Call Stack: 0.0010 258104 1. {main}() /inet/xxx/HTTP/devel/21pdf.php:0 0.1375 8979304 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8979656 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8980096 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1375 8980432 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1569 9542416 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 0.2014 9683184 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 Warning: Invalid argument supplied for foreach() in /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php on line 1315 Call Stack: 0.0010 258104 1. {main}() /inet/xxx/HTTP/devel/21pdf.php:0 0.1375 8979304 2. PHPExcel_Writer_PDF->save() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8979656 3. PHPExcel_Writer_PDF->__call() /inet/xxx/HTTP/devel/21pdf.php:80 0.1375 8980096 4. call_user_func_array() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1375 8980432 5. PHPExcel_Writer_PDF_tcPDF->save() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF.php:87 0.1569 9542416 6. PHPExcel_Writer_HTML->generateSheetData() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/PDF/tcPDF.php:119 0.2014 9683184 7. PHPExcel_Writer_HTML->_generateRow() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:436 0.2019 9685336 8. PHPExcel_Writer_HTML->_assembleCSS() /inet/xxx/HTTP/devel/app/_includes/PHPExcel_1.7/PHPExcel/Writer/HTML.php:1267 21:55:53 File written to 21pdf_tcPDF.pdf 
Call time to write Workbook was 0.9275 seconds 
21:55:53 Current memory usage: 16 MB 
21:55:53 Peak memory usage: 18 MB 
21:55:53 Done writing files 
File has been created in /inet/xxx/HTTP/devel 

Интересная заметка: возьмите взгляд на другом выходе TCPDF и MPDF. Думаю, теперь я знаю, почему вы оставите выбор генератора PDF открытым для пользователя. tcpdf generated example mPDF generated example

+1

Вы говорите, что "не может" .... просьба уточнить, что именно вы имеете в виду «fail» ... Если вы получаете сообщения об ошибках, тогда полезно знать, что на самом деле говорят эти сообщения об ошибках! –

+0

Как разработчик библиотеки, о которой идет речь, вы предполагаете, что она даже не может генерировать файл xls ... быть уверенным, что это возможно; и он также может создавать файлы PDF с объединенными ячейками; но мне нужно немного больше информации (например, сообщения об ошибках), чтобы попытаться диагностировать, что происходит не так –

+0

Привет, Марк Бейкер, я только что прочитал свой пост, что я написал немного в спешке, и я боюсь сказать, что это не хватает определенного тона уважения к работе, содержащейся в этом проекте, и ко всему, что вы делали для сообщества. Я прошу прощения за это, и я счастлив, что вы все же ответили мне. Между тем я поместил запрошенную информацию. – spikey

ответ

2

Быстрое и грязное исправление;

Изменение линии 1236 из PHPExcel/записи/html.php, который гласит:

$cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex(); 

в

if (!$this->_useInlineCss) { 
    $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex(); 
} 
+0

Спасибо! Патч работает отлично. Интересно, должен ли я делать что-то другое в моем собственном php-файле, например, определять или избегать определенного элемента CSS или это единственный способ обойти это. Я попытался выяснить отличия от рабочего примера 21pdf.php, но я не мог видеть Это. Большое спасибо. – spikey

+0

Там нет простого способа обойти его, и это не будет чистым исправлением для слияния ячеек с границами, мне нужно работать, что все еще –