kosmonaFFFt
@kosmonaFFFt
Senior Java Developer.

Шаблон документа в docx/xlsx + данные в xml средствами .NET, возможно ли и если да, то как?

Доброго времени суток… Хотелось бы узнать о возможности выполнения следующей задачи:

Необходимо создать шаблон документа в word/excel и потом подставить в этот шаблон данные из XML (или другого источника данных доступного в .NET) средствами .NET. При этом шаблон должен легко правиться в ms office без костылей вида распаковки .docx файла и создания из него xslt преобразования.


Все, что я смог найти по этой теме — это добавление XML в документ и маппинг тегов XML на элементы управления содержимым, но ни в одном примере не нашел маппинга коллекции, и самому сделать не получилось — добился максимум маппинга одного элемента коллекции. Далее вроде как можно заменить присоединенный XML на другой средствами OpenXML SDK, но сначала хотелось бы разобраться с маппингом.


Буду рад любой информации по данному вопросу.
  • Вопрос задан
  • 5039 просмотров
Пригласить эксперта
Ответы на вопрос 2
@noonesshadow
Платными компонентами запросто. Мы для этого используем Syncfusion XlsIO
Ответ написан
@exaller
Делал подобную задачу на PHP, но принцип тот же.
Берете шаблон .docx, открываете его как объект класса zip.
Потом в этом архиве читаете нужный xml, и далее str_replase.

Примерный код:
//Папки Шаблона и загрузки нового файла
$template = 'templates/auditor';
$uploaddir = "documents/".$id;


//Файлы Шаблона и новый файл
$fileTemplate = $template .'/template.docx';
$newfile = $uploaddir .'/auditor_'. $num.'.docx';

//Создаём новую папку
if( !is_dir($uploaddir) ) mkdir( $uploaddir, 0755, true );

//Копируем файл
copy($fileTemplate, $newfile);

$zip = new ZipArchive;

if ($zip->open($newfile) === TRUE) {
	$handle = fopen( $template ."/document.xml", "r");
	$content = fread($handle, filesize($template ."/document.xml"));
	fclose($handle);
	$content = str_replace("{customer_r}", $auditor, $content);
	$content = str_replace("{num}", $data['Statement']['num'], $content);

	$zip->deleteName('word/document.xml');
	$zip->addFromString('word/document.xml',$content);
	$zip->close();
}else{
	echo "error";
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Hunt4You Севастополь
от 60 000 до 120 000 руб.
LC Group Москва
от 170 000 руб.
LC Group Новосибирск
от 90 000 до 160 000 руб.