Статья описывает способ создания офисных документов, возможный при разработке веб-приложений, использование которых будут разрешено определенному (заранее известному) количеству пользователей (например: корпоративный сайт, определенные виды отчетов).
Предупреждение:
Согласно информации из статьи 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.