Статья описывает способ создания офисных документов, возможный при разработке веб-приложений, использование которых будут разрешено определенному (заранее известному) количеству пользователей (например: корпоративный сайт, определенные виды отчетов) Предупреждение: Согласно информации из статьи Consideration for server-side Automation of Office использование технологий Automation на стороне сервера (server-side) может повлечь за собой непредсказуемые проблемы при больших нагрузках и, тем более, при неправильной настройке используемых компонентов. Также Microsoft не рекомендует и, тем более, не поддерживает использование Automation of Microsoft Office.
Тем не менее, при разработке веб-приложений, использование которых будут разрешено определенному (заранее известному) количеству пользователей (например: корпоративный сайт, определенные виды отчетов) можно применить способ создания офисных документов, описанный в данной статье.
Статья посвящена методам автоматической генерации документов в форматах Word и Excel при помощи технологии ASP.NET 2.0. Описаны некоторые методы, используемые для получения работающими через веб-интерфейс пользователями отчетов или других документов из хранимой на сервере информации (например, из базы данных), либо на основании данных, введенных пользователем в веб-форму.
Описанные методы реализованы на языке Visual Basic 8 в модуле, разработанном в среде Microsoft Visual Studio 2005 с использованием ASP.NET 2.0.
Для управления программами Word и Excel из разрабатываемой прикладной системы необходимо в соответствующий проект добавить COM-объекты: Microsoft Excel 11.0 Object Library – для работы с Excel
Microsoft Word 11.0 Object Library – для работы с Word
Добавление осуществляется в среде Microsoft Visual Studio 2005 через пункт Add Reference меню Website.
Рисунок 1 Добавление ссылки на COM-объект для работы с Excel Рисунок 2 Добавление ссылки на COM-объект для работы с Word После добавления ссылок на COM-объекты в Visual Studio будут доступны соответствующие пространства имен: Microsoft.Office.Interop.Word – пространство имен Word
Microsoft.Office.Interop.Excel – пространство имен Excel
Далее создается прикладная веб-форма для работы с документами Office. Ниже приведен пример исходного кода: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Работа в Word и Excel</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td rowspan="2" style="width: 186px">
<asp:TextBox ID="TextBox1" runat="server" Height="49px" TextMode="MultiLine" Width="231px"></asp:TextBox></td>
<td>
<asp:Button ID="bttnSendToWord" runat="server" Text="Отправить в WORD" /></td>
</tr>
<tr>
<td>
<asp:Button ID="SendToExcel" runat="server" Text="Отправить в Excel" Width="177px" /></td>
</tr>
</table>
</div>
</form>
</body>
</html>
Листинг 1 Код веб-формы для работы с документами Office
Далее для данной веб-формы создается класс «обработчик событий»: Imports Microsoft.Office.Interop Partial Class _Default Inherits System.Web.UI.Page
#Region "Функции для работы с Word" ''' <summary> ''' Функция создания нового экземпляра Word ''' </summary> ''' <returns>Объект Word.Applicetion</returns> Public Function CreateWordObj() As Word.Application Dim obj As Object Try obj = CreateObject("Word.Application") 'Пробуем получить новый экземпляр Word Catch ex As Exception obj = Nothing Throw New Exception("Ошибка создания экземпляра MS Word") End Try Return obj End Function ''' <summary> ''' Функция создает объект документа Word ''' </summary> ''' <param name="Path">Путь к документу</param> ''' <param name="objWord">Объект Word</param> ''' <returns>Объект документа Word</returns> Public Function OpenWordFile(ByVal Path As String, ByVal objWord As Word.Application) As Word.Document Dim WordFile As String = CopyFileToTmp(Path) Dim WordDoc As Word.Document Try WordDoc = objWord.Documents.Open(WordFile) Catch ex As Exception WordDoc = Nothing Throw ex End Try Return WordDoc End Function #End Region #Region "Функции для работы с Excel" ''' <summary> ''' Функция создания нового экземпляра Excel ''' </summary> ''' <returns>Объект Excel.Applicetion</returns> Public Function CreateExcelObj() As Excel.Application Dim obj As Object Try obj = CreateObject("Excel.Application") 'Пробуем получить новый экземпляр Excel Catch ex As Exception obj = Nothing Throw New Exception("Ошибка создания экземпляра MS Excel") End Try Return obj End Function ''' <summary> ''' Функция создает объект листа Excel ''' </summary> ''' <param name="Path">Путь к документу</param> ''' <param name="objExcel">Объект Excel</param> ''' <returns>Объект листа Excel</returns> Public Function OpenExcelFile(ByVal Path As String, ByVal objExcel As Excel.Application) As Excel.Workbook Dim ExcelFile As String = CopyFileToTmp(Path) Dim ExcelBook As Excel.Workbook Try ExcelBook = objExcel.Workbooks.Open(ExcelFile) Catch ex As Exception ExcelBook = Nothing Throw ex End Try Return ExcelBook End Function #End Region
#Region "Общие функции" ''' <summary> ''' Функция создает временную копию открываемого файла, для того чтобы произвести изменения в нем ''' </summary> ''' <param name="Path">Путь к файлу</param> ''' <returns>Путь к временному файлу</returns> Private Function CopyFileToTmp(ByVal Path As String) As String Dim WordFile As New IO.FileInfo(Path) Dim WordFileTmp As String = "" If Not WordFile.Exists Then Throw New IO.FileNotFoundException End If WordFileTmp = FileIO.FileSystem.GetTempFileName() FileIO.FileSystem.CopyFile(Path, WordFileTmp, True) Return WordFileTmp End Function ''' <summary> ''' Функция отправляет пользователю созданный временный файл ''' </summary> ''' <param name="Path">Путь к файлу, который необходимо отправить</param> ''' <param name="FileName">Имя файла, который получит пользователь</param> Public Sub SendFileToUser(ByVal Path As String, ByVal FileName As String) Response.HeaderEncoding = Text.UnicodeEncoding.Default Response.AddHeader("Content-Disposition", "attachment; filename=" & FileName) Response.ContentType = "application/octet-stream" Response.Clear() Response.Cache.SetCacheability(HttpCacheability.Public) Response.BufferOutput = False Try Response.WriteFile(Path) FileIO.FileSystem.DeleteFile(Path) Catch ex As Exception Throw ex End Try End Sub #End Region #Region "Обработка событий кнопок" Protected Sub bttnSendToWord_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bttnSendToWord.Click Dim WordObj As Word.Application = CreateWordObj() 'Создаем экземпляр Word Dim WordDoc As Word.Document = OpenWordFile("c:\1.doc", WordObj) 'Получаем экземпляр открытого документа Dim WordFileTmp As String = WordDoc.FullName 'Получаем полный путь к временному документу WordDoc.Range.Text = TextBox1.Text 'Заносим текст из textbox1 в открытый документ WordDoc.Save() 'Сохраняем измененный документ WordDoc.Close() 'Закрываем документ WordObj.Quit() 'Выходим из приложения WordDoc = Nothing 'Уничтожаем ссылку на экземпляр документа WordObj = Nothing 'Уничтожаем ссылку на экземпляр Word SendFileToUser(WordFileTmp, "WordDocument.doc") 'Отправляем пользователю данный файл End Sub
Protected Sub SendToExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendToExcel.Click Dim ExcelObj As Excel.Application = CreateExcelObj() 'Создаем экземпляр Excel Dim ExcelBook As Excel.Workbook = OpenExcelFile("c:\1.xls", ExcelObj) 'Получаем экземпляр открытой книге Dim ExcelFileTmp As String = ExcelBook.FullName 'Получаем полный путь к временной книге ExcelBook.ActiveSheet.Cells(1, 1) = TextBox1.Text 'Заносим текст из textbox1 в ячейку(1,1) активного листа книги ExcelBook.Save() 'Сохраняем измененную книгу ExcelBook.Close() 'Закрываем книгу ExcelObj.Quit() 'Выходим из приложения ExcelBook = Nothing 'Уничтожаем ссылку на экземпляр книги ExcelObj = Nothing 'Уничтожаем ссылку на экземпляр Excel SendFileToUser(ExcelFileTmp, "ExcelSheet.xls") 'Отправляем пользователю данный файл End Sub #End Region End Class
Листинг 2 Код класса «обработчик событий» веб-формы
После этих действий необходимо создать шаблоны документов, на основании которых будут генерироваться результирующие документы.
Если нужно построить документы сложной формы, например насыщенные элементами формы Excel, то есть два способа их создания: Создавать элементы формы непосредственно в коде прикладной программы (например, присваивать границы ячейкам, задавать шрифты и т.д.)
Создать шаблонную форму в Excel, то есть разметить ее области, задать шрифты, установить нужные размеры. Сохранив такой шаблон, далее достаточно в прикладной программе просто заносить данные в нужные ячейки.
Такой же подход применим и к построению документов в формате Word.
В вышеприведенном примере показано использование тестовых шаблонов TestWord.doc и TestExcel.xls.
|