App new word application

Создание нового экземпляра приложения Word из кода VBA Excel или подключение к открытому для работы с документами. Функции CreateObject и GetObject.

Работа с Word из кода VBA Excel
Часть 1. Управление приложением Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]

Создание объекта Word.Application

Экземпляр приложения Word необходим для того, чтобы с его помощью создавать новые документы или открывать существующие для редактирования из кода VBA Excel.

Создать новый экземпляр объекта Word.Application можно при помощи раннего или позднего связывания, используя при позднем связывании функцию CreateObject. Подключиться к открытому экземпляру приложения Word можно только при помощи позднего связывания, используя функцию GetObject.

Раннее связывание приложения Word

Создание нового экземпляра Word.Application и присвоение ссылки на него переменной myWord:

‘Создание экземпляра приложения Word

‘с ранней привязкой одной строкой

Dim myWord As New Word.Application

‘Создание экземпляра приложения Word

‘с ранней привязкой двумя строками

Dim myWord As Word.Application

Set myWord = New Word.Application

Для раннего связывания переменной с объектом Word.Application необходимо подключить в редакторе VBA Excel ссылку на библиотеку Microsoft Word Object Library, если она не подключена. Подключается ссылка в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References…

Раннее связывание позволяет при написании кода использовать лист подсказок для выбора и вставки свойств и методов привязанных объектов (Auto List Members). Если проект VBA Excel создается на заказ, то, после его завершения, раннее связывание следует заменить на позднее, так как на компьютере пользователя может не оказаться нужной библиотеки, и код работать не будет.

Позднее связывание приложения Word

Создание нового экземпляра Word.Application с помощью функции CreateObject и присвоение ссылки на него переменной myWord:

Dim myWord As Object

Set myWord = CreateObject(«Word.Application»)

Присвоение переменной myWord ссылки на открытый экземпляр приложения Word с помощью функции GetObject:

Dim myWord As Object

Set myWord = GetObject(, «Word.Application»)

Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Чтобы ее избежать, следует предусмотреть создание нового экземпляра Word.Application с помощью функции CreateObject, если открытое приложение не будет найдено (смотрите пример 3).

В программы VBA Excel, работающие с Word, следует включать обработчик ошибок.

Закрытие объекта Word.Application

Новый экземпляр приложения Word открывается в фоновом режиме. Если необходимо его отобразить на экране перед завершением программы, используйте следующий код:

‘отображаем приложение Word

myWord.Visible = True

‘освобождаем переменную от ссылки

Set myWord = Nothing

Если перед завершением процедуры VBA Excel необходимо приложение Word закрыть, используйте метод Quit:

‘закрываем приложение Word

myWord.Quit

‘освобождаем переменную от ссылки

Set myWord = Nothing

Если переменная не содержит ссылку на приложение (myWord = Nothing), метод Quit возвратит ошибку. Чтобы этого не произошло, перед применением метода Quit необходимо проверить наличие ссылки в переменной myWord (смотрите пример 3).

Пример 1
Создаем новый экземпляр объекта Word.Application с ранним связыванием и отображаем его на экране:

Sub Primer1()

Dim myWord As New Word.Application

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

Set myWord = Nothing

End Sub

Запустите код примера 1 на выполнение. Вы увидите появившийся на панели задач ярлык приложения Word. Перейдите на него и закройте приложение вручную.

Пример 2
Создаем новый экземпляр объекта Word.Application с поздним связыванием, отображаем его на экране, останавливаем программу и наблюдаем закрытие приложения методом Quit:

Sub Primer2()

Dim myWord As Object

Set myWord = CreateObject(«Word.Application»)

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

MsgBox «Остановка программы»

myWord.Quit

Set myWord = Nothing

End Sub

Запустите код примера 2 на выполнение. Закройте информационное окно MsgBox и смотрите, как исчезнет с панели задач ярлык приложения Word, созданного перед остановкой кода.

Пример 3
Пытаемся создать ссылку на открытый экземпляр приложения Word с помощью функции GetObject, а если открытого экземпляра нет, создаем новый с помощью функции CreateObject:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Sub Primer3()

Dim myWord As Object

On Error Resume Next

Set myWord = GetObject(, «Word.Application»)

  If myWord Is Nothing Then

    Set myWord = CreateObject(«Word.Application»)

  End If

On Error GoTo Instr

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

Set myWord = Nothing

Exit Sub

Instr:

  If Err.Description <> «» Then

    MsgBox «Произошла ошибка: « & Err.Description

  End If

  If Not myWord Is Nothing Then

    myWord.Quit

    Set myWord = Nothing

  End If

End Sub

Строка On Error Resume Next передаст управление следующему оператору, если открытого экземпляра программы Word не существует, и выполнение функции GetObject приведет к ошибке. В этом случае будет создан новый экземпляр Word.Application с помощью функции CreateObject.

В код добавлен обработчик ошибок On Error GoTo Instr, который поможет корректно завершить программу при возникновении ошибки. А также он позволит во время тестирования не наплодить большое количество ненужных экземпляров приложения Word. Проверяйте их наличие по Диспетчеру задач (Ctrl+Shift+Esc) и удаляйте лишние.

Строка Exit Sub завершит процедуру, если она прошла без ошибок. В случае возникновения ошибки, будет выполнен код после метки Instr:.

alexs622

25 / 24 / 13

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

Сообщений: 463

1

.NET 4.x

08.09.2017, 21:03. Показов 4211. Ответов 4

Метки word (Все метки)


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

нашел здесь, как заполнить шаблон. А как сохранить в одной книге Word несколько листов заполненного шаблона. Чтоб каждый экземпляр начинался с нового листа

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Word._Application oWord = new Word.Application();
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            // Считывает шаблон и сохраняет измененный в новом
            _Document oDoc = GetDoc(@"C:UsersПропуск.dot");
            oDoc.SaveAs(FileName: Environment.CurrentDirectory + "\For_print.doc");
            oDoc.Close();
        }
 
        private _Document GetDoc(string path)
        {
            _Document oDoc = oWord.Documents.Add(path);
            SetTemplate(oDoc);
            return oDoc;
        }
 
        private void SetTemplate(Word._Document oDoc)
        {
            oDoc.Bookmarks["фамилия"].Range.Text = "иванолв";
            oDoc.Bookmarks["имя"].Range.Text = "иван";
            oDoc.Bookmarks["отчество"].Range.Text = "иваныч";
        }



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

08.09.2017, 21:03

Ответы с готовыми решениями:

Шаблон word-документа
Ув. Форумчане!!!
Помогите пожалуйста с формированием doc-файла посредством xml. Я понимаю, что…

Вшить в программу шаблон word
Хочу вшить в свой проект готовый шаблон word (для удобства сотрудников, захотели посмотреть форму…

Экспорт данных в шаблон Word
Здравствуйте, подскажите как сформировать отчёт из С# в Word.
Заранее спасибо =)

Заполнить шаблон Word
Существует шаблон в ворде. Таблица… 2 колонки…
И неизвестное количество записей в c# в…

4

alexs622

25 / 24 / 13

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

Сообщений: 463

07.11.2017, 13:20

 [ТС]

2

Тема еще актуальна. Надо с одним шаблоном создать несколько листов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Создаём объект документа
            Word.Document doc = null;
            try
            {
                // Создаём объект приложения
                Word.Application app = new Word.Application();
                // Путь до шаблона документа
                string source = @"C:UsersDesktopфамилия.dot";
                // Открываем
                doc = app.Documents.Open(source);
                doc.Activate();
                                
                doc.Bookmarks["фамилия"].Range.Text = "иванов";
                doc.Bookmarks["имя"].Range.Text = "иван";
                doc.Bookmarks["отчество"].Range.Text = "иваныч";
 
                //вызвать разрыв страницы после последнего слова
                doc.Words.Last.InsertBreak(Word.WdBreakType.wdPageBreak);
 
                
 
                /*
                вот здесь наверно создавать второй экземпляр
                */
 
                // Закрываем документ
                doc.SaveAs(@"C:UsersDesktopПропуск" + but.ToString() + ".doc");
                doc.Close();
                doc = null;                
                app.Quit();
                
                //Process.Start(@"C:UsersDesktopПропуск.doc");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                // Если произошла ошибка, то
                // закрываем документ и выводим информацию
                doc.Close();
                doc = null;
                Console.WriteLine("Во время выполнения произошла ошибка!");
                Console.ReadLine();
            }



0



8927 / 4839 / 1885

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

Сообщений: 10,246

07.11.2017, 15:36

3

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



0



25 / 24 / 13

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

Сообщений: 463

07.11.2017, 18:37

 [ТС]

4

Т.е для каждого листа шаблона создать свой Word.Application app и потом их связать? Можно подробнее?



0



ViterAlex

8927 / 4839 / 1885

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

Сообщений: 10,246

08.11.2017, 03:27

5

alexs622, судя по вопросу, ты не совсем понимаешь, что именно происходит. Нужно открыть приложение Word. На основе шаблона создавать новые документы и сохранять эти документы где-нибудь. Затем объединить все документы в один методом IncludeFile. Примерно таким классом это можно реализовать:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public static class WordHelper
{
    private static dynamic _wdApp;
    private static dynamic _wdDoc;
    /// <summary>
    /// Создание приложения Word
    /// </summary>
    public static void CreateApp()
    {
        _wdApp = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
        _wdApp.Visible = true;
    }
    /// <summary>
    /// Создание нового документ
    /// </summary>
    /// <param name="fileName">Полное имя файла нового документа</param>
    /// <param name="template">Путь к шаблону, на основе которого будет создаваться документ</param>
    /// <param name="firstName">Имя</param>
    /// <param name="middleName">Отчество</param>
    /// <param name="lastName">Фамилия</param>
    public static void NewDoc(string fileName, string template, string firstName, string middleName, string lastName)
    {
        _wdDoc = _wdApp.Documents.Add(template);
        _wdDoc.Bookmarks["FirstName"].Range.Text = firstName;
        _wdDoc.Bookmarks["MiddleName"].Range.Text = middleName;
        _wdDoc.Bookmarks["LastName"].Range.Text = lastName;
        _wdDoc.SaveAs(fileName);
        _wdDoc.Close();
    }
 
    /// <summary>
    /// Объединение документов
    /// </summary>
    /// <param name="fileName">Имя результирующего документа</param>
    /// <param name="docs">Полные пути к файлам, которые нужно включить в результирующий документ</param>
    public static void JoinDocs(string fileName, IEnumerable<string> docs)
    {
        _wdDoc = _wdApp.Documents.Add();
        foreach (var doc in docs)
        {
            _wdDoc.Paragraphs.Last.Range.InsertFile($""{doc}"");
            _wdDoc.Paragraphs.Last.Range.InsertBreak(7);//wdPageBreak
        }
        _wdDoc.SaveAs(fileName);
        _wdDoc.Close();
    }
    /// <summary>
    /// Закрытие приложения Word
    /// </summary>
    public static void CloseApp()
    {
        if (_wdApp != null)
        {
            _wdApp.Quit(false);
            _wdApp = null;
        }
    }
}

Как примерно работать:

C#
1
2
3
4
5
WordHelper.CreateApp();
//создаёшь новые документы вызывая нужное количество раз метод NewDoc
//...
//Объединяешь созданные документы в один, вызва JoinDocs
WordHelper.CloseApp();

Что именно делать в методе NewDoc и какие параметры туда передавать — решаешь сам.



0



В этом примере показано, как заставить C# создать документ Word. Сначала откройте диалоговое окно «Добавить ссылки». На вкладке COM выберите «Библиотека объектов Microsoft Word 14.0» (или любую другую версию, установленную в вашей системе).

Добавьте следующий с помощью оператора, чтобы упростить работу с пространством имен Word. Часть Word = означает, что вы можете использовать Word как псевдоним для пространства имен.

using Word = Microsoft.Office.Interop.Word;

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

 // Создаем документ Word.
private void btnGo_Click (отправитель объекта, EventArgs e)
{
// Получить объект приложения Word.
Word._Application word_app = new Word.ApplicationClass ();

// Сделать Word видимым (необязательно).
word_app.Visible = true;

// Создаем документ Word.
object missing = Type.Missing;
Word._Document word_doc = word_app.Documents.Add (
ref missing, ref missing, ref missing, ref missing);

// Создаем абзац заголовка.
Word.Paragraph para = word_doc.Paragraphs.Add (ref missing);
para.Range.Text = "Кривая хризантемы";
object style_name = "Заголовок 1";
para.Range.set_Style (ref style_name);
para.Range.InsertParagraphAfter ();

// Добавить текст.
para.Range.Text = «Сделать кривую хризантемы» +
«используйте следующие параметрические уравнения, когда t идет» +
"от 0 до 21 *? для генерации" +
«точки, а затем соединить их»;
para.Range.InsertParagraphAfter ();

// Сохраним текущий шрифт и начнем с использования Courier New.
string old_font = para.Range.Font.Name;
para.Range.Font.Name = "Courier New";

// Добавим уравнения.
para.Range.Text =
"r = 5 * (1 + Sin (11 * t / 5)) - n" +
«4 * Sin (17 * t / 3) ^ 4 * n" +
«Sin (2 * Cos (3 * t) - 28 * t) ^ 8 n" +
"x = r * Cos (t) n" +
"y = r * Sin (t)";

// Начнем новый абзац, а затем
// вернемся к исходному шрифту.
para.Range.InsertParagraphAfter ();
para.Range.Font.Name = old_font;

// Сохраним документ.
object filename = Path.GetFullPath (
Path.Combine (Application.StartupPath, ".. \ ..")) +
"\ test.doc";
word_doc.SaveAs(ref filename, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing);

// Закрыть.
object save_changes = false;
word_doc.Close (ref save_changes, ref missing, ref missing);
word_app.Quit (ref save_changes, ref missing, ref missing);
}

В этом примере видится сервер Word. В реальном приложении вы можете захотеть сохранить его скрытым.

Объектная модель Word использует множество вызовов методов, которые по какой-то причине принимают множество параметров по ссылке, даже если они не изменяются методами. Это означает, что вы должны поместить значения для этих параметров в переменные. Например, вы не можете использовать true как логический параметр, потому что вы не можете передавать константу по ссылке. Аналогично, вы не можете использовать литеральную строку, такую как C: wherever test.doc для имени файла, который вы открываете, потому что это не назначаемая переменная.

Код создает специальную переменную с именем missing, которая имеет значение Type.Missing. Код может использовать это значение для любых необязательных параметров, которые ему не нужно передавать методам Word. Затем программа использует его при вызове вызова Documents.Add сервера Word, который создает новый документ Word.

Теперь программа начинает добавлять текст в документ. Он добавляет объект Paragraph к коллекции документа Paragraphs.

Одним из наиболее важных объектов в Word является Range. A Диапазон представляет собой кусок документа. Код устанавливает текст нового абзаца в «Кривую хризантемы». Затем он устанавливает стиль объекта Range в «Заголовок 1.». Снова обратите внимание на нечетный способ, которым он должен поместить значение в переменную перед вызовом set_Style, чтобы он мог передавать имя стиля по ссылке.

Затем код вызывает метод Range объекта InsertParagraphAfter. Это добавляет метку абзаца после текущего текста объекта Range и обновляет Range, чтобы перейти к новому абзацу. Теперь Range готов добавить больше текста после первого абзаца.

Код снова устанавливает текст объекта Range для добавления нового текста и вызовов InsertParagraphAfter снова.

Далее код добавляет некоторый текст, отформатированный как код с шрифтом Courier New. Он сохраняет имя текущего шрифта и устанавливает шрифт объекта Range в Courier New. С этого момента новый текст будет иметь этот шрифт.

Код снова устанавливает текст объекта Range и добавляет новый знак абзаца. Затем он восстанавливает исходное имя шрифта, поэтому будущий текст будет в исходном шрифте.

Затем код вызывает метод SaveAs документа Word для сохранения нового документа. Это перезаписывает любой существующий файл с этим именем без предупреждения. Если вы хотите убедиться, что файл еще не существует, используйте File.Exists для проверки.

Наконец, код закрывает документ Word и приложение Word.

Источник: http://csharphelper.com/blog/2014/11/create-a-word-document-in-c/

Table of Contents

  • Introducing Interop.Word
  • Working with the Document
    • Find and Replace Text
    • Find and replace Bookmarks
    • Convert a DOC / DOCX file to PDF
    • Export a DOC / DOCX file into a PDF
  • From a Byte Array

If you’re working with ASP.NET C# and you need to open, edit or otherwise access a Microsoft Word DOC or DOCX file, you can easily do that using the Microsoft.Office.Interop.Word library package. This post explains how to do so: you might find it useful in case you need to perform such task or whenever you want to read some insights regarding the process.

Introducing Interop.Word

To access the namespace from your ASP.NET project you have two main choices:

  • Install the official Microsoft Office primary interop assemblies (PIAs) package on your machine by downloading and executing the runtime installer, then manually add a Reference to the Microsoft.Office.Interop.Word.dll file.
  • Install the appropriate NuGet package within Visual Studio using the Package Manager Console.

Needless to say, you should really go for the second option, but we’ll leave that to you.

Working with the Document

As soon as you have the namespace available, you can do the following:

// NS alias to avoid writing the required namespace all the time

using word = Microsoft.Office.Interop.Word;

// […]

Application app = new word.Application();

Document doc = app.Documents.Open(filePath);

Once you have the app and the doc objects you can perform a lot of editing task, such as:

Find and Replace Text

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

var textToFind = «any source text»;

var textToReplace = «any replacement text»;

var matchCase = true;

var matchWholeWord = true;

var matchWildcards = false;

var matchSoundsLike = false;

var matchAllWordForms = false;

var forward = true;

var wrap = 1;

var format = false;

var replace = 2;

app.Selection.Find.Execute(

    textToFind,

    matchCase,

    matchWholeWord,

    matchWildcards,

    matchSoundsLike,

    matchAllWordForms,

    forward,

    wrap,

    format,

    textToReplace,

    replace);

Find and replace Bookmarks

var bookmarkName = «anyName»;

var bookmarkNewValue = «anyValue»;

if (doc.Bookmarks.Exists(bookmarkName)) {

    doc.Bookmarks[bookmarkName].Select();

    app.Selection.TypeText(bookmarkNewValue);

}

Convert a DOC / DOCX file to PDF

Surprisingly enough, we can even do that with an one-liner thanks to the native «Save As PDF…» feature introduced with Office 2010.

doc.SaveAs2(«path-to-pdf-file.pdf», word.WdSaveFormat.wdFormatPDF);

Export a DOC / DOCX file into a PDF

This one is almost identical to the previous one in terms of results.

doc.ExportAsFixedFormat(tmpFile, WdExportFormat.wdExportFormatPDF);

… and so on.

For additional info regarding word-to-pdf conversion, you can also read this dedicated post: otherwise, keep reading.

What if you have the DOC or DOCX file stored outside the FileSystem, such as in blob-format within a Database? If that’s the case you need to use a temporary file, because most Office Interop methods do not support working with byte arrays, streams and so on.

Here’s a decent workaround you can use:

// byte[] fileBytes = getFileBytesFromDB();

var tmpFile = Path.GetTempFileName();

File.WriteAllBytes(tmpFile, fileBytes);

Application app = new word.Application();

Document doc = app.Documents.Open(filePath);

// .. do your stuff here …

doc.Close();

app.Quit();

byte[] newFileBytes = File.ReadAllBytes(tmpFile);

File.Delete(tmpFile);

You might notice that we used the

Close()

method in order to close (and thus save) the file. In case you wan’t to save your changes to the DOC / DOCX file you opened, you need to explicitly say it by adding the

WdSaveOptions.wdDoNotSaveChanges

object parameter in the following way:

doc.Close(word.WdSaveOptions.wdDoNotSaveChanges);

IMPORTANT: Do not underestimate the call to

app.Quit()

! If you don’t do that, the MS Word instance will be left open on your server (see this thread on StackOverflow for more info on that issue). If you want to be sure to avoid such dreadful scenario entirely you should strengthen the given implementation adding a try/catch fallback strategy such as the follow:

Application app = null;

Document doc = null;

try

{

    app = new word.Application();

    doc = Document doc = app.Documents.Open(filePath);

    // .. do your stuff here …

    doc.Close();

    app.Quit();

}

catch (Exception e)

{

    if (doc != null) doc.Close();

    if (app != null) app.Quit();

}

Unfortunately these objects don’t implement IDisposable, otherwise it would’ve been even easier.

That’s pretty much it: happy coding!

Вставка текста в 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/

Использование Word в приложениях на Visual Basic 6 открывает широчайшие возможности для создания профессионально оформленных документов (например отчетов). Это часто необходимо при работе в фирме или на предприятии для обеспечения документооборота. Основным преимуществом использования Wordа в этом случае является то, что практически на всех компьютерах, используемых в фирмах и на предприятиях установлены Windows и пакет Microsoft Office. Поэтому подготовленные документы Word не требуют каких-либо дополнительных усилий для их просмотра, печати и редактирования. Единственное что нужно помнить, это то что работа через автоматизацию OLE (связывание и внедрение объектов) на деле оказывается довольно медленной технологией, хотя и очень полезной.

Чтобы использовать объекты Word в Visual Basic , необходимо инсталлировать сам Word. После этого вы получаете в своё распоряжение библиотеку Microsoft Word Object Library, которую нужно подключить к текущему проекту через диалоговое окно «Разработать»>>»Ссылки» (References) и указать Microsoft Word 9.0 Object Library (для Word 2000).

Два самых важных объекта Word это Word.Application и Word.Document. Они обеспечивают доступ к экземпляру приложения и документам Word.

Поэтому в раздел Generals «Общее» формы введите следующий код для объявления объектных переменных приложения Word и документа Word.

Dim WordApp As Word.Application '  экземпляр приложения
Dim DocWord As Word.Document'  экземпляр документа

Чтобы создать новый экземпляр Word, введите такой код кнопки;

Private Sub Комманда1_Click()

'создаём  новый экземпляр Word-a
Set WordApp = New Word.Application

'определяем видимость Word-a по True - видимый,
'по False - не видимый (работает только ядро)
WordApp.Visible = True

'создаём новый документ в Word-e
Set DocWord = WordApp.Documents.Add

'// если нужно открыть имеющийся документ, то пишем такой код
'Set DocWord = WordApp.Documents.Open("C:DDD.doc")

'активируем его
DocWord.Activate

End Sub

Для форматирования печатной области документа используйте данный код:

(вообще-то Word использует для всех размеров своих элементов пункты, поэтому для использования других единиц измерения, необходимо использовать встроенные функции форматирования.)

Например:

  • CentimetersToPoints(Х.ХХ) — переводит сантиметры в пункты.
  • MillimetersToPoints(X.XX) — переводит миллиметры в пункты
Private Sub Комманда2_Click()

'отступ слева "2,0 сантиметра"
DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)

'отступ справа "1,5 сантиметра"
DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5)

'отступ сверху "3,5 сантиметра"
DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(3.5)

'отступ снизу "4,45 сантиметра"
DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(4.45)

End Sub

Небольшое отступление.

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

Например код находящейся выше можно переписать так:

With DocWord.Application.Selection.PageSetup
.LeftMargin = CentimetersToPoints(2)
.RightMargin = CentimetersToPoints(1.5)
.TopMargin = CentimetersToPoints(3.5)
.BottomMargin = CentimetersToPoints(4.45)
End With

Если вам необходимо создать документ Word с нестандартным размером листа, то используйте данный код:

With DocWord.Application.Selection.PageSetup
.PageWidth = CentimetersToPoints(20)    'ширина листа (20 см)
.PageHeight = CentimetersToPoints(25)   'высота листа (25 см)
End With

Данный код меняет ориентацию страницы (практически меняет местами значения ширины и высоты листа):

 
DocWord.Application.Selection.PageSetup.Orientation = wdOrientLandscape
  • wdOrientLandscape — альбомная ориентация ( число 1)
  • wdOrientPortrait — книжная ориентация ( число 0)

Для сохранения документа под новым именем и в определенное место
используйте данный код код:

'сохраняем документ как
DocWord.SaveAs "c:DDD.doc"

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

'сохраняем документ
DocWord.Save

Или проверить, были ли сохранены внесенные изменения свойством Saved и если изменения не были сохранены — сохранить их;

If DocWord.Saved=False Then DocWord.Save

Завершив работу с документом, вы можете закрыть сам документ методом Close и сам Word методом Quit.

'закрываем документ (без запроса на сохранение)
DocWord.Close True

'закрываем Word (без запроса на сохранение)
WordApp.Quit True

'уничтожаем обьект - документ
Set DocWord = Nothing

'уничтожаем обьект - Word
Set WordApp = Nothing

Если в методах Close и Quit не использовать необязательный параметр True то Word запросит согласие пользователя (если документ не был перед этим сохранён) на закрытие документа.

Если вам необходимо оставить Word открытым, просто не используйте методы Close и Quit.

Если вам необходимо поставить пароль на документ, то используйте код:

DocWord.Protect wdAllowOnlyComments, , "123456789"

Пример программы можно скачать здесь.

      Большинству операций, выполняемых программным способом, есть эквиваленты в пользовательском интерфейсе (UI), доступные как команды в меню и на панелях инструментов. Также существует нижележащая архитектура, обеспечивающая поддержку команд, выбираемых из UI. Всякий раз, когда вы создаете новый документ Word, он базируется на каком-либо шаблоне; расширение файлов шаблонов «.dot», а файлы документов – «.doc». Шаблон Word может содержать текст, код, стили, панели инструментов, элементы автотекста, комбинации клавиш для быстрого доступа к командам. Новый документ связывается с шаблоном и получает полный доступ к его элементам. Если вы не указываете конкретный шаблон, новый документ создается на основе стандартного шаблона «Normal.dot», который устанавливается при установке Word).

      Шаблон Normal.dot является глобальным, он доступен любому документу, который вы создаете. Вы могли бы при желании поместить весь свой код в Normal.dot и создавать все документы в своей среде на основе собственного шаблона Normal (Обычный). Но тогда его файл мог бы стать чрезмерно большим, поэтому более эффективное решение для многих разработчиков — создание собственных шаблонов для конкретных приложений. В документах, создаваемых на основе вашего шаблона, код из стандартного шаблона Normal по-прежнему будет доступен. При необходимости можно связывать документ с несколькими шаблонами в дополнение к шаблону Normal.

      Для работы с приложением Microsoft Word в .NET, используется объект Application, который является предком всех остальных объектов. Получив на него ссылку, вы можете работать с его методами и свойствами. Этот объект предоставляет большой набор методов и свойств, позволяющих программным путем управлять Microsoft Word. Код инициализации нового объекта Application, представлен ниже.

Microsoft.Office.Interop.Word.Application winword = 
  new Microsoft.Office.Interop.Word.Application();

Чтобы открыть существующий документ или создать новый, необходимо создать новый объект Document.

object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Document document =
     winword.Documents.Add(ref missing, ref missing, ref missing, ref missing);

      Выполняя какую-либо операцию в пользовательском интерфейсе Word (например, добавляя верхний колонтитул), вы выделяете соответствующую секцию, используя объект «Selection», определяющий текущую позицию «невидимого» курсора и применяете к ней новый параметр форматирования с использованием объекта «Range». Данный объект представляет область в документе и может включать в себя все что угодно — от пары символов, до таблиц, закладок и много другого. Вы не ограничены одним объектом «Range» — в одном документе можно определить сразу несколько таких объектов.

//Добавление верхнего колонтитула
foreach (Microsoft.Office.Interop.Word.Section section in document.Sections)
{                   
    Microsoft.Office.Interop.Word.Range headerRange = 
    section.Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    headerRange.Fields.Add(headerRange, Microsoft.Office.Interop.Word.WdFieldType.wdFieldPage);
    headerRange.ParagraphFormat.Alignment = 
    Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
    headerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdBlue;
    headerRange.Font.Size = 10;
    headerRange.Text = "Верхний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com";
}

//Добавление нижнего колонтитула
foreach (Microsoft.Office.Interop.Word.Section wordSection in document.Sections)
{                   
    Microsoft.Office.Interop.Word.Range footerRange =
   wordSection.Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    
    footerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdDarkRed;
    footerRange.Font.Size = 10;
    footerRange.ParagraphFormat.Alignment = 
    Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
    footerRange.Text = "Нижний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com";
}

Чтобы добавить текст в документ, необходимо указать позицию для вставки и сам текст.

//Добавление текста в документ
document.Content.SetRange(0, 0);
document.Content.Text = "www.CSharpCoderR.com" + Environment.NewLine;

Так же вы можете применить к тексту определенный стиль.

//Добавление текста со стилем Заголовок 1
Microsoft.Office.Interop.Word.Paragraph para1 = document.Content.Paragraphs.Add(ref missing);
object styleHeading1 = "Заголовок 1";
para1.Range.set_Style(styleHeading1);
para1.Range.Text = "Исходники по языку программирования CSharp";
para1.Range.InsertParagraphAfter();

      В классе Microsoft.Office.Interop.Word.Document, присутствует коллекция «Tables», которая позволяет добавить таблицу в документ с использованием метода Add.

//Создание таблицы 5х5
Table firstTable = document.Tables.Add(para1.Range, 5, 5, ref missing, ref missing);

firstTable.Borders.Enable = 1;
foreach (Row row in firstTable.Rows)
{
    foreach (Cell cell in row.Cells)
    {
        //Заголовок таблицы
        if (cell.RowIndex == 1)
        {
            cell.Range.Text = "Колонка " + cell.ColumnIndex.ToString();
            cell.Range.Font.Bold = 1;
            //Задаем шрифт и размер текста
            cell.Range.Font.Name = "verdana";
            cell.Range.Font.Size = 10;                                                     
            cell.Shading.BackgroundPatternColor = WdColor.wdColorGray25;
            //Выравнивание текста в заголовках столбцов по центру
            cell.VerticalAlignment = 
                 WdCellVerticalAlignment.wdCellAlignVerticalCenter;
            cell.Range.ParagraphFormat.Alignment = 
                 WdParagraphAlignment.wdAlignParagraphCenter;
        }
        //Значения ячеек
        else
        {
            cell.Range.Text = (cell.RowIndex - 2 + cell.ColumnIndex).ToString();
        }
    }
}

       Для функционирования описанного выше кода, необходимо добавить к текущему проекту объектную библиотеку MS Word. Перейдите в меню «Проект» и выберете команду «Добавить ссылку» или в обозревателе решений, найдите пункт «Ссылки» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете соответствующий пункт.

      В открывшемся окне «Добавить ссылку», перейдите на вкладку «COM» и выберете «Microsoft Word 14.0 Object Library» из предложенного списка библиотек.

В обозревателе решений у вас появится ссылка на данную библиотеку.

      Перейдите в конструктор главной формы и добавьте из панели элементов, командную кнопку «Button». Данный элемент необходим для запуска процесса создания документа и вызов MS Word для отображения.

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

try
{               
    Microsoft.Office.Interop.Word.Application winword = 
        new Microsoft.Office.Interop.Word.Application();
    
    winword.Visible = false;

    //Заголовок документа
    winword.Documents.Application.Caption = "www.CSharpCoderR.com";

    object missing = System.Reflection.Missing.Value;

    //Создание нового документа
    Microsoft.Office.Interop.Word.Document document =
        winword.Documents.Add(ref missing, ref missing, ref missing, ref missing);

    //добавление новой страницы
    //winword.Selection.InsertNewPage();

    //Добавление верхнего колонтитула
    foreach (Microsoft.Office.Interop.Word.Section section in document.Sections)
    {                   
        Microsoft.Office.Interop.Word.Range headerRange = section.Headers[
        Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
        headerRange.Fields.Add(
       headerRange, Microsoft.Office.Interop.Word.WdFieldType.wdFieldPage);
        headerRange.ParagraphFormat.Alignment = 
       Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
        headerRange.Font.ColorIndex = 
       Microsoft.Office.Interop.Word.WdColorIndex.wdBlue;
        headerRange.Font.Size = 10;
        headerRange.Text = "Верхний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com";
    }

    //Добавление нижнего колонтитула
    foreach (Microsoft.Office.Interop.Word.Section wordSection in document.Sections)
    { 
        //
        Microsoft.Office.Interop.Word.Range footerRange =
wordSection.Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
        //Установка цвета текста
        footerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdDarkRed;
        //Размер
        footerRange.Font.Size = 10;
        //Установка расположения по центру
        footerRange.ParagraphFormat.Alignment = 
            Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
        //Установка текста для вывода в нижнем колонтитуле
        footerRange.Text = "Нижний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com";
    }

    //Добавление текста в документ
    document.Content.SetRange(0, 0);
    document.Content.Text = "www.CSharpCoderR.com" + Environment.NewLine;

    //Добавление текста со стилем Заголовок 1
    Microsoft.Office.Interop.Word.Paragraph para1 = document.Content.Paragraphs.Add(ref missing);
    object styleHeading1 = "Заголовок 1";
    para1.Range.set_Style(styleHeading1);
    para1.Range.Text = "Исходники по языку программирования CSharp";
    para1.Range.InsertParagraphAfter();

    //Создание таблицы 5х5
    Table firstTable = document.Tables.Add(para1.Range, 5, 5, ref missing, ref missing);

    firstTable.Borders.Enable = 1;
    foreach (Row row in firstTable.Rows)
    {
        foreach (Cell cell in row.Cells)
        {
            //Заголовок таблицы
            if (cell.RowIndex == 1)
            {
                cell.Range.Text = "Колонка " + cell.ColumnIndex.ToString();
                cell.Range.Font.Bold = 1;
                //Задаем шрифт и размер текста
                cell.Range.Font.Name = "verdana";
                cell.Range.Font.Size = 10;                                                     
                cell.Shading.BackgroundPatternColor = WdColor.wdColorGray25;
                //Выравнивание текста в заголовках столбцов по центру
                cell.VerticalAlignment =
                WdCellVerticalAlignment.wdCellAlignVerticalCenter;
                cell.Range.ParagraphFormat.Alignment = 
                WdParagraphAlignment.wdAlignParagraphCenter;
            }
            //Значения ячеек
            else
            {
                cell.Range.Text = (cell.RowIndex - 2 + cell.ColumnIndex).ToString();
            }
        }
    }
    winword.Visible = true;
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

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

      Для сохранения документа в определенной директории, добавьте приведенный ниже код, после строки «winword.Visible = true;».

//Сохранение документа
object filename = @"d:temp1.docx";
document.SaveAs(ref filename);
//Закрытие текущего документа
document.Close(ref missing, ref missing, ref missing);
document = null;
//Закрытие приложения Word
winword.Quit(ref missing, ref missing, ref missing);
winword = null;

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

Понравилась статья? Поделить с друзьями:
  • App my word book
  • App for word of the day
  • App for pdf to word
  • App for office word
  • Apologize word to friend