пятница, 10 января 2014 г.

Генерация произвольных файлов формата MS Office 2007/2010 (Word и Excel) в SharePoint 2010 и 2013

Нередко при тестировании и отладке решений для SharePoint нужно загрузить n-ое количество тестовых файлов в библиотеку документов.
Хорошо если наши запросы скромные, и для тестирования достаточно скопировать несколько файлов через "режим проводника" из локальной папки.
Но как быть если таких файлов нужно загрузить не одну тысячу в несколько библиотек?
Один из вариантов - воспользоваться Open XML SDK 2.0 for Microsoft Office.

Пример разработки приложения для генерации произвольных файлов формата MS Word и Excel в SharePoint 

В своей предыдущей статье я уже описывал как начать работу с Open XML SDK 2.0 for Microsoft Office и создать проект в Visual Studio 2010, поэтому повторяться не буду.
Начнем сразу с главного: как генерировать файлы формата MS Office "на лету".

Генерация файла формата MS Word 2007/2010

В данном примере я приведу метод, позволяющий генерировать файл MS Word, содержащий одну строку текста, c использованием Open XML SDK 2.0.
Листинг с комментариями приведен ниже.
public static void GenerateWordDocument(Stream doc, string documentContentText)
{
 //Создаем Wordprocessing документ 
 using (WordprocessingDocument myDoc = WordprocessingDocument.Create(doc, WordprocessingDocumentType.Document))
 {
  //Добавляем новую главную часть документа - main document part
  MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
  mainPart.Document = new Document();
  //Создаем тело документа - Body (этот элемент содержит
  //другие элементы, которые мы хотим добавить в документ) 
  Body body = new Body();
  //Создаем параграф 
  Paragraph paragraph = new Paragraph();
  Run run_paragraph = new Run();
  //Размещаем текст в документе 
  Text text_paragraph = new Text(documentContentText);
  run_paragraph.Append(text_paragraph);
  paragraph.Append(run_paragraph);
  body.Append(paragraph);
  mainPart.Document.Append(body);
  //Сохраняем изменения в главной части документа 
  mainPart.Document.Save();
 }
}

Генерация файла формата MS Excel 2007/2010

Для генерации различных отчетов в виде файлов MS Excel я часто использую библиотеку EEPlus из проекта EPPlus-Create advanced Excel 2007 spreadsheets on the server
С помощью этой библиотеки метод, позволяющий сгенерировать Excel файл, содержащий ячейку с текстом, умещается в несколько строк (сравните для примера с описанием генерации c применением "чистого" Open XML SDK 2.0 на msdn). 
Листинг с комментариями приведен ниже.
public static void GenerateExcelDocument(Stream doc, string documentContentText)
{
 using (var xls = new ExcelPackage(doc))
 {
  //Добавляем лист в книгу Excel
  var worksheet = xls.Workbook.Worksheets.Add("Worksheets1");
  //Задаем ширину первого столбца
  worksheet.Column(1).Width = 30;
  //Указываем содержимое первой ячейки в первом столбце
  worksheet.Cells[1, 1].Value = documentContentText;
  //Добавляем метаданные к файлу
  xls.Workbook.Properties.Title = "Excel2010";
  xls.Workbook.Properties.Author = "UploadDocs2Lib";
  xls.Save();
 }
}
Если требуется вставить автофильтр в Excel файл, то нужно явно применить его ко всему листу: worksheet.Cells[worksheet.Dimension.Address].AutoFilter=true;

Написание приложения для генерации файлов

Все исходные коды приложения опубликованы на https://github.com/eof151/SPUploadDocs2Lib.

Создадим новое WinForms приложение, я назвал его  - SPUploadDocs2Lib.
Структура итогового проекта изображена на рисунке ниже. Не забываем добавить референсы на библиотеки DocumentFormat.OpenXml и EEPlus.
Рисунок 1.
Два вышеприведенных метода я объединил в файле с одноименным классом DocumentBuilder.cs
Для генерации файлов определенного типа уже непосредственно в определенной библиотеке документов SharePoint  я написал общий метод, код которого приведен в листинге ниже.
private void GenerateFile(SPList myList, bool isWord)
{
 SPListItem item = null;
 string documentName = "";
 MemoryStream docStream = new MemoryStream();
 StreamWriter writer = new StreamWriter(docStream);

 if (isWord) //Word
 {
  //Генерируем случайное имя файла, используя префикс и соответствующее расширение
  documentName = GeneratePartFileName(tbFilenamePref.Text, WORDFILE);
  DocumentBuilder.GenerateWordDocument(docStream, tbWordText.Text);
 }
 else //Excel
 {
  documentName = GeneratePartFileName(tbExcFilenamePref.Text, EXCELFILE);
  DocumentBuilder.GenerateExcelDocument(docStream, tbExcelText.Text);
 }

 SPFile file = myList.RootFolder.Files.Add(documentName, docStream, true);
 writer.Flush();
 item = file.Item;
 //Заполняем свойство - Название
 item["Title"] = "TestFile" + item.ID;
 item.Update();
}
Вид окна программы приведен на рисунке ниже.

Рисунок 2.

Результат работы программы

После запуска в окне программы необходимо указать URL-адрес сайта и название библиотеки документов, в которой планируется сгенерировать файлы. После этого остается указать число создаваемых файлов их префиксы и текст содержимого. 
Нажимаем на соответствующие кнопки с иконками MS Word или MS Excel и смотрим на результат:

Рисунок 3. Результат работы программы в SharePoint 2010


Рисунок 4. Результат работы программы в SharePoint 2013

Пример содержимого в сгенерированных файлах MS Office приведен на рисунках ниже.

Рисунок 5. Содержимое сгенерированного файла MS Word


Рисунок 6. Содержимое сгенерированного файла MS Excel

Подведем итоги

Как вы успели заметить, посредством небольшого количества кода и Open XML SDK 2.0 for Microsoft Office можно просто генерировать множество файлов MS Office в библиотеках документов SharePoint.

Полезные ссылки

  1. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 1 of 3)
  2. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 2 of 3)
  3. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 3 of 3)
  4. How to: Create a word processing document by providing a file name (Open XML SDK)
  5. Creation of a Word 2007 document using the Open XML Format SDK

Комментариев нет:

Отправить комментарий