Работа с Microsoft Office Word и Microsoft Office Excel посредством ASP.NET 2.0

Источник: progman

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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=23342