- •Лекция 10
- •Объектная модель Word Основы: документы и шаблоны
- •Информация о Normal.Dot
- •Краткий обзор объектной модели Word
- •Объект Application
- •Объект Document
- •Объект Selection
- •Объект Range
- •Объект Bookmark
- •Подведем промежуточный итог
- •Объект Application
- •Использование ThisApplication
- •Свойства Application
- •Методы Application
- •Объект Document
- •Наборы объекта Document
- •Ссылки на документы
- •Создание, открытие и закрытие документов
- •Сохранение документов
- •Объектная модель Excel
Сохранение документов
Сохранять и закрывать документы можно несколькими способами - в зависимости от того, какого результата вы хотите добиться. Для сохранения и закрытия документа вы вызываете методы Save и Close соответственно. Они дают разные результаты в зависимости от того, как именно вы их используете. Если они применяются к объекту Document, их действие распространяется только на соответствущий документ. А если они применяются к набору Documents - на все открытые документы.
Сохранение всех документов Метод Save сохраняет изменения во всех открытых документах, когда применяется к объекту Documents. При этом у вас есть два варианта. Если вы просто вызываете Save набора Documents, пользователю выводится запрос на сохранение всех файлов.
view source
print?
1.' Visual Basic
2.ThisApplication.Documents.Save()
3.
4.// C#
5.Object noPrompt = Type.Missing;
6.Object originalFormat = Type.Missing;
7.
8.ThisApplication.Documents.Save(ref noPrompt, ref originalFormat);
Следующий код устанавливает параметр NoPrompt в True и сохраняет все открытые документы без участия пользователя.
view source
print?
1.' Visual Basic
2.ThisApplication.Documents.Save(NoPrompt:=True)
3.
4.// C#
5.Object noPrompt = true;
6.Object originalFormat = Type.Missing;
7.ThisApplication.Documents.Save(ref noPrompt, ref originalFormat);
Совет По умолчанию NoPrompt равен False, поэтому, если вы вызываете Save без NoPrompt в Visual Basic .NET и с указанием вместо него Type.Missing в C#, пользователю выводится запрос на сохранение.
Сохранение единственного документа Метод Save сохраняет изменения в заданном объекте Document. Следующий фрагмент кода показывает два варианта сохранения активного документа:
view source
print?
01.' Visual Basic
02.' Сохраняем активный документ так…
03.ThisDocument.Save()
04.
05.' …или так
06.ThisApplication.ActiveDocument.Save()
07.
08.// C#
09.// Сохраняем активный документ так…
10.ThisDocument.Save();
11.// …или так
12.ThisApplication.ActiveDocument.Save();
Если вы не знаете точно, активен ли сохраняемый вами документ, ссылайтесь на него по имени. Например:
view source
print?
1.' Visual Basic
2.ThisApplication.Documents("MyNewDocument.doc").Save()
3.
4.// C#
5.Object file = "MyNewDocument.doc";
6.ThisApplication.Documents.get_Item(ref file).Save();
Совет Хотя разработчики на Visual Basic .NET могут получать элементы различных наборов, используя стандартный синтаксис Visual Basic (вызывая свойство Item или пропуская этот необязательный вызови предоставляя индекс или имя), разработчики на C# этого делать, как правило, не могут. Обычно они должны вызывать скрытый метод get_Item с передачей индекса или имени по ссылке, как в предыдущем примере. Разработчики на C# могут обращаться напрямую лишь к элементам массивов (как в массиве Dialogs, уже показанном в одном из примеров).
Альтернативный синтаксис - использование индекса документа, но он ненадежен по двум причинам. Во-первых, нет уверенности, что индекс вашего документа не изменится, а во-вторых, если документ, на который вы ссылаетесь, еще ни разу не сохранялся, появится диалоговое окно Save As. Следующий код сохраняет первый документ в наборе Documents:
view source
print?
1.' Visual Basic
2.ThisApplication.Documents(1).Save()
3.
4.// C#
5.Object file = 1;
6.ThisApplication.Documents.get_Item(ref file).Save();
SaveAs Метод SaveAs позволяет сохранить документ под другим именем файла. Он требует передачи лишь нового имени файла, а остальные аргументы необязательны. Следующая процедура сохраняет документ в соответствии с "зашитым" в код путем и именем файла. Если файл с таким именем в данной папке уже есть, он "молча" перезаписывается. (Заметьте, что метод SaveAs принимает несколько необязательных параметров, о каждом из которых нужно позаботиться, если вы используете C#.)
view source
print?
01.' Visual Basic
02.' Сохраняем документ. В реальном приложении следует проверять
03.' наличие одноименного файла. В данном случае любой
04.' ранее существовавший документ просто перезаписывается.
05.ThisDocument.SaveAs("c:\test\MyNewDocument.doc")
06.
07.// C#
08.// Сохраняем документ. В реальном приложении следует проверять
09.// наличие одноименного файла. В данном случае любой
10.// ранее существовавший документ просто перезаписывается.
11.Object fileName = @"C:\Test\MyNewDocument.doc";
12.Object fileFormat = Type.Missing;
13.Object lockComments = Type.Missing;
14.Object password = Type.Missing;
15.Object addToRecentFiles = Type.Missing;
16.Object writePassword = Type.Missing;
17.Object readOnlyRecommended = Type.Missing;
18.Object embedTrueTypeFonts = Type.Missing;
19.Object saveNativePictureFormat = Type.Missing;
20.Object saveFormsData = Type.Missing;
21.Object saveAsAOCELetter = Type.Missing;
22.Object encoding = Type.Missing;
23.Object insertLineBreaks = Type.Missing;
24.Object allowSubstitutions = Type.Missing;
25.Object lineEnding = Type.Missing;
26.Object addBiDiMarks = Type.Missing;
27.
28.ThisDocument.SaveAs(ref fileName, ref fileFormat, ref lockComments,
29. ref password, ref addToRecentFiles, ref writePassword,
30. ref readOnlyRecommended, ref embedTrueTypeFonts,
31. ref saveNativePictureFormat, ref saveFormsData,
32. ref saveAsAOCELetter, ref encoding, ref insertLineBreaks,
33. ref allowSubstitutions, ref lineEnding, ref addBiDiMarks);
Закрытие документов
Метод Close позволяет не только закрывать документы, но и сохранять их. Вы можете закрывать документы индивидуально или все сразу.
Закрытие всех документов Применительно к набору Documents метод Close работает аналогично методу Save. При вызове без аргументов он предлагает пользователю сохранить изменения в любых несохраненных документах.
view source
print?
01.' Visual Basic
02.ThisApplication.Documents.Close()
03.
04.// C#
05.Object saveChanges = Type.Missing;
06.Object originalFormat = Type.Missing;
07.Object routeDocument = Type.Missing;
08.ThisApplication.Documents.Close(ref saveChanges,
09. ref originalFormat, ref routeDocument);
Как и Save, метод Close принимает необязательный аргумент SaveChanges, у которого есть перечислимое WdSaveOptions с тремя значениями: wdDoNotSaveChanges, wdPromptToSaveChanges и wdSaveChanges. В следующем примере показано, как закрыть все открытые документы с автоматическим сохранением или отбрасыванием изменений:
view source
print?
01.' Visual Basic
02.' Закрываем все документы с автоматическим сохранением
03.ThisApplication.Documents.Close( _
04. Word.WdSaveOptions.wdSaveChanges)
05.
06.' Закрываем все документы с автоматическим отбрасыванием изменений
07.ThisApplication.Documents.Close( _
08. Word.WdSaveOptions.wdDoNotSaveChanges)
09.
10.// C#
11.// Закрываем все документы с автоматическим сохранением
12.Object saveChanges = Word.WdSaveOptions.wdSaveChanges;
13.Object originalFormat = Type.Missing;
14.Object routeDocument = Type.Missing;
15.ThisApplication.Documents.Close(ref saveChanges,
16. ref originalFormat, ref routeDocument);
17.
18.// Закрываем все документы с автоматическим отбрасыванием изменений
19.Object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
20.Object originalFormat = Type.Missing;
21.Object routeDocument = Type.Missing;
22.ThisApplication.Documents.Close(ref saveChanges,
23. ref originalFormat, ref routeDocument);
Примечание Вызов метода Application.Quit закрывает Word. Но закрытие всех открытых документов не приводит к закрытию Word - он может быть завершен только явным образом.
Закрытие единственного документа Фрагменты кода, приведенные ниже, иллюстрируют, как закрыть активный документ без сохранения изменений и как закрыть документ MyNewDocument, автоматически сохранив изменения:
view source
print?
01.' Visual Basic
02.' Закрываем активный документ без сохранения изменений
03.ThisDocument.Close( _
04. Word.WdSaveOptions.wdDoNotSaveChanges)
05.
06.' Закрываем MyNewDocument и "молча" сохраняем изменения
07.ThisApplication.Documents("MyNewDocument.doc").Close( _
08. Word.WdSaveOptions.wdSaveChanges)
09.
10.// C#
11.// Закрываем активный документ без сохранения изменений
12.Object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
13.Object originalFormat = Type.Missing;
14.Object routeDocument = Type.Missing;
15.ThisDocument.Close(ref saveChanges,
16. ref originalFormat, ref routeDocument);
17.
18.// Закрываем MyNewDocument и "молча" сохраняем изменения
19.Object name = "MyNewDocument.doc";
20.saveChanges = Word.WdSaveOptions.wdSaveChanges;
21.originalFormat = Type.Missing;
22.routeDocument = Type.Missing;
23.
24.Word.Document doc = ThisApplication.Documents.get_Item(ref name);
25.ThisDocument.Close(ref saveChanges,
26. ref originalFormat, ref routeDocument);
Перечисление набора Documents
В большинстве случае вы работаете с индивидуальными документами, и потребности в перечислении всего набора Documents не возникает. Но бывают ситуации, в которых нужно проверять каждый открытый документ и в зависимости от результатов проверки выполнять некую операцию. В таких ситуациях вы можете использовать цикл For Each (в Visual Basic .NET) или foreach (в C#) для перебора всех документов. Внутри этого цикла вы выполняете операции над файлами, если соблюдается какое-то условие или условия. В данном примере код перебирает все открытые документы и, если документ еще не сохранен, сохраняет его.
Вот что делает код в процедуре-примере:
перебирает набор открытых документов;
проверяет значение свойства Saved каждого документа и сохраняет документ, если он еще не сохранен;
получает имя каждого сохраненного документа;
отображает имя каждого сохраненного документа в MessageBox или выводит сообщение о том, что сохранять какие-либо документы не требуется.
view source
print?
01.' Visual Basic
02.Public Sub SaveUnsavedDocuments()
03. ' Перечисляем набор Documents
04. Dim str As String
05. Dim doc As Word.Document
06. Dim sw As New StringWriter
07.
08. For Each doc In ThisApplication.Documents
09. If Not doc.Saved Then
10. ' Сохраняем документ
11. doc.Save()
12. sw.WriteLine(doc.Name)
13. End If
14. Next
15.
16. str = sw.ToString()
17. If str = String.Empty Then
18. str = "No documents need saving."
19. End If
20. MessageBox.Show(str, "SaveUnsavedDocuments")
21.End Sub
22.
23.// C#
24.public void SaveUnsavedDocuments()
25.{
26. // Перечисляем набор Documents
27. string str;
28. StringWriter sw = new StringWriter();
29.
30. foreach (Word.Document doc in ThisApplication.Documents)
31. {
32. if (!doc.Saved )
33. {
34. // Сохраняем документ
35. doc.Save();
36. sw.WriteLine(doc.Name);
37. }
38. }
39.
40. str = sw.ToString();
41. if ( str == string.Empty )
42. {
43. str = "No documents need saving.";
44. }
45. MessageBox.Show(str, "SaveUnsavedDocuments");
46.}
Резюме
Word предоставляет богатую объектную модель, которая позволяет программно контролировать Word и создание документов из управляемого кода. Информации, полученной вами, вполне достаточно для решения любой задачи, связанной с созданием документов и их редактированием.