interop을 사용하고 있으며 단어 문서에 포함 된 모든 콘텐츠 컨트롤 목록 (본문, 모양, 머리글, 바닥 글 ..)을 가져오고 싶습니다. 이것이 정확하고 최선의 방법입니다.문서의 모든 콘텐츠 컨트롤 목록을 가져 오는 방법은 무엇입니까?
감사합니다.
interop을 사용하고 있으며 단어 문서에 포함 된 모든 콘텐츠 컨트롤 목록 (본문, 모양, 머리글, 바닥 글 ..)을 가져오고 싶습니다. 이것이 정확하고 최선의 방법입니다.문서의 모든 콘텐츠 컨트롤 목록을 가져 오는 방법은 무엇입니까?
감사합니다.
는 여기에 대해가는 훨씬 짧은 방법 (VBA하지만 C#을 포팅 할 수 있습니다) :
public static List<ContentControl> GetAllContentControls(Document wordDocument)
{
if (null == wordDocument)
throw new ArgumentNullException("wordDocument");
List<ContentControl> ccList = new List<ContentControl>();
// The code below search content controls in all
// word document stories see http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm
Range rangeStory;
foreach (Range range in wordDocument.StoryRanges)
{
rangeStory = range;
do
{
try
{
foreach (ContentControl cc in rangeStory .ContentControls)
{
ccList .Add(cc);
}
}
catch (COMException) { }
rangeStory = rangeStory.NextStoryRange;
}
while (rangeStory != null);
}
return ccList;
}
감사
: 여기Sub GetCCs()
Dim d As Document
Set d = ActiveDocument
Dim cc As ContentControl
Dim sr As Range
Dim srs As StoryRanges
For Each sr In d.StoryRanges
For Each cc In sr.ContentControls
''# do your thing
Next
Next
End Sub
예 Lars Holm, 맞습니다. 머리글과 바닥 글의 텍스트 상자 안의 콘텐츠 컨트롤이 누락되었습니다. 여기에 대한 완벽한 해결책은 다음과 같습니다.
/// <summary>
/// Get all content controls contained in the document.
/// </summary>
/// <param name="wordDocument"></param>
/// <returns></returns>
public static List<ContentControl> GetAllContentControls(Document wordDocument)
{
if (null == wordDocument)
throw new ArgumentNullException("wordDocument");
List<ContentControl> ccList = new List<ContentControl>();
// The code below search content controls in all
// word document stories see http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm
Range rangeStory;
foreach (Range range in wordDocument.StoryRanges)
{
rangeStory = range;
do
{
try
{
foreach (ContentControl cc in range.ContentControls)
{
ccList.Add(cc);
}
// Get the content controls in the shapes ranges
foreach (Shape shape in range.ShapeRange)
{
foreach (ContentControl cc in shape.TextFrame.TextRange.ContentControls)
{
ccList.Add(cc);
}
}
}
catch (COMException) { }
rangeStory = rangeStory.NextStoryRange;
}
while (rangeStory != null);
}
return ccList;
}
감사합니다.
이렇게하면 _all_ 콘텐츠 컨트롤을 찾을 수 있다고 보장 할 수 없습니다. 내 테스트에서는 내 머리글의 텍스트 상자 안에 두 개의 콘텐트 컨트롤이 없습니다. –