kosmonaFFFt
@kosmonaFFFt
Senior Java Developer.

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

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

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


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


Буду рад любой информации по данному вопросу.
  • Вопрос задан
  • 5380 просмотров
Пригласить эксперта
Ответы на вопрос 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";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы