Можно ли написать код на C # для создания таблицы в документе Word, когда она открыта мной? - PullRequest
0 голосов
/ 09 апреля 2019

Можно ли написать код на c #, чтобы создать таблицу в документе Word, которую я уже открыл? Я не хочу закрывать его, прежде чем редактировать.

Код, который я сейчас использую, -

using Word = Microsoft.Office.Interop.Word; 

private void TestOpenWordDoc
{
 Word.Application wordApp = new Word.Application(); 
 object objMissing = Type.Missing;
 Word.Document wordDoc = wordApp.Documents.Open(ref fullFilePath,
    ref objMissing, ref objMissing, ref objMissing, ref objMissing,
    ref objMissing, ref objMissing, ref objMissing, ref objMissing,
    ref objMissing, ref objMissing, ref objMissing, ref objMissing,
    ref objMissing, ref objMissing, ref objMissing); 
}

Но документ должен быть закрыт для его использования.

1 Ответ

0 голосов
/ 10 апреля 2019

Получение открытого документа в Word в мире VBA хорошо известно: GetObject с классом приложения в виде строки подберет запущенный экземпляр, зарегистрированный в ROT.Или, передав ему имя документа, откроется окно документа или откроется документ, если он еще не открыт.Метод оборачивает API-интерфейсы Windows для пользователя VBA.

В мире .NET это не так просто, но информация в этой статье блога от Andrew Whitechapel хорошо суммирует возможности:https://blogs.msdn.microsoft.com/andreww/2008/11/30/launching-office-apps-programmatically/

Тот, который я обычно использую, объединяет GetProcessesByName с Marshal.GetActiveObject, что очень похоже на метод VBA.

Например:

    Word.Application wdApp = null; //class level member

  private void btnRunningWordTable_Click(object sender, EventArgs e)
    {
        getWordInstance();
        Word.Document doc = wdApp.ActiveDocument;
        //Debug.Print(wdApp.ActiveDocument.FullName);
        Word.Table tbl = null;
        Word.Range rng = doc.Content;
        if (doc.Tables.Count > 0)
        {
            tbl = doc.Tables[1];
        }
        else
        {
            //Make sure to not replace existing content - put the table at the end
            rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
            tbl = doc.Tables.Add(rng, 3, 3, Word.WdDefaultTableBehavior.wdWord8TableBehavior, ref missing);
        }
        if (tbl != null)
        {
            Debug.Print(tbl.Rows.Count.ToString());
        }
    }

    internal void getWordInstance()
    {
        try
        {
            if (wdApp == null)
            {
                Process[] wdPcs = Process.GetProcessesByName("WinWord");
                int nrWordInstances = wdPcs.Length - 1;
                if (nrWordInstances >= 0)
                {
                    //Picks up other running instance, not new one
                    wdApp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
                }
                else
                    wdApp = new Word.Application();
            }
            wdApp.Visible = true;
            wdApp.Activate();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...