Экспорт в PHPWord дает поврежденный файл Word - PullRequest
5 голосов
/ 20 декабря 2011

Я использовал пример кода с сайта PHPWord: http://phpword.codeplex.com/documentation И когда я пытаюсь открыть его с помощью Word, я получаю сообщение об ошибке «Невозможно открыть файл Office Open XML test.docx, поскольку существуют проблемы с содержимым». и когда я нажимаю «Подробности», он просто говорит: «Файл поврежден и не может быть открыт». Это позволяет мне его починить и открыть, но это не очень удобно для пользователей ... Вот код, который я использую:

// Create a new PHPWord Object
$PHPWord = new PHPWord();

// Every element you want to append to the word document is placed in a section. So you need a section:
$section = $PHPWord->createSection();

// After creating a section, you can append elements:
$section->addText('Hello world!');

// You can directly style your text by giving the addText function an array:
$section->addText('Hello world! I am formatted.', array('name'=>'Tahoma', 'size'=>16, 'bold'=>true));

// If you often need the same style again you can create a user defined style to the word document
// and give the addText function the name of the style>:
$PHPWord->addFontStyle('myOwnStyle', array('name'=>'Verdana', 'size'=>14, 'color'=>'1B2232'));
$section->addText('Hello world! I am formatted by a user defined style', 'myOwnStyle');

// You can also putthe appended element to local object an call functions like this:
$myTextElement = $section->addText('Hello World!');



header('Content-Type: application/vnd.ms-word');
header('Content-Disposition: attachment;filename="test.docx"');
header('Cache-Control: max-age=0');
// At least write the document to webspace:
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('php://output');

Как вы видите, я использовал php: // output для сохранения. Есть идеи как избавиться от коррупции. Я открыл zip и увидел, что в конце document.xml появляется пустая строка. Может быть, это является причиной?

Спасибо!

Ответы [ 6 ]

12 голосов
/ 26 марта 2014

Просто добавьте ob_clean (); перед выводом это!

ob_clean();
$objWriter->save('php://output');

Это очистит ваш вывод, и теперь вы можете создавать docx файл:)

9 голосов
/ 28 октября 2016

Я знаю, что это старый вопрос, но у меня была точно такая же проблема, и я нашел самое простое решение из всех. Проблема, с которой я столкнулся, заключается в том, что я использую Symfony, и при создании файла мне пришлось отредактировать файл с помощью Notepad ++, чтобы увидеть, что после содержимого появляются сообщения об ошибках, говорящие о том, что контроллеру нужен Response ().

Итак, я положил exit; сразу после ->save(), и все заработало нормально.

7 голосов
/ 29 декабря 2011

Любой добавляемый вами текст не должен содержать символов HTML. Преобразуйте все применимые символы в объекты HTML, например, если сначала необходимо добавить следующий код «Я и мой код»:

$Text_to_Add = htmlentities("Me & my Code");
$section->addText($Text_to_Add);

Используйте функцию «Встроенная» для сохранения файла. docx-файлы - это zip-файлы (их можно открыть в winrar или winzip), поэтому не следует использовать php: // output

$objWriter->save('helloWorld.docx');    
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=helloWorld.docx");
header("Content-Type: application/docx");
header("Content-Transfer-Encoding: binary");

Таким образом, файл будет создан, а затем загружен пользователем.

Примечание: файлы docx на самом деле являются файлами XML. Таким образом, любой резервный символ XML повредит файл. Обходной путь - преобразовать ваш текст следующим образом

function xmlEntities($str)
{
    $xml = array('"','&','&','<','>',' ','¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','­','®','¯','°','±','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','¿','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ');
    $html = array('"','&','&','<','>',' ','¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','­','®','¯','°','±','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','¿','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ');
    $str = str_replace($html,$xml,$str);
    $str = str_ireplace($html,$xml,$str);
    return $str;
}


$Text_to_Add = htmlentities("Me & my Code");
$Test_to_Add_XML_Cleaned = xmlEntities($Text_to_Add);
$section->addText($Test_to_Add_XML_Cleaned);
0 голосов
/ 02 марта 2019
  1. Добавить setCompatibility() до createWriter()

    \PhpOffice\PhpWord\Settings::setCompatibility(false);
    
  2. Добавить exit; после save()

    // XML Writer compatibility
    \PhpOffice\PhpWord\Settings::setCompatibility(false);
    
    // Saving the document as OOXML file...
    $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
    ob_clean();
    $objWriter->save('php://output');
    
    exit;
    
0 голосов
/ 27 марта 2018

Это решение сработало для меня

    $phpWord = new \PhpOffice\PhpWord\PhpWord();

$section = $phpWord->addSection(
  array('paperSize' => 'Legal', 'marginLeft' => 2834.645669291, 'marginRight' => 1417.322834646, 'marginTop' => 2834.645669291, 'marginBottom' => 1417.322834646)
);
//$html = $_POST['description'];
$html = $_POST['description'];


\PhpOffice\PhpWord\Shared\Html::addHtml($section, $html, false, false);

// Save file
// Saving the document as OOXML file...
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
//$objWriter->save('test.docx');


  $temp_file_uri = tempnam('', 'xyz');
  $objWriter->save($temp_file_uri);
 //download code
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=helloWorld.docx');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Content-Length: ' . filesize($temp_file_uri));
  readfile($temp_file_uri);
  unlink($temp_file_uri); // deletes the temporary file
  exit;
0 голосов
/ 20 ноября 2013
     $h2d_file_uri = tempnam('', 'htd');
    //exit($h2d_file_uri);
    $objWriter = PHPWord_IOFactory::createWriter($php_Word, 'Word2007');
    $objWriter->save($h2d_file_uri);


    // Download the file:
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
            header('Content-Disposition:    attachment;filename=BMP_QuotationNo_'.$html[0['quoteno'].'.docx');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($h2d_file_uri));
    ob_clean();
    flush();
    $status = readfile($h2d_file_uri);
    unlink($h2d_file_uri);
    exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...