Microsoft word object library

Вставка текста в Word на C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной небольшой статье я бы хотел рассказать об одном из способов вставки текста в Word, используя C#. Будем использовать библиотеку Microsoft Word Object Library, которая появляется после установки ПО «Microsoft Word» на рабочую станцию. Добавим ссылку на эту библиотеку в наш проект:

Вставка текста в Word на C#
Вставка текста в Word на C#

В документ будем записывать имя, фамилию и возраст. За позицию в документе у нас будут отвечать закладки (Bookmarks). По умолчанию, их отображение отключено. Включаются они следующим образом: Файл — Параметры — Дополнительно — Блок «Показывать содержимое документа» — Показывать закладки:

Вставка текста в Word на C#

Закладки добавляются на панели «Вставка»:

Вставка текста в Word на C#

На скриншоте видно, что мы добавили 3 закладки. Их сейчас будем использовать в коде:

using System;
using Word = Microsoft.Office.Interop.Word;
namespace TestProjectWord
{
  class Program
  {
    static void Main(string[] args)
    {
      // Создаём объект документа
      Word.Document doc = null;
      try
      {
        // Создаём объект приложения
        Word.Application app = new Word.Application();
        // Путь до шаблона документа
        string source = @"D:\Test.docx";
        // Открываем
        doc = app.Documents.Open(source);
        doc.Activate();

        // Добавляем информацию
        // wBookmarks содержит все закладки
        Word.Bookmarks wBookmarks = doc.Bookmarks;
        Word.Range wRange;
        int i = 0;
        string[] data = new string[3] { "27", "Alex", "Gulynin"};
        foreach (Word.Bookmark mark in wBookmarks)
        {

          wRange = mark.Range;
          wRange.Text = data[i];
          i++;
        }

        // Закрываем документ
        doc.Close();
        doc = null;
      }
      catch (Exception ex)
      {
        // Если произошла ошибка, то
        // закрываем документ и выводим информацию
        doc.Close();
        doc = null;
        Console.WriteLine("Во время выполнения произошла ошибка!");
        Console.ReadLine();
      }
    }
  }
}

В данной статье вы научились добавлять информацию в Word-документ, используя C#, с помощью библиотеки Microsoft Word Object Library.

В следующих двух статьях рассмотрим ещё 2 библиотеки по работе с Word-документами.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Купить диплом специалиста на выгодных условиях. http://origenaldiplom.com/

Аннотация: Лекция посвящена описанию объектной модели MS Word и подробному описанию методов, свойств и событий Application.

9.1. Объектная модель MS Word

Microsoft Word 2007, как, впрочем, и другие приложения Office, имеет большую объектную модель, в которую входят множество объектов и коллекций. Однако на практике чаще всего используются лишь некоторые из них.

В частности, это следующие:

  • Word (Microsoft Word) — чтобы вызывать объекты Microsoft Office Word из других приложений используется объект Word.
  • Application (Приложение) — объект, который включает в себя все остальные объекты и коллекции. Сам объект Application включается в объект Word.
  • Documents (Документы) — коллекция, которая включает в себя объекты Document (Документ). Объект Document представляет собой документ, с которым вы работаете в редакторе.
  • Bookmarks (Закладки) — c помощью объектов этой коллекции можно задавать места в документе, в которые, при автоматическом создании, можно вставлять изменяемые части.
  • Paragraphs (Абзацы), Sentences (Предложения), Words (Слова), Characters (Символы), Tables (Таблицы), OMath (Математические формулы), Эти коллекции, содержащие объекты, соответствующие их названиям, могут использоваться для обработки слов документа ( Words ), предложений ( Sentences ), отдельных символов ( Characters ) и т.д.
  • Selection (Выделенная область) — представляет собой выделенную область документа или позицию, в которую будет осуществляться вставка очередного символа. Этот объект часто используют при создании простых документов. Однако у него есть существенные недостатки, что делает предпочтительнее использование объекта Range в большинстве случаев.
  • Range (Диапазон) — входит в Document и другие объекты, представляет собой диапазон документа, ограниченный начальным и конечным символом.

Работая с объектной моделью MS Word следует понимать, что, например, объекты Document и Selection могут содержать одинаковые коллекции объектов, например, и там и там есть коллекция Characters, в которую входят объекты Character — то есть — символы. Однако в случае с объектом Document мы можем работать с любым символом документа, а в случае с Selection — лишь с символами в пределах выделенной области. Однако, несмотря на различия, и там и там коллекция Characters имеет одинаковые свойства и методы. То же самое касается и других коллекций и объектов.

Давайте начнем с объекта Application и здесь же поговорим об использовании объектных переменных.

9.2. Работа с объектными переменными

Объектные переменные — это переменные, которые хранят ссылки на объекты. Чтобы инициализировать объектную переменную, нужно использовать ключевое слово Set. Например, так (листинг 9.1.):

Set obj_NewWord = Word.Application


Листинг
9.1.
Связывание объекта с объектной переменной

Здесь вы можете видеть присваивание переменной ссылки на объект Word.Application. Код, подобный этому, нужен в других приложениях Microsoft Office для запуска нового экземпляра MS Word.

Для того чтобы вы могли работать с Microsoft Word из других приложений — подключите библиотеку Microsoft Word 12.0 Object Library. Сделать это можно, открыв в редакторе окно References командой Tools o References.

Немного ниже мы поговорим о том, что можно делать с объектными переменными, а пока сосредоточимся на их объявлении и инициализации.

Как видите, в листинге 9.1 мы не объявляли переменную — мы сразу присвоили ей ссылку на объект. При последующей работе с такой необъявленной объектной переменной, мы не сможем пользоваться подсказкой по свойствам и методам. Вспомните — когда вы набираете в редакторе имя элемента управления и ставите после него точку — вы видите подсказку. Это очень удобно, так как позволяет избежать ошибок и излишних «походов» в справочную систему VBA.

Для того чтобы справка по свойствам и методам работала, объектную переменную надо сначала объявить, а потом присвоить ей ссылку на объект. Например, так (листинг 9.2.):

Dim obj_NewWord As Word.Application
Set obj_NewWord = Word.Application


Листинг
9.2.
Предварительное объявление объектной переменной

Ссылку на объект можно присвоить в процессе объявления переменной. Для этого нужно воспользоваться ключевым словом New (листинг 9.3.):

Dim obj_NewWord As New Word.Application


Листинг
9.3.
Ключевое слово New при объявлении переменной

Переменную, объявленную таким образом, мы можем сразу же использовать по назначению. Новый экземпляр объекта будет создан при первом обращении к нему.

О том, как же пользоваться объектными переменными, скорее даже не ими, а объектами, на которые они ссылаются, мы поговорим ниже.

9.3. Объект Application — приложение

09-01-With For Each.docm — пример к п. 9.3.

Объект Application можно представить в виде приложения Microsoft Word.

Такой код позволит вывести в окно сообщения информацию об имени приложения:

Как видите, здесь мы обратились к свойству Name (Имя) объекта Application. Вот, что будет выведено при его исполнении (рис. 9.1.).

Свойство Name объекта Application

Рис.
9.1.
Свойство Name объекта Application

Здесь мы обходимся без объектных переменных, работая с уже существующим объектом. Ведь если этот код исполняется в Microsoft Word, это значит, что сам Microsoft Word уже запущен.

Чтобы упростить обращение к нескольким свойствам объекта, можно воспользоваться оператором With-End With. Этот оператор позволяет обращаться к нескольким свойствам или методам объекта в упрощенной форме. Например, чтобы вывести имя приложения и узнать номер сборки программы нужно воспользоваться таким построением (листинг 9.4.):

With Application
        MsgBox .Name
        MsgBox .Build
    End With


Листинг
9.4.
Оператор With — End With

Здесь мы использовали объект Application — вместо него может быть любой другой объект или объектная переменная.

Еще один оператор, которым удобно пользоваться при работе с объектами и коллекциями — это For Each…Next.

Например, для вывода в окнах сообщений имен всех открытых документов, можно написать такой код (листинг 9.5.):

Dim var_Doc
    For Each var_Doc In Application.Documents
       MsgBox var_Doc.Name
    Next var_Doc


Листинг
9.5.
Оператор For Each — Next

Var_Doc — это переменная типа Variant. Коллекция Application.Documents содержит все открытые документы. При каждом проходе цикла в переменную var_Doc записывается ссылка на очередной объект в коллекции.

Чтобы выйти из цикла, можно воспользоваться оператором Exit For.

Сейчас мы кратко опишем важнейшие методы, свойства и события объекта Application.

9.4. Методы объекта Application

9.4.1. BuildKeyCode, KeyString — горячие клавиши

BuildKeyCode возвращает уникальный цифровой код для заданной комбинации клавиш. Используется при назначении «горячих клавиш» для выполнения различных операций.

KeyString возвращает комбинацию клавиш для переданного кода.

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

9.4.2. ChangeFileOpenDirectorу — путь для работы с файлами

ChangeFileOpenDirectory позволяет установить директорию, в которой Microsoft Word ищет файлы для открытия. В установленной папке программа будет искать файлы при программном открытии файлов и при вызове окна открытия файлов.

Выбранная директория будет использоваться для открытия файлов по умолчанию лишь до тех пор, пока Word не будет перезапущен.

Например, чтобы установить папку » C:Новые документы » в качестве папки по умолчанию, можно использовать такой код (листинг 9.6.):

Application.ChangeFileOpenDirectory ("C:Новые документы")


Листинг
9.6.
Установка новой папки по умолчанию

Следует отметить, что если мы вызываем метод или свойство объекта Application из макроса Microsoft Word, мы можем опускать вызов Application — то есть, в вышеприведенном примере можно написать так:

ChangeFileOpenDirectory ("C:Новые документы")

9.4.3. CleanString — очистка строк

CleanString очищает переданную строку от непечатаемых и специальных символов, превратив ее в обычный текст. Такой же текст можно получить, если скопировать текст из Microsoft Word в Блокнот, а потом — обратно. Например, с помощью такого кода можно получить очищенную строку из выделенной области документа (листинг 9.7.).

str_Clean = Application.CleanString(Selection.Text)


Листинг
9.7.
Очистка строки

9.4.4. Keyboard — программное переключение раскладки

Keyboard позволяет программно переключать раскладку клавиатуры. При переключении используется идентификатор языковых и клавиатурных установок. Чтобы включить русскую раскладку, можно воспользоваться таким кодом (листинг 9.8.):

Application.Keyboard 1049


Листинг
9.8.
Переключение на русскую раскладку клавиатуры

Очевидно, что 1049 — это код русского языка. Для включения английской раскладки используйте этот метод с идентификатором 1033.

9.4.5. ListCommands — справка по горячим клавишам

ListCommands это необычный метод — если вызвать его с параметром True (листинг 9.9.) — он создаст новый документ, содержащий таблицу со списком клавиатурных сочетаний, назначенных командам MS Word. Таблица содержит несколько десятков страниц.

Application.ListCommands True


Листинг
9.9.
Вывод информации о горячих клавишах

9.4.6. NewWindow — копия окна активного документа

09-02-New Window.docm — пример к п. 9.4.6.

NewWindow создает копию окна активного документа. Это может быть полезным например, для того, чтобы вывести один и тот же документ на два монитора при работе с расширенным рабочим столом и т.д. Например, метод можно вызвать так:

Application.NewWindow


Листинг
9.10.
Создание копии окна активного документа

При необходимости можно задать, для какого именно документа вы хотите создать копию окна. Однако, это потребует использования других объектов. Например — коллекции Windows, содержащей окна документов. Такой код (листинг 9.11.) создаст одну копию для каждого открытого окна:

For i = Application.Windows.Count To 1 Step -1
    Application.Windows.Item(i).NewWindow
Next i


Листинг
9.11.
Создание копии для каждого открытого окна

Мы не случайно запустили цикл обхода открытых окон в обратном порядке. Дело в том, что иначе будет создано несколько копий одного и того же документа.

В этом примере вам встретились неизвестные ранее свойства Count и Item. Первое обычно содержит количество элементов в коллекции, второе позволяет обращаться к элементам по индексам или именам.

При создании копии после имени документа появляется двоеточие с номером окна, например, «:1» для первого, «:2» для второго и т.д.

9.4.7. OnTime — запуск макросов по расписанию

09-03-OnTime.docm — пример к п. 9.4.7.

OnTime позволяет устанавливать таймер, по которому можно запустить макрос в определенное время. Например, чтобы выполнить макрос MyMacros, который хранится в том же документе, что и исполняемый макрос, достаточно выполнить такой код (листинг 9.12.).

Application.OnTime When:="08:37:00", Name:="MyMacros"


Листинг
9.12.
Установка таймера запуска макроса

Параметр When указывает на время запуска, параметр Name — на имя макроса. Важно, чтобы макрос был доступен как в момент запуска таймера, так и в момент запуска самого макроса. Для того чтобы это условие соблюдалось, желательно хранить макросы, запускаемые по таймеру, в Normal.dotm, в другом глобальном шаблоне, или в том же документе, в котором произошел запуск таймера.

Как видите, мы привели пример лишь для запуска макроса в строго определенное время. А как же быть, если нужно запустить макрос, например, через пятнадцать секунд после выполнения какой-либо процедуры? Ответ прост (листинг 9.13.)

Application.OnTime _ 
When:=Now + TimeValue("00:00:15"), _ 
Name:="MyMacros"


Листинг
9.13.
Запуск макроса по расписанию

Здесь мы запускаем тот же самый макрос, но уже через 15 секунд после установки таймера. Функция Now имеет тип Date и возвращает текущую дату и время, а функция TimeValue преобразует переданное ей время в формат Date.

Если вы хотите, чтобы какой-то макрос запускался с некоторой периодичностью — установку таймера на запуск этого макроса можно установить в нем. Первый запуск макроса можно произвести вручную или каким-то другим способом (например — по событию приложения, с помощью автоматически выполняемого макроса), а последующие запуски этот макрос будет инициировать самостоятельно.

dotnet add package MSOffice.Object.Library --version 15.0.4420.1018

NuGetInstall-Package MSOffice.Object.Library -Version 15.0.4420.1018

This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module’s version of Install-Package.

<PackageReference Include="MSOffice.Object.Library" Version="15.0.4420.1018" />

For projects that support PackageReference, copy this XML node into the project file to reference the package.

paket add MSOffice.Object.Library --version 15.0.4420.1018

The NuGet Team does not provide support for this client. Please contact its maintainers for support.

#r "nuget: MSOffice.Object.Library, 15.0.4420.1018"

#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.

// Install MSOffice.Object.Library as a Cake Addin
#addin nuget:?package=MSOffice.Object.Library&version=15.0.4420.1018

// Install MSOffice.Object.Library as a Cake Tool
#tool nuget:?package=MSOffice.Object.Library&version=15.0.4420.1018

The NuGet Team does not provide support for this client. Please contact its maintainers for support.

 

SanMiguel

Пользователь

Сообщений: 3
Регистрация: 19.03.2020

Приветствую!

Макрос для выгрузки данных из Excel в Word. Проблема вот в чем:

Макрос прекрасно работает в версиях Excel 2016/2019. Но в Excel 2010 не может найти библиотеку Microsoft Word 16.0 Object Library – пишет MISSING. Если ручками убрать библиотеку 16.0 и поставить 14.0, то макрос запускается. Я как понял, нужно использовать позднее связывание, но куда его запилить ума не приложу.
Ругается на 3 строку (Public AppWord As Word.Application, iWord As Word.Document).
Буду признателен за помощь.

Код
Option Explicit
Option Private Module

Public AppWord As Word.Application, iWord As Word.Document



Sub CreateDoc()
Dim MyArray(), BasePath As String, iFolder As String, iTemplate As String
Dim tmpArray, tmpSTR As String, iRow As Long, iColl As Long, i As Long, j As Long, q As Long

Application.ScreenUpdating = 0
On Error GoTo iEnd

iFolder = Range("FILE_WORD").Value: If Right(iFolder, 1) <> "" Then iFolder = iFolder & ""
iTemplate = Range("FILE_TEMPLATE").Value: If Right(iTemplate, 1) = ";" Then iTemplate = Left(iTemplate, Len(iTemplate) - 1)
BasePath = ThisWorkbook.Path & "Result": Call FolderCreateDel(BasePath)

With Sheets("data")
    iRow = .UsedRange.Row + .UsedRange.Rows.Count - 1: iColl = .UsedRange.Column + .UsedRange.Columns.Count - 1
    MyArray = .Range(.Cells(1, 1), .Cells(iRow, iColl)).Value
End With

'создаем скрытый объект Word
Set AppWord = CreateObject("Word.Application"): AppWord.Visible = False

'перебираем массив
For i = 2 To iRow
    If MyArray(i, 1) = "ok" Then
    
        'перебираем указанные word-шаблоны
        tmpArray = Split(MyArray(i, 3), ";")
        For q = 0 To UBound(tmpArray)
            tmpSTR = iFolder & tmpArray(q) & ".docx"
            If Len(Dir(tmpSTR)) > 0 Then
                Set iWord = AppWord.Documents.Open(tmpSTR, ReadOnly:=True)
            
                'делаем замену переменных
                For j = 4 To iColl
                    Call ExportWord(MyArray(1, j), MyArray(i, j))
                Next j
                
                iWord.SaveAs Filename:=BasePath & MyArray(i, 2) & " - " & tmpArray(q) & ".docx", FileFormat:=wdFormatXMLDocument
                iWord.Close False: Set iWord = Nothing
            End If
            'tmpSTR = ""
        Next q
        'Erase tmpArray

    End If
Next i

AppWord.Quit: Set AppWord = Nothing
'Erase MyArray: BasePath = "": iFolder = "": iTemplate = ""

Application.ScreenUpdating = 1
MsgBox "Файлы сформированы.", vbInformation

Exit Sub

iEnd:
    AppWord.Quit: Set AppWord = Nothing
    'Erase MyArray: BasePath = "": iFolder = "": iTemplate = ""
    Application.ScreenUpdating = 1
    MsgBox "При обработке данных возникла ошибка.", vbCritical
End Sub

      В данной инструкции рассмотрен пример получения данных из таблиц, содержащихся в файле Microsoft Word. Для реализации данной задачи используется объектная библиотека «Microsoft Word 14.0 Object Library».
      Создайте проект Windows Form в Microsoft Visual Studio, для этого запустите среду разработки и перейдите в меню Файл->Создать…->Проект. Выберете версию .Net Fraemwork и введите имя проекта. После создания проекта, добавьте на форму три компонента:

  • textBox1 — в данном компоненте будет выводится путь, имя и расширение выбранного файла;
  • button1 – кнопка для запуска процесса получения данных из выбранного файла;
  • dataGridView1 – элемент управления необходимый для отображения полученных данных.

      Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».

Установите следующие параметры в свойствах компонента:

  • Dock None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления (http://microsoft.com) 
  • Anchor Top, Bottom, Left, Right — свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента (http://microsoft.com).

      Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».

      У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.

  • Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
  • Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
  • COM — список всех COM-компонентов, ссылки на которые можно добавить.
  • Обзор — позволяет осуществлять поиск компонента в файловой системе.

      Выберете группу «COM» и ее подгруппу «Библиотеки типов». В центральной части окна вам будет предложен список доступных библиотек для подключения к вашему проекту. Найдите в списке библиотеку «Microsoft Word 14.0 Object Library» и поставьте галочку рядом с именем данной библиотеки. В нижней части окна нажмите кнопку «ОК».

После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:

  • Microsoft.Office.Core;
  • Microsoft.Office.Interop.Word;
  • VBIDE.

      Для извлечения таблиц содержащихся в документе Word воспользуемся коллекцией «Tables», являющейся членом классов «Microsoft.Office.Interop.Word.Document», «Microsoft.Office.Tools.Word.Document», «Selection» и «Range», это означает, что можно прочитать или создать таблицу в контексте любого из них. Для работы с добавленными ссылками необходимо добавить следующие пространства имен с использованием директивы «using»:
using WordObj = Microsoft.Office.Interop.Word; — создается псевдоним пространства имен «Microsoft.Office.Interop.Word».
      В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Word.

OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";

      После выбора файла выполняется проверка, что файл действительно выбран. Если данное условие выполнено, создается новый объект «Application» или приложение «Word». Далее необходимо открыть указанный документ и добавить его в коллекцию документов, данную функцию выполняет метод «Documents.Open». Для загрузки данных из необходимой таблицы, выбирается активный документ из коллекции с помощью метода «ActiveDocument», из которого выбирается таблица для открытия. Нумерация таблиц начинается с 1.

      Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click». Добавьте приведенный ниже листинг кода в тело данного метода.

OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    textBox1.Text = dialog.FileName;
    WordObj.Application application = new WordObj.Application();
    Object FileName = dialog.FileName;
    application.Documents.Open(ref FileName);
    WordObj.Document document = application.ActiveDocument;
    WordObj.Table table = document.Tables[1];
    if (table.Rows.Count > 0 && table.Columns.Count > 0)
    {
        List headers = new List();
        DataTable dataTable = new DataTable();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            dataTable.Columns.Add();
            headers.Add(table.Cell(1, i + 1).Range.Text.Trim('a', 'r', 'n', 't'));
        }
        for (int i = 0; i < table.Rows.Count - 1; i++)
        {
            string[] row = new string[table.Columns.Count];
            for (int j = 0; j < table.Columns.Count; j++)
                row[j] = table.Cell(i + 2, j + 1).Range.Text.Trim('a', 'r', 'n', 't');
            dataTable.Rows.Add(row);
        }
        dataGridView1.DataSource = dataTable;
        for (int i = 0; i < headers.Count; i++)
            dataGridView1.Columns[i].HeaderText = headers[i];
    }
    application.Quit();
}

      Запустите проект, нажав на клавиатуре клавишу «F5». Нажмите на кнопку «Открыть», расположенную на форме. В открывшемся диалоговом окне выберете файл Microsoft Word содержащий табличные данные и нажмите кнопку «Открыть», расположенную в нижней части окна. Если в файле содержались таблицы, то первая из них расположенная ближе к началу документа будет загружена.

      В случае если открываемый вами файл занят другим процессом или открыт другим пользователем, Microsoft Word выдаст вам предупреждение «Файл уже используется» и предложит несколько вариантов действий. Выберете первый вариант «Открыть только для чтения» – документ откроется на несколько секунд для загрузки данных и закроется.

      Вы можете усложнить проект и добавить элемент управления «ComboBox», в котором будет предлагаться выбрать номер таблицы и посмотреть хранящиеся в ней данные. Для этого перейдите в «Панель элементов» и добавьте элемент управления «ComboBox» на главную форму проекта. У вас получится приведенный ниже вариант.

      Сделайте двойной клик по добавленному компоненту, вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged», события «SelectedIndexChanged» происходящего каждый раз при выборе элемента из выпадающего списка компонента. Добавьте приведенный ниже код вызова метода, реализующего загрузку таблицы по номеру выделенного элемента в компоненте «comboBox1». В данном коде методу «LoadData», в качестве параметра передается свойство «SelectedIndex» содержащее номер выбранного элемента из списка, так как нумерация элементов списка начинается с нуля, а таблицы нумеруются с единицы, к данному числу прибавляется 1.

LoadData(comboBox1.SelectedIndex + 1);

Добавьте приведенный ниже листинг загрузки выбранной таблицы в листинг главной формы.

WordObj.Application application;
WordObj.Document document;
public void LoadData(int TableNum)
{
    WordObj.Table table = document.Tables[TableNum];
    if (table.Rows.Count > 0 && table.Columns.Count > 0)
    {
        List headers = new List();
        DataTable dataTable = new DataTable();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            dataTable.Columns.Add();
            headers.Add(table.Cell(1, i + 1).Range.Text.Trim('a', 'r', 'n', 't'));
        }
        for (int i = 0; i < table.Rows.Count - 1; i++)
        {
            string[] row = new string[table.Columns.Count];
            for (int j = 0; j < table.Columns.Count; j++)
                row[j] = table.Cell(i + 2, j + 1).Range.Text.Trim('a', 'r', 'n', 't');
            dataTable.Rows.Add(row);
        }
        dataGridView1.DataSource = dataTable;
        for (int i = 0; i < headers.Count; i++)
            dataGridView1.Columns[i].HeaderText = headers[i];
    }
}

      В методе «button1_Click», события «Click», компонента «Button1» замените существующий листинг, на приведенный ниже. Данный код реализует предварительную очистку списка таблиц, открытие документа, по количеству таблиц находящихся в документе заполняется элемент управления «comboBox1» и выбирается первый.

comboBox1.Items.Clear();
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    textBox1.Text = dialog.FileName;
    application = new WordObj.Application();
    Object FileName = dialog.FileName;
    application.Documents.Open(ref FileName);
    document = application.ActiveDocument;
    for (int i=1; i <= document.Tables.Count; i++)
    {
        comboBox1.Items.Add("Таблица №"+i);
    }
    comboBox1.SelectedIndex = 0;
    LoadData(comboBox1.SelectedIndex + 1);                
}

      По завершению работы с документом его необходимо закрыть, перейдите в конструктор главной формы, выполнив сочетание клавиш «Shift+F7». Сделайте клик правой клавишей мыши по свободному пространству главной формы и выберете из открывшегося контекстного меню, пункт «Свойства». В верхней части окна свойств расположена кнопка с рисунком молнии, нажав на нее, вы перейдете в события главной формы. Найдите событие «FormClosed» и сделайте по нему двойной клик левой клавишей мыши.

      Вы перейдете в автоматически созданный метод «Form1_FormClosed», который будет выполняться при закрытии вашего приложения. Добавьте в него приведенный ниже код.

application.Quit();

      Запустите ваш проект, выберете документ, содержащий более одной таблицы. В выпадающем списке вы увидите номера таблиц доступные для выбора. Сделав клик по любой из них, данные автоматически будут загружены.

So I had this macro file that worked fine until this afternoon after another colleague of mine ran the macro.

when i opened it, it kept showing Loading DLL Error

enter image description here

I went into the object library, to find this:

enter image description here

Not exactly familiar with object library references here but are there any quick fixes to this?

I’ve tried unchecking the missing MS 16 word object but it just resets itself right after i click «OK»

Community's user avatar

asked Jul 24, 2017 at 8:59

adam's user avatar

You have a reference to Word 2016, but is it installed at your colleague’s computer?
The quick workaround is to find a reference with a similar name further down the list. Microsoft Word 15 Object Library or similar will most likely do. If there’s nothing like it, it is time to re-install Office
Changing the reference is a bit cumbersome though, as it’ll stop working at yours. Then you must replace all your declarations of Word objects in your code with CreateObject(…)

answered Jul 24, 2017 at 9:22

Sam's user avatar

SamSam

5,1921 gold badge18 silver badges32 bronze badges

1

When using same workbook from different Excel versions and with VBA reference to the Word application — you will get this error.
Use late binding (CreateObject..) and no reference!

answered Jan 16, 2018 at 10:09

Steen BN CPH-DK's user avatar

First create the directory where the missing Word 16 object library should be. You will find the path at the bottom of the references window. It may be: C:Program Files (x86)Microsoft OfficerootOffice16. Then copy the library MSWORD.OLB found in Office14 to this new directory. Save, exit Excel, reopen. It should be ok: and 16 object library should have been automatically replaced by working Word 14 object library reference in references window.

answered Dec 23, 2021 at 14:19

oasisllc's user avatar

0 / 0 / 0

Регистрация: 27.07.2017

Сообщений: 9

1

VS 2017

03.07.2019, 17:18. Показов 8783. Ответов 3


Студворк — интернет-сервис помощи студентам

Вчера установил Microsoft Office — Ворд, Эксель и Паверпоинт. Хотел создавать вордовские файлы и записывать в них инфу через программку. Подключил собственно «Microsoft Word 16.0 Object Library». Написал код. Все работает, файлы создаются, открываются. Проходит ночь. Открываю снова тот же проект. Все открылось, но бесконечно по центру висит окно «загрузка решения». Я закрыл студию и снова открыл проект. На первый взгляд все хорошо, но нет. Ошибка при сборке решения. Честно я не очень помню что там было. Что-то вроде «Проблемы при инициализации библиотеки 000000-0000016-..итд». Методом тыка понял, что ошибку вызывает строка «using Microsoft.Office.Interop.Word». Думаю что что-то с подключением библиотек может. Зашел в ссылки и снял галку с «Microsoft Word 16.0 Object Library». Закрыл окно. Открыл снова. Библиотеки уже нет. Есть библиотека Экселя, есть библиотека просто Офиса, а Ворда нет. Она есть в недавних, но подключить не получается. Пишет просто «не удается добавить ссылку на…». При наведении показывает путь к файлу MSWORD.OLB в папке Офиса. Он есть и не изменялся с момента создания.
У кого нибудь есть идеи как это пофиксить? Я просто вообще не знаю что делать.



0



106 / 82 / 15

Регистрация: 07.06.2011

Сообщений: 582

Записей в блоге: 2

03.07.2019, 21:28

2

Цитата
Сообщение от NirL
Посмотреть сообщение

Библиотеки уже нет.

Попробуйте добавьте ссылку на файл MSWORD.OLB. Не через прежнее меню добавления ссылок, а там рядом где-то через меню добавления ссылок через выбор конкретного файла.



0



0 / 0 / 0

Регистрация: 27.07.2017

Сообщений: 9

04.07.2019, 00:13

 [ТС]

3

Выбираю файл, он появляется в меню, ставлю галку, нажимаю ок и выдает ошибку «Не удается добавить ссылку на ‘…MSWORD.OLB’. Не удается зарегестрировать библиотеку ActiveX ‘…MSWORD.OLB1’. Сборка должна иметь расширение ‘dll’ или ‘exe’ чтобы на нее можно было ссылаться.»

Добавлено через 38 минут
Я похоже залез куда то, что не понимаю вообще. Как я обнаружил после долгого гугления, у меня вроде как библиотека типов не зарегестрирована в реестре. Но как ее зарегестрировать и почему так получилось я понятния не имею.



0



0 / 0 / 0

Регистрация: 27.07.2017

Сообщений: 9

04.07.2019, 11:07

 [ТС]

4

Помогла полная переустановка Офиса с очисткой реестра. Но боюсь что пропажа библиотеки может случиться снова.



0



  • Remove From My Forums
  • Вопрос

  • How does one get the Microsoft Word 16.0 Object Library viewable in Visual Studio ’19’s Reference Manager?  I have uninstalled and reinstalled Microsoft 365 products.  I have double checked in Excel’s VBA IDE and the reference library I am looking
    for is there and easily available.  I have tried also loading in the MSWord.OLB file (the same one in Excel’s VBA IDE), but Visual Stuido won’t allow me to enable that reference.

    How do I fix this as trying to load the MSWord.OLB file gives the following response:

    «A reference to ‘C:Program FilesMicrosoft OfficerootOffice16MSWORD.OLB’ could not be added.  Please make sure that the file is accessible, and that it is a valid assembly or COM component»

    • Изменено

      3 сентября 2020 г. 0:41

    • Перемещено
      Xingyu ZhaoMicrosoft contingent staff
      15 сентября 2020 г. 7:13

Like this post? Please share to your friends:
  • Microsoft word not saving documents
  • Microsoft word not opening documents
  • Microsoft word not on windows 8
  • Microsoft word not on computer
  • Microsoft word not loading