.Net: Программная печать документов MS Office
|
|
Пятница, 16 Января 2009 г. 16:28
+ в цитатник
На днях решил поменять в одной программе печать документов с простого "webBrowser.ShowPrintDialog();" в браузере, на полноценное открытие MS Word с дальнейшей печатью. Но речь пойдет не о создании простого процесса winword.exe с передачей ему в качестве параметра нужного документа, а
о библиотеках, которые созданы для разработчиков предусмотрительным Microsoft'ом. Заявлено, что решение работает под Office2003/2007, WinXP+, MSVS2005+. Краткое описание по работе с библиотекой приводит один
из индийских девелоперов, номинированный как MVP (Microsoft Most Valuable Professional). Однако после строчек кода:
Copy Source | Copy HTML- Object true = true;
- Object false = false;
...я почувствовал, что все шутки на баше про индийских программистов не были надуманными.
Далее я приведу шаги, с помощью которых, мне удалось осуществить задуманное и кусок кода.
Итак, скачайте указанный выше архив с библиотеками. Внутри него будет также инструкция по интеграции этих библиотек в MSVS, но я рекомендую просто подключить нужную библиотеку, в моем случае это "Microsoft.Office.Interop.Word.dll", потому как я работаю только с MSWord, как Refference в проект. Далее, так как я хочу выводить на печать содержимое окна браузера, то я создал наследника от класса WebBrowser. Обратите внимание на функцию OpenInWord. Она создает вначале приложение офиса Application, потом сам документ, с которым работаем, загружая его из файла. Когда загрузка завершена, то делаем отображение самого офиса, выставляя значение Visible в true, так как по умолчанию офис будет работать спрятан:
Copy Source | Copy HTML
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Text;
- using System.Windows.Forms;
- using System.Text.RegularExpressions;// регулярные выражения
- using System.IO;//работа с файлами
-
- namespace BestApplicationEvah
- {
- public partial class WebBrowser_I : WebBrowser
- {
- public WebBrowser_I()
- {
- InitializeComponent();
- }
-
- /// <summary>
- /// Временная директория в которую складываются все файлы отправляемые на печать.
- /// </summary>
- private string printdirectory = "Rprint";
-
- /// <summary> Временная директория в которую складываются все файлы отправляемые на печать. </summary>
- public string PrintDir { get { return printdirectory; } set { printdirectory = value; } }
-
- /// <summary>
- /// Функция преобразования html в правильный формат для показа в doc
- /// </summary>
- /// <param name="file">Название файла. Желательно с расширением doc</param>
- /// <param name="HTML">Html для преобразований</param>
- /// <returns></returns>
- private string HtmlToDocFile(ref string file, string HTML)
- {
- /*** много кода ***/
- }
-
- /// <summary>
- /// Функция сохраняет текущую страницу, как указанный файл и открывает его
- /// </summary>
- /// <param name="file">Имя создаваемого файла, должно иметь расширение DOC</param>
- public void OpenAsDoc(string file)
- {
- this.OpenAsDoc(file, false);
- }
-
- /// <summary>
- /// Функция сохраняет текущую страницу, как указанный файл и открывает его
- /// </summary>
- /// <param name="file">Имя создаваемого файла, должно иметь расширение DOC</param>
- /// <param name="newWindow">Открыть файл в новом окне?</param>
- public void OpenAsDoc(string file, bool newWindow)
- {
- string err = this.HtmlToDocFile(ref file, this.DocumentText);
- if (!String.IsNullOrEmpty(err))
- {
- //вывод сообщения об ошибке
- MessageBox.Show(err, "Ошибка");
- }
-
- //и отображаем доковский файл в браузере
- this.Navigate(Directory.GetCurrentDirectory() + "/"+ this.printdirectory + "/" + file,newWindow);
- }
-
- /// <summary>
- /// Открытие HTML в MS Word...
- /// </summary>
- /// <param name="file">Название файла для сохранения информации</param>
- public void OpenInWord(string file){
- //создадим из контента файл
- string err = this.HtmlToDocFile(ref file, this.DocumentText);
- if (!String.IsNullOrEmpty(err))
- {
- //вывод сообщения об ошибке
- MessageBox.Show(err, "Ошибка");
- }
-
- try
- {
- //Create an object for missing values. This will be passed whenever we don’t want to pass value
- Object missing = System.Reflection.Missing.Value;
- //Objects for true and false to be used in the word document for passing true or false.
- //Object true = true;
- //Object false = false;
- //Creating objects of word and document
- Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
- Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
- object fileName = Directory.GetCurrentDirectory() + "/" + this.printdirectory + "/" + file;
- // You can keep it true if you want to open the file in readonly mode
- object readOnly = false;
- // we can keep it false if you want to open the file but not make it invisible
- object isVisible = true;
- //открытие файла
- oWordDoc = oWord.Documents.Open(ref fileName, ref missing, ref
- readOnly, ref missing, ref missing, ref missing, ref
- missing, ref missing, ref missing, ref missing, ref
- missing, ref isVisible, ref missing, ref missing, ref
- missing);
- //делаемся видимыми
- oWord.Application.Visible = true;
- //oWord.ShowMe();//смысл функции остался неизвестным
- //автопечать
- //oWord.PrintOut(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, ref missing, ref missing,
- // ref missing, ref missing);
- }
- catch(Exception WordExc)
- {
- MessageBox.Show(WordExc.Message, "Ошибка при работа с MS Word");
- }
- }
- }
- }
И когда мы всетаки завершим работать с офисом, важно закрыть объекты, иначе процесс winword может остаться висеть:
Copy Source | Copy HTML
- //Closing the file
- oWordDoc.Close(ref oFalse, ref missing, ref missing);
- //Quitting the word application to release the memory.
- oWord.Quit(ref missing, ref missing, ref missing);
Остальные возможности работы в документами содержаться в многочисленных методах объекта oWord и требуют дополнительных экспериментов.
http://flashr.ya.ru/replies.xml?item_no=1267
Метки:
ya.ru:text
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-