簡體   English   中英

打開XML文字內容控件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM