Собираясь сойти с ума с этой проблемой. Я уверен, что это настолько просто, я просто пропускаю его, но я не могу ни за что в жизни узнать, как изменить содержание довольного управление в Word 2007 с OpenXml SDK v2.0 в C#.
Я создал документ Word с управлением содержанием простого текста. Тег для этого управления является "FirstName". В коде я хотел бы открыть документ Word, найти этот довольным управление и изменить содержание, не теряя форматирование.
Решение я наконец взялся за работу включенное нахождение довольного управление, вставив бежавший это, затем удалив довольное управление как таковое:
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filePath, true)) {
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart;
SdtRun sdtRun = mainDocumentPart.Document.Descendants<SdtRun>()
.Where(run => run.SdtProperties.GetFirstChild<Tag>().Val == "FirstName").Single();
if (sdtRun != null) {
sdtRun.Parent.InsertAfter(new Run(new Text("John")), sdtRun);
sdtRun.Remove();
}
Это действительно изменяет текст, но я теряю все форматирование. Кто-либо знает, как я могу сделать это?
Я нашел лучший способ сделать вышеупомянутое использование http://wiki.threewill.com/display/enterprise/sharepoint =+Open+xml#sharepointandOpenxml-ussword2007ContententControls в качестве ссылки. Ваши результаты могут отличаться, но я думаю, что это уйдет вас к хорошему статую:
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filePath, true)) {
var sdtRuns = mainDocumentPart.Document.Descendants<SdtRun>()
.Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == contentControlTagValue);
foreach (SdtRun sdtRun in sdtRuns) {
sdtRun.Descendants<Text>().First().Text = replacementText;
}
wordprocessingDocument.MainDocumentPart.Document.Save();
}
Я думаю, что вышеприведенное будет работать только для элементов управления контентами. К сожалению, он не избавляется от контроля контента в окончательном документе. Если я получу эту работу, я опубликую это.
http://msdn.microsoft.com/en-us/library/cc197932.aspx также является хорошим ссылкой, если вы хотите найти богатый контроль контента текста. Этот разговаривает о добавлении рядов в таблицу, которая была помещена в богатый контроль контента текста.
Ваш код не делает то, что я думаю, вы думаете, что это делает. Строка для элемента в Z:
будет осуществляться через Z
, каждый раз, когда разрабатывает элемент
, равный одному элементу Z
. Поэтому оригинал пункт
, поэтому перезаписывается до того, как вы что-либо сделаете с ним.
Я думаю, что вы хотите что-то вроде этого:
item = [0,1,2,3,4,5,6,7,8,9]
for element in item:
if element not in z:
print element
, но вы могли бы легко сделать это, как:
[x for x in item if x not in z]
или (если вы не возражаете в том, чтобы потерять дубликаты не уникальных элементов):
set(item) - set(z)
-121--982926- Мне также пришлось найти и заменить текст в нижних колонтитулах. Вы можете найти их, используя следующий код:
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(file.PhysicalFile.FullName, true)) {
foreach (FooterPart footerPart in wordprocessingDocument.MainDocumentPart.FooterParts) {
var footerPartSdtRuns = footerPart.Footer.Descendants<SdtRun>()
.Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == contentControlTag);
foreach (SdtRun sdtRun in footerPartSdtRuns) {
sdtRun.Descendants<Text>().First().Text = replacementTerm;
}
}
wordprocessingDocument.MainDocumentPart.Document.Save();
}
Одним из превосходных способов выработки того, как добиться желаемого результата - использовать инструмент рефлектора документов, который поставляется с открытым XML SDK 2.0 ....
Например, вы можете:
Это не идеально, но это удивительно полезно. Вы также можете просто посмотреть непосредственно на разметку любого документа и увидеть изменения, вызванные наполнением элементов управления.
Это несколько хрупкий способ сделать это, потому что словопроцессирующее ML может быть сложно; Легко испортить это. Для простых текстовых элементов управления я просто использую этот метод:
private void FillSimpleTextCC(SdtRun simpleTextCC, string replacementText)
{
// remove the showing place holder element
SdtProperties ccProperties = simpleTextCC.SdtProperties;
ccProperties.RemoveAllChildren<ShowingPlaceholder>();
// fetch content block Run element
SdtContentRun contentRun = simpleTextCC.SdtContentRun;
var ccRun = contentRun.GetFirstChild<Run>();
// if there was no placeholder text in the content control, then the SdtContentRun
// block will be empty -> ccRun will be null, so create a new instance
if (ccRun == null)
{
ccRun = new Run(
new RunProperties() { RunStyle = null },
new Text());
contentRun.Append(ccRun);
}
// remove revision identifier & replace text
ccRun.RsidRunProperties = null;
ccRun.GetFirstChild<Text>().Text = replacementText;
// set the run style to that stored in the SdtProperties block, if there was
// one. Otherwise the existing style will be used.
var props = ccProperties.GetFirstChild<RunProperties>();
if (props != null)
if (props != null)
{
RunStyle runStyle = props.RunStyle;
if (runStyle != null)
{
// set the run style to the same as content block property style.
var runProps = ccRun.RunProperties;
runProps.RunStyle = new RunStyle() { Val = runStyle.Val };
runProps.RunFonts = null;
}
}
}
Надеюсь, что это каким-то образом помогает. : D
Ваш первый подход Чтобы удалить SDTRUN и добавление нового, очевидно, удалит форматирование, поскольку вы добавляете только бега, но не RunStyle. Чтобы сохранить форматирование, вы должны создавать элементы запуска, такие как
new Run( new RunProperties(new RunStyle(){ Val = "MyStyle" }),
new Text("Replacement Text"));
Ваш второй подход к замене всех , заменители
будут работать на элемент управления контентом простого текста, только потому, что насыщенное управление контентом для текста не имеет элемента SDTRUN. Богатый контроль контента текста - SDTBLOCK с элементами SDTContent. Богатый контроль контента текста может иметь несколько абзацев, несколько прогонов и несколько текстов. Итак, ваш код SDTRUN.DESCENDANTANTS
, будет ошибочно для богатого элемента управления контентом текста. Нет ни одного строкового кода для замены всего текста богатого контроля контента и еще сохраняет все форматирование.
Я не понял, что вы подразумеваете под «оно не избавляется от контроля контента в окончательном документе»? Я думал, что ваше требование здесь состоит в том, чтобы изменить текст (контент) только путем сохранения контроля контента и форматирования.