Gollum's den

ASP.NET (и не только) здесь и сейчас!

View Eugene Agafonov's profile on LinkedIn

OpenXML SDK 2.0 Create Worksheet

В очередной раз столкнувшись с необходимостью создать отчет в excel, я вспомнил что Microsoft выпустил для нас SDK, который по идее отменяет необходимость в автоматизации офиса. Я обрадовался, скачал SDK и стал смотреть примеры кода. Первое, что меня удивило – примеров крайне мало. Ладно, подумал я. В состав пакета входит замечательная утилита под названием Document Reflector – она загружает документ и выдает код на C#! Я создал пустой .xlsx файл, открыл его в рефлекторе, взял код, запустил, сохранил сгенерированный файл и…

Ошибка, эксель предлагает восстанавливать данные. Ладно, ведь это CTP. Откроем документ и сделаем в нем новый лист. И вот тут оказалось, что это не такая уж и простая задача. Вообще, если честно, DOM мне не понравился. Понятно что он и должен быть сложным, но должны же быть простые пути решения типовых задач! В общем, если кто-то тоже мучается как и я, то вот что у меня получилось для создания нового листа в книге excel (код модифицирован для демонстрационных целей :) )

    1       // указываете путь к своему документу excel

    2       using (var doc = SpreadsheetDocument.Open("test.xlsx", true))

    3       {

    4         var newWorksheetPart = doc.AddNewWorksheet("Новый лист");

    5         var sheetData = newWorksheetPart.Worksheet.GetFirstChild<SheetData>();

    6 

    7         var row = new Row { RowIndex = 1 };

    8         row.AddTextCell("A", row.RowIndex, "Привет");

    9         row.AddTextCell("B", row.RowIndex, "Мир");

   10 

   11         sheetData.AppendChild(row);

   12         newWorksheetPart.Worksheet.Save();

   13         doc.WorkbookPart.Workbook.Save();

   14       }

А это – обертка

    8   public static class SpreadsheetDocumentExtensions

    9   {

   10     public static WorksheetPart AddNewWorksheet(

   11       this SpreadsheetDocument doc, string name)

   12     {

   13       if(null == doc) return null;

   14 

   15       var newWp = doc.WorkbookPart.AddNewPart<WorksheetPart>();

   16       var newWs = new Worksheet(new SheetData());

   17       newWs.Save(newWp);

   18 

   19       var newWpId = doc.WorkbookPart.GetIdOfPart(newWp);

   20       var sheets = doc.WorkbookPart.Workbook.GetFirstChild<Sheets>();

   21 

   22       uint sheetId = 1;

   23       if (sheets.Elements<Sheet>().Count() > 0)

   24       {

   25         sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;

   26       }

   27 

   28       var sheet = new Sheet

   29       {

   30         Id = newWpId,

   31         SheetId = sheetId, Name = name

   32       };

   33 

   34       sheets.Append(sheet);

   35       return newWp;

   36     }

   37 

   38 

   39     public static Cell AddTextCell(

   40       this Row row, string column, uint index, string text)

   41     {

   42       if(null == row) return null;

   43 

   44       var cell = new Cell

   45       {

   46         DataType = CellValues.InlineString,

   47         CellReference = column + index

   48       };

   49 

   50       cell.AppendChild(new InlineString(new Text { Text = text }));

   51       row.AppendChild(cell);

   52       return cell;

   53     }

   54   }

Posted: Jul 10 2009, 11:19 PM by Gollum | with no comments
Filed under: ,