Я использую PHPOffice / PHPWord в моем приложении Laravel. Он используется для создания документа .docx с результатами в таблицах. Это прекрасно работает для документа из 3 таблиц с 6 строками, но при наличии нескольких строк документ генерируется, но при его открытии возникает следующая ошибка:
We're sorry, We can't open (documentname) because we found a problem with its contents.
Details: XML parsing error Location: Part:/word/document.xml, Line: 2, Column 14349.
Теперь я начал работать над другой страницей результатов, где я также хотел бы создать документ .docx. Это будет содержать 5 таблиц, но с 3 строками я получаю ту же ошибку синтаксического анализа XML, но в другом месте (расположение: часть: /word/document.xml, строка: 4, столбец: 2888). Может ли кто-нибудь объяснить мне, является ли это ошибкой в моем коде или phpword / words?
Я сделал некоторые проблемы, удалив все, и медленно добавляя новые строки. Я нашел ошибку, но как я могу это исправить. Первые две таблицы генерируются хорошо ..
$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
$section->addImage('../public/img/2.jpg', array('width' => 230, 'height' => 65, 'alignment' => 'left'));
$section->addText('Project IDs:' . $parameter);
$header =$section->addHeader();
$header->addText('Results Summary');
$section->addLine(
array(
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(16),
'height' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(0),
'positioning' => 'absolute',
)
);
$tableName = 'rStyle';
$phpWord->addFontStyle($tableName, array('italic' => true, 'size' => 12));
$thName = 'tStyle';
$phpWord->addFontStyle($thName, array('bold' => true, 'size' => 9));
$section->addText('General Information Table', $tableName);
$fancyTableStyle = array('borderSize' => 6, 'borderColor' => '999999');
$spanTableStyleName = 'Overview tables';
$phpWord->addTableStyle($spanTableStyleName, $fancyTableStyle);
$table = $section->addTable($spanTableStyleName);
$table->addRow(null, array('tblHeader' => true, 'cantSplit' => true));
$table->addCell(1750)->addText('Project ID',$thName);
$table->addCell(1750)->addText('Description',$thName);
$table->addCell(1750)->addText('Notes',$thName);
foreach ($id_array_explode as $char) {
$table->addRow();
$singlenumber = (int)$char;
$cursor = $collection->find(array("id" => $singlenumber));
foreach ($cursor as $document) {
$table->addCell(1750)->addText($document["project_id"]);
$table->addCell(1750)->addText($document["description"]);
$table->addCell(1750)->addText($document["notes"]);
}
}
$section->addText('
');
$section->addLine(
array(
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(16),
'height' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(0),
'positioning' => 'absolute',
)
);
$section->addText('Input Table', $tableName);
$table1 = $section->addTable($spanTableStyleName);
$table1->addRow(null, array('tblHeader' => true, 'cantSplit' => true));
$table1->addCell(1750)->addText('Project ID',$thName);
$table1->addCell(1750)->addText('#',$thName);
foreach ($id_array_explode as $char) {
$table1->addRow();
$singlenumber = (int)$char;
$cursor = $collection->find(array("id" => $singlenumber));
foreach ($cursor as $document) {
if (is_array($document['input'])) {
foreach ($document['input'] as $samples) {
$table1->addCell(1750)->addText($document["project_id"]);
$table1->addCell(1750)->addText($samples['nr']);
}
}
}
}
$section->addText('
');
$section->addLine(
array(
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(16),
'height' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(0),
'positioning' => 'absolute',
)
);
$section->addText('Output Table', $tableName);
$table2 = $section->addTable($spanTableStyleName);
//// THIS IS WHERE THE ERROR OCCURS!!
$table2->addRow(null, array('tblHeader' => true, 'cantSplit' => true));
$table2->addCell(1750)->addText('ID',$thName);
Спасибо!
РЕШЕНИЕ
Итак, я удалил весь документ и добавил каждое отдельное предложение отдельно, чтобы увидеть, где произошла ошибка. Это привело к тому, что ошибка возникла из-за данных, которые я получал. Он не может обрабатывать «>» и «&» приметы!
Итак, если у вас есть эта ошибка, проверьте данные, которые вы печатаете!
Эта ошибка означает, что в вашем XML-файле есть проблема, перепроверьте ее, есть ли какой-либо тег, открытый и не закрытый должным образом, или любой другой контент, добавленный дополнительно.
Сведения: ошибка синтаксического анализа XML. Расположение: Часть: /word/document.xml, строка: 2, столбец 14349.
эта ошибка всегда возникает, когда есть проблема в файле XML. при создании XML или чтения XML.
Лучшее решение — добавить следующую строку кода, прежде чем делать что-либо со словом document:
PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(true);
Это автоматически уберет любых проблемных персонажей.
На самом деле, это происходит из ваших данных: у вас есть специальный символ XML, а когда Word анализирует ваш документ, он не понимает.
Я решил эту проблему с помощью htmlspecialchars()
, Я не уверен, что это лучший способ, но он работает.
Не очень знаком с PHPWord, но убедитесь, что кодировка вашего документа и данные, которые вы вставляете в него, совпадают. Раньше имелась такая же проблема со старой библиотекой для создания файлов Excel.