.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
Сохранили