1

私のアプリケーションは、.NET 4.0 WPF アプリケーションから Word 2007 以降にアクセスするために、相互運用型が埋め込まれた Microsoft.Office.Interop.Word バージョン 12 を使用しています。基本的に、特定の Word ドキュメントをスキャンし、いくつかのものを置き換えてから、ドキュメントを再度保存します。

ヘッダー/フッター内のものを置き換える必要があるかもしれないので、それらにアクセスする必要があります。私の問題は、ヘッダーまたはフッターに何らかの方法でアクセスすると作成されるように見えますが (段落記号が表示されます)、ヘッダーまたはフッターを空のままにしても、Word UI のようにそのヘッダー/フッターが再び削除されないことです。これは、既定のページ マージンを持つドキュメントでは問題になりませんが、ページのマージンが小さい場合、ヘッダーに空の段落が含まれているだけでも、ヘッダーによってページのコンテンツが下に移動する可能性があります。

私の質問は、Word でヘッダー/フッターを作成せずにヘッダー/フッターを処理する必要があることを確認する方法、またはコードで空のヘッダー/フッターを削除する方法です。

これは基本的に私が使用しているコードです:

Application application = new Application();
// Just for debugging.
application.Visible = true;
Document document = application.Documents.Open(filename);

foreach (Section section in document.Sections)
{
    HeaderFooter header = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];

    if (header == null || !header.Exists || header.LinkToPrevious)
    {
        // Header is disabled or linked to previous section.
        continue;
    }

    // We need to swith the view, otherwise some operations in the header
    // might fail.
    // This code is from a recorded Word macro.
    Window activeWindow = application.ActiveWindow;
    if (activeWindow.View.SplitSpecial != WdSpecialPane.wdPaneNone &&
        activeWindow.Panes.Count > 1)
    {
        activeWindow.Panes[2].Close();
    }
    activeWindow.ActivePane.View.Type = WdViewType.wdPrintView;
    activeWindow.ActivePane.View.SeekView = WdSeekView.wdSeekPrimaryHeader;

    // Get the full range of the header. This call causes my problem.
    Range headerRange = header.Range;

    // I'm doing something with 'headerRange' here, but this doesn't affect
    // the problem.

    // This switches the current view out of the header. Usually this also
    // deletes the header if it is empty. But if I accessed 'header.Range'
    // it doesn't delete it. Why?
    activeWindow.ActivePane.View.SeekView = WdSeekView.wdSeekMainDocument;
}

application.Quit(SaveChanges: WdSaveOptions.wdDoNotSaveChanges);
4

1 に答える 1

4

編集編集からの情報でエラーを再現できました。正直なところ、 range がなぜそうするのかはわかりませんが、簡単な回避策を探しているなら、これでうまくいきました:

activeWindow.ActivePane.View.Type = WdViewType.wdPrintView;
activeWindow.ActivePane.View.SeekView = WdSeekView.wdSeekPrimaryHeader;

//Check for blank headers
activeWindow.ActivePane.Selection.WholeStory();
var text = activeWindow.ActivePane.Selection.Text;
if (!string.IsNullOrEmpty(text) && text.Equals("\r"))
{
    activeWindow.ActivePane.View.SeekView = WdSeekView.wdSeekMainDocument;
    continue;
}
// Get the full range of the header. This call causes my problem.
Range headerRange = header.Range;
于 2013-09-04T13:47:28.410 に答える