Openxml SDK.Как искать, читать и заменить текст в абзаце с изображением - PullRequest
0 голосов
/ 27 декабря 2011

Я создаю документ Word (.docx) и испытываю проблему с тем, как вставлять диаграммы, изображения вместо пользовательских тегов в уже существующие документы. Но изначально я создаю документ из нескольких файлов .RTF, используя подход «Altchunk», вставляя файлы .RTF в элементы управления содержимым в шаблоне документа. Эти файлы .RTF содержат наши пользовательские теги, они выглядят как "" и появляются в документе только с новой строкой, как показано ниже. (И мы не знаем заранее, сколько этих тегов будет в доке) .......

....... Погуглил, но не нашел подходящего способа заменить теги изображениями. Потому что сначала мне нужно прочитать тег, чтобы распознать имя изображения, чтобы я знал, какое изображение будет идти вместо тега, затем убрать тег (просто текст) из документа и на его место поместить изображение, которое я только что получил, зная имя изображения. Так что это довольно сложно, но я надеюсь, что у кого-то есть хорошие идеи, которыми можно поделиться. Спасибо

Я хотел бы описать эту проблему немного более конкретно:

1) Что касается метода altchunk , я просто нахожу элементы управления содержимым, которые я вставляю в текстовый документ, который я использую в качестве шаблона, и когда у меня есть строка rtf, я вставляю altchunk после этого CC.
мой метод выглядит следующим образом:

    private void ReplaceContentControlWithRTF(MainDocumentPart mainPart, string tagName,     string rtfString) 
{
                SdtBlock sb = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName).Single();
                string altChunkId = "altChunkId" + altChunkIdNumber++;
                AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Rtf, altChunkId);
                MemoryStream s = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(rtfString));
                chunk.FeedData(s);
                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;
                DocumentFormat.OpenXml.OpenXmlElement parent = sb.Parent;
                parent.InsertAfter(altChunk, sb);
                sb.Remove();
                mainPart.Document.Save();

}

1 Ответ

1 голос
/ 27 декабря 2011

Мой ответ получился довольно длинным, поэтому я разделю содержимое несколькими заголовками, чтобы было легче читать :).Вы должны рассмотреть каждый из них, если только вы не нашли лучший подход.

Объединение документов

Я полагаю, что при использовании метода altchunk вызатем xml первого документа (оригинального) и все добавленные документы закодированы.Лучшим подходом было бы объединить содержимое документов, потому что тогда у вас будет легкий доступ к дереву xml всего документа.Это довольно просто, если вы не используете изображения, гиперссылки и т. Д. В связанных документах, потому что они должны обрабатываться особым образом и могут усложнить задачу.

В качестве альтернативы, вы можете попытаться вставить изображения вкаждый документ ДО того, как их объединить.

Использование элементов управления содержимым в качестве заполнителей в документе

Теперь, предположив, что вы уже можете получить доступ к документу, следует поместить элементы управления содержимым в Wordдокументы, в местах, где вы хотите, чтобы ваши изображения появлялись, и установите Tag каждого из них на значение, которое вы должны затем искать в своем коде, чтобы найти правильное место для вставки изображения.Вы можете найти некоторую основную информацию о Контент Контроле здесь: http://office.microsoft.com/en-us/help/content-controls-HA010030750.aspx.

Вставить теги XML и байты изображения

Чтобы вставить изображение в документ, у вас естьне только для вставки некоторых тегов XML в место, где вы хотите, чтобы изображение появилось, но также для добавления байтов, содержащих изображение, в виде ImagePart.Я нашел учебное пособие, объясняющее, как это сделать, здесь (хотя я сам не следовал ему): http://msdn.microsoft.com/en-us/library/ee342530%28v=office.12%29.aspx.

Рассмотрите возможность использования инструмента повышения производительности OpenXML SDK 2.0

Чтобы упростить работу с OpenXML SDK, я рекомендую использовать SDK Productivity Tool от Microsoft.Его можно загрузить как часть пакета OpenXML SDK, и он позволяет открывать любой документ MS Office OpenXML, отображать его содержимое в формате XML и даже отображать код C #, необходимый для его воссоздания.Вы можете скачать его здесь: http://www.microsoft.com/download/en/details.aspx?id=5124.

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать:).

...