[英]Open XML word content controls
這是我的代碼,試圖獲取帶有標簽“ company”的內容控件
using (WordprocessingDocument template = WordprocessingDocument.Open("d:/dev/ProposalTemplate1.dotx", true))
{
MainDocumentPart mainPart = template.MainDocumentPart;
SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "TEST").Single();
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY_NAME";
}
由於查詢行,出現錯誤“對象引用未設置為對象的實例”,但我不知道為什么...
當我只創建一個帶有內容控件的簡單模板,而使用更大的Word模板時,這種方法效果很好
任何想法 ?
編輯我嘗試在沒有.Single()
但仍然無法正常工作
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY1";
}
編輯2我更改Text.Single()問題仍然存在SdtBlock block = ...
行上“對象引用未設置為對象的實例”
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
var t = block.Descendants<Text>();
foreach (Text text in t)
{
text.Text = "COMPANY1";
}
}
並非所有SdtBlock
元素都具有子Tag
元素。 您假設存在一個並嘗試訪問Val
屬性,但是這樣做會得到空引用異常。
您可以通過在Where
謂詞中檢查null來解決此問題:
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == "Company";
});
按照該意見有關於你原本使用的問題的詳細信息Single
在我的答案在這里 。
嘗試這個:
foreach( SdtBlock sdt in sdtList )
{
if( sdt.SdtProperties != null )
{
Tag tag = sdt.SdtProperties.GetFirstChild<Tag>();
if( tag!= null )
{
if( tag.Val.Value == "Company" )
{
if( sdt.InnerText != string.Empty )
{
//Do something
}
}
}
}
}
接受的解決方案也不對我的查詢返回任何結果。 所以我想出了這個解決方案;
var doc = document.MainDocumentPart.Document;
List<Tag> sdtSubTable = doc.Body.Descendants<Tag>().Where(r =>
{
return r != null && r.Val.Value.Contains("Company");
}).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.