powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / чтение запись xml документов с помощью php
11 сообщений из 11, страница 1 из 1
чтение запись xml документов с помощью php
    #39726713
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые! Встал вопрос, так как зашел в тупик обращаюсь на форму за ответом.
Опишу вкратце суть задания. Есть docx документ - шаблон, в который нужно добавить определенные данные в определенные места.
Подключить библиотеку для работы не удалось, поэтому руками разобрал файл и достал от туда document.xml , в котором и хранятся все заветные данные. Дальше интересней!

Вот код document.xml (сокращенный)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0"?>
<w:document/>
<w:body:>
     <w:p> ... </w:p>
     ...
     <w:p> ... </w:p>
     <w:tbl>
          <w:tr> ... </w:tr>
          <w:tr>
                <w:tc> ... </w:tc>
                ...
                <w:tc> 
                     <w:p> 
                          <w:r> 
                               <w:t>{$text$}</w:t>
                          </w:r>
                     </w:p>
                </w:tc>
                <w:tc> ... </w:tc>
          </w:tr>
     <w:tbl>
</w:body:>
</w:document/>



Мне нужно заменить {$text$} - уникальное для каждой записи, после чего записать все это обратно в document.xml

Появилась загвоздка именно на замене этих {$text$}, и внесения этих изменений в документ document.xml .
После встает вопрос о собирании всего этого добра в архив и при помощи волшебства преобразование в docx.

На официальных сайтах уже все перерыл и пересмотрел!
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39726728
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolenПоявилась загвоздка именно на замене этих {$text$},Показывайте проблемный php-код, показывайте исходные данные, ожидаемые и получившиеся.

PS: Подозреваю, что $ надо экранировать в образце поиска или использовать одинарные кавычки.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39726937
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpExcelTemplator\PhpExcelTemplator;
use PhpOffice\PhpSpreadsheet\Document\Properties;
use PhpOffice\PhpSpreadsheet\IOFactory;

$atr_in_file = array ();
	$atr_in_file[0] = '{$is_date$}';
	$atr_in_file[1] = '{$title_OIT$}';
	$atr_in_file[2] = '{$name_OIT$}';
	$atr_in_file[3] = '{$streetaddress$}';
	$atr_in_file[4] = '{$title_SOTR$}';
	$atr_in_file[5] = '{$name_SOTR$}';
	$atr_in_file[6] = '{$SKZI_numb$}';
	$atr_in_file[7] = '{$sn_SOTR$}';
$atr_text = array ();
	$atr_text[0] = $_REQUEST['is_date'];
	$atr_text[1] = "Отдел";
	$atr_text[2] = $_REQUEST['name_OIT'];
	$atr_text[3] = $entries_user[$record]['streetaddress'][0];
	$atr_text[4] = $entries_user[$record]['title'][0];
	$atr_text[5] = $entries_user[$record]['displayname'][0];
	$atr_text[6] = $_REQUEST['SKZI_name'];
	$atr_text[7] Dvt $entries_user[$record]['sn'][0];
	//$atr_text[8] = $_REQUEST['t'];

$cache_path = '/var/www/html/';
$inputFileName = 'document.xml';
$new_xml = simplexml_load_file($inputFileName);

if (file_exists($inputFileName) === FALSE) { echo "<b>File not exist</b><br>"; goto end_file; }
if ($new_xml === FALSE) { echo "<b>File not open</b><br>"; goto end_file; }

$doc = new DOMDocument('1.0');
$doc->load('document.xml');

echo "<br>";
for($a=0; $a<count($new_xml->children('w', TRUE)->body->tbl->tr); $a++) 
{
	for($b=0; $b<count($new_xml->children('w', TRUE)->body->tbl->tr[$a]->tc); $b++) 
	{
		for($c=0; $c<count($new_xml->children('w', TRUE)->body->tbl->tr[$a]->tc[$b]->p); $c++)
		{
			for($d=0; $d<count($new_xml->children('w', TRUE)->body->tbl->tr[$a]->tc[$b]->p[$c]->r); $d++)
			{
				$xml = (string)$new_xml->children('w', TRUE)->body->tbl->tr[$a]->tc[$b]->p[$c]->r[$d]->t;
				for($w=0; $w<count($atr_in_file); $w++)
				if (strcasecmp($xml,$atr_in_file[$w])==0)
					{
						echo $xml." - ".$atr_text[$w]."<br>";
						$new_xml->children('w', TRUE)->body->tbl->tr[$a]->tc[$b]->p[$c]->r[$d]->t = $atr_text[$w];
					}
			}
		}
	}
}

$new_xml->asXML($inputFileName);
file_put_contents($inputFileName, $temp);

$doc->save('document.xml');

end_file:
?>
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39727002
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Все смешалось в доме Облонских", как сказал классик...
Если используется PhpSpreadsheet, тогда зачем вообще распаковывать архив на составные части. Оная библиотека умеет самостоятельно разбираться в исходном документе. Однако, инструкцию придется читать не по диагонали.
А если уж архив распакован до уровня текстовых файлов с довольно ясными метками для замены фрагментов хотя бы той же str_replace(), то нафига городить огород с simplexml и циклами.
И довершает всю картину DOMDocument, при помощи которого исходный файл сохраняется в нетронутом виде, отменяя возможные изменения, сделанные другим кодом.
Такая вот "веселуха" получается по коду.

Касаемо приведенного случая. От XML, наверняка, можно вовсе абстрагироваться и править обычный текстовый файл примерно так (без проверок):
Код: php
1.
2.
3.
$text  = file_get_contents($inputFileName);
$new_text = str_replace($atr_in_file, $atr_text, $text);
file_put_contents($inputFileName, $new_text);



Или не опускаться на уровень XML вовсе, проделывая все манипуляции с исходным *.xlsx непосредственно при помощи PhpSpreadsheet, если эта библиотека имеется. Хотя, в первом приближении, там писанины малость побольше будет.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39727024
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleКасаемо приведенного случая. От XML, наверняка, можно вовсе абстрагироваться и править обычный текстовый файл примерно так (без проверок):
Код: php
1.
2.
3.
$text  = file_get_contents($inputFileName);
$new_text = str_replace($atr_in_file, $atr_text, $text);
file_put_contents($inputFileName, $new_text);




То есть я могу обойтись простой заменой в самом документе командой str_replace ?
И какой файл мне изменять? Сам docx или xml в разложенном архиве?
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39727045
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,

Вы точно понимаете, что делаете? Если не вполне, то откройте тот и другой файл блокнотом и посмотрите.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39727097
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,
В том-то и дело, что я понимаю не полностью, а разобраться в мануале из интернета получается весьма смутно.
То что примеры сухие и обобщенные я молчу, как и про то что по PHPSpReadSheet вообще нет толкового мануала.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39727181
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolenпо PHPSpReadSheet вообще нет толкового мануалаМануал есть, только без знания объектной модели документа он практически бесполезен. Разберетесь в модели документа - сможете использовать. Не знаю, где сейчас есть информация по теме, сам разбирался в этих вопросах лет 15 назад при помощи встроенной справки MS Office, там весьма подробно было расписано. Тема весьма объемлющая для полного понимания.

bulaolenВ том-то и дело, что я понимаю не полностьюОчевидно, следует сперва разобраться в сути вопроса.
1. Что такое *.xlsx или *.docx файл Вы уже в курсе, ибо распаковали его как архив и получили набор текстовых файлов.
2. Как внести изменения в текстовый файл - ну это из разряда "PHP для чайников", немного сложнее хеллоуворда. Ваш вариант вполне укладывается в три строчки кода, см. выше.
3. Вы так же в курсе, что после правки текстового файла с данными следует собрать архив заново. PHP имеет для этого вполне штатные средства.

Что именно в этой последовательности действий не понятно? Мануал по PHP существует на официальном сайте, там даже примеров полно.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39728522
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

ну, если конкретизировать мой вопрос, то он прозвучит так:

1)как работать с docx документами через php (хорошая единая библиотека с большими возможностями)?
2)как через php собирать несколько каталогов в один файл и конвертировать его в docx?
3)есть ли какое-нибудь еще решение вопроса записи значений в специальные места в тексте, не нарушая его структуры?
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39728739
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,

1. В общем то, библиотек по пальцам пересчитать . Возможно, для других ЯП есть более интересные и подходящие Вам библиотеки. Возможности выше простейших никогда не интересовали меня за ненадобностью для моих задач.
2. Изучайте Office Open XML для понимания структуры файлов + пхпшный класс ZipArchive.
3. Принципиально, вариантов не так уж много. Непосредственно MS Word, используя его COM-сервер для внешнего управления (возможно, LibreOffice умеет что-то аналогичное). Документ как как архив (распаковка-правка-упаковка). Сторонние библиотеки.
...
Рейтинг: 0 / 0
чтение запись xml документов с помощью php
    #39728779
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Ну да, филе_гет_контентс, а потом стандартным образом парсится в пхп.
Как-нибудь так: $obj=new SimpleXMLElement($xmlstr);
Ну, обжи появляются, и всё другое. А дальше - дело техники - запихать всё это куда нужно.

ПС. Для работы с оффисом имеется специальная штука - OpenXML. Впадлу было примерчик искать. Сами разберётесь. Там очень просто.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / чтение запись xml документов с помощью php
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]