Export danych do word’a i excel’a

Post on 26-May-2015

668 views 2 download

Transcript of Export danych do word’a i excel’a

Export danych do Word’a i Excel’a

Export danych do Word’a i Excel’a z c# można dokonać na kilka sposobów. Omówione tu metody to export za pomocą obiektów com dostarczonych wraz z pakietem office przez Microsoft oraz biblioteki zewnętrzne korzystające z wspomnianych obiektów com lub Open office XML.

Autor: Kamil Sobecki

Obiekty com

Aby korzystać z obiektów com należy zainstalować pakiet Microsoft office lub pobrać przykładowo pakiet Microsoft Office XP PIAs. Następnie należy dodać odpowiednie referencje do projektu. Są to odpowiednio:

Microsoft Word 11.0 Object Library – dla Word XP

Microsoft Excel 11.0 Object Library – dla Excel XP

lub inne wersje lub pakiety w zależności od pożądanego pakietu i wersji pakietu office.

Obiekty com

Dodawanie referencji do projektu

Obiekty com

W kodzie programu najwygodniej skorzystać z formuły:

using Word = Microsoft.Office.Interop.Word;orazusing Excel = Microsoft.Office.Interop.Excel;Dzięki temu dalej możemy odwoływać się to

tych przestrzeni nazw za pomocą własnej nazwy (w tym przypadku „Word” lub „Excel”).

Obiekty com - Word

Pracę z dokumentem zaczynamy od następującego kodu:

Word.Application word = new Word.Application();

Word.Documents docs = word.Documents;

Word.Document doc = docs.Add();

Otrzymujemy dokument „doc” z którym będziemy dalej pracować. W zależności od warości atrybutu word.Visible (bool) otworzy się program Word wyświetlając nasz dokument lub nie.

Obiekty com - Word

W naszym dokumencie możemy utworzyć nowy paragraf:

Word.Paragraph para1;

para1 = doc.Content.Paragraphs.Add();

i rozpocząć pracę. Przykładowe funkcje:• Wpisanie tekstu: para1.Range.Text = „tekst";• Pogrubienie: para1.Range.Font.Bold = 1;• Rozmiar czcionki: para1.Range.Font.Size = 22;• Rodzaj czcionki: para1.Range.Font.Name =

"Algerian";

Obiekty com - Word

• Przestrzeń przed paragrafem: para1.Format.SpaceBefore = 24;

• Po paragrafie: para1.Format.SpaceAfter = 24;• Wstawić następny paragraf:

para1.Range.InsertParagraphAfter();

Dostępnych jest więcej atrybutów. Niektóre z nich przedstawię na przykładzie tabeli.

Wynik komend z poprzedniego slajdu:

Obiekty com - Word

Tworzenie tabeli zaczynamy od: Word.Table table;

Teraz ustalamy miejsce tabeli, tutaj jako koniec aktualnego dokumentu:

object oEndOfDoc = "\\endofdoc";

Word.Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;

table = doc.Tables.Add(wrdRng, 3, 5);

Obiekty com - Word

Przy tej okazji chciałbym wspomnieć, iż wywołanie: doc.Tables.Add(wrdRng, 3, 5); jest możliwe w VS 2010. We wcześniejszych wersjach musiało by wyglądać następująco: doc.Tables.Add(wrdRng, 3, 5, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

W skrócie dopiero w VS 2010 możemy pomijać parametry które chcemy aby były domyślne.

Obiekty com - Word

Uzupełniamy tabele:

for (r = 1; r <= 3; r++){

for (c = 1; c <= 5; c++){

strText = "r" + r + "c" + c;table.Cell(r, c).Range.Text = strText;

}}

Obiekty com - Word

A teraz trochę atrybutów:

table.Rows[1].Range.Font.Italic = 1;

table.Rows[3].Range.Font.Size = 22;

table.Rows[1].Cells[1].Range.Font.StrikeThrough = 1;

table.Rows[1].Cells[2].Range.Font.ColorIndex = Word.WdColorIndex.wdBrightGreen;

table.Rows[1].Cells[4].Range.Font.Underline = Word.WdUnderline.wdUnderlineDotDash;

Obiekty com - Word

table.Rows[1].Cells[3].Range.Font.Outline = 25;table.Rows[1].Cells[4].Range.Font.UnderlineColor = Word.WdColor.wdColorBlue;table.Rows[1].Cells[5].Range.Font.Animation =

Word.WdAnimation.wdAnimationLasVegasLights;table.Rows[3].Cells[1].Range.Font.SmallCaps = 1;table.Rows[3].Cells[2].Range.Font.Scaling = 33;Większość atrybutów jest oczywista. Font.Animation

dodaje animacje do tekstu, SmallCaps powoduje wydruk dużych liter w rozmiarze małych a Scaling skaluje trzcionkę.

Obiekty com - Word

Przykładowa tabelka z użyciem powyższych komend:

Obiekty com - Word

Tworzenie przykładowego diagramu:

object chart;

object chartApp;

chart = shape.OLEFormat.Object;

chartApp = chart.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, chart, null);

object[] Parameters = new Object[1];

Parameters[0] = 4; //xlLine = 4

Obiekty com - Word

chart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty, null, chart, Parameters);

chartApp.GetType().InvokeMember("Update",

BindingFlags.InvokeMethod, null, chartApp, null);

chartApp.GetType().InvokeMember("Quit",

BindingFlags.InvokeMethod, null, chartApp, null);

shape.Width = word.InchesToPoints(6.25f);

shape.Height = word.InchesToPoints(3.57f);

Obiekty com - Word

Tak wygląda stworzony diagram:

Obiekty com - Word

Wygenerowany dokument możemy zapisać:

doc.SaveAs(„sciezka_pliku/nazwa.doc”, Word.WdDocumentType.wdTypeDocument);

i mamy zapisany dokument Word.

Obiekty com - Excel

Tworzenie arkuszy xls jest analogiczne do tworzenia dokumentów doc. Zaczynamy od:

Excel.Application excel = new Excel.Application();Excel.Workbooks workbooks = excel.Workbooks;Excel.Workbook workbook = workbooks.Add();Excel.Worksheet worksheet = excel.ActiveSheet;Teraz możemy przystąpić do tworzenia zawartości

aktywnego arkusza. Wpiszmy tekst w pojedynczą komórkę:

worksheet.Cells[1, "A"] = "Numer";

Obiekty com - Excel

Możemy również wpisać godzinę:

worksheet.Cells[2, "B"] = DateTime.Now;

i ustawić formatowanie komórki:

worksheet.Cells[2, "B"].NumberFormat =

"DD-MM-RRRR GG:MM";

na pożądany format daty lub na format liczbowy:

worksheet.Cells[2, "A"].NumberFormat = "0";

Wpisywanie formuł jest równie proste:

worksheet.Range["A11"].Formula = "=SUM(A2:A10)";

Obiekty com - Excel

Obramowanie komórki lub obszaru można ustawić za pomocą:

worksheet.Range["A11"].Borders.ColorIndex = 8;

worksheet.Range["A11"].Borders.LineStyle = Excel.XlLineStyle.xlDouble;

A worksheet.Columns[2].AutoFit();

spowoduje ustawienie szerokości kolumny B automatycznie do zawartości jej komórek.

Obiekty com - Excel

Łączenia komórek dokunujemy dzięki:

Excel.Range range2 =

worksheet.get_Range("D1", "E2");

range2.Merge();

I ustawiamy wyrównanie w poziomie i w pionie:

range2.HorizontalAlignment = Excel.XlHAlign.xlHAlignDistributed;

range2.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;

Obiekty com - Excel

Wiele dostępnych atrybutów pokrywa się z atrybutami dostępnymi dla Word’a, w szczególności dotyczących czcionki.

Zapis pliku jest również analogiczny:

workbook.SaveAs(Path.Combine(Environment.CurrentDirectory, "example.xls"), Excel.XlFileFormat.xlWorkbookNormal);

Przykładowy plik wykorzystujący wymienione komendy:

Obiekty com - Excel

NPOI

NPOI jest .NET’ową wersją projektu POI napisanego w Javie, pomagającego w odczycie/zapisie plikow xls, doc, ptt. Nie wymaga on zainstalowanego pakietu office na komputerze, ani innych specjalnych dodatków. Opiera się on o Open office XML. Aby z niego skorzystać, wystarczy pobrać kilka plików dll i do projektu dodać odpowiednie referencje.

NPOI

NPOI

W kodzie źródłowym dołączamy przestrzenie nazw według potrzeb. W moim przykładowym projekcie były to:

• using NPOI.XWPF.UserModel;• using NPOI.HSSF.UserModel;• using NPOI.HPSF;• using NPOI.SS.UserModel;• using NPOI.SS.Util;• using NPOI.HSSF.Util;

NPOI - Word

Tworzenie dokumentu zaczynamy od:

XWPFDocument doc = new XWPFDocument();

Następnie tworzymy paragraf:

XWPFParagraph p1 = doc.CreateParagraph();

I formatujemy go:

p1.SetAlignment(ParagraphAlignment.CENTER);

p1.SetVerticalAlignment(TextAlignment.TOP);

Żemy dodać obramowanie:

p1.SetBorderBottom(Borders.DOUBLE);

NPOI - Word

p1.SetBorderTop(Borders.DOUBLE);p1.SetBorderRight(Borders.DOUBLE);p1.SetBorderLeft(Borders.DOUBLE);Teraz dodajemy obszar:XWPFRun r1 = p1.CreateRun();r1.SetBold(true);r1.SetText("The quick brown fox");r1.SetBold(true);r1.SetFontFamily("Courier");r1.SetUnderline(UnderlinePatterns.DotDotDash);r1.SetTextPosition(100);

NPOI - Word

Inne dostępne atrybuty:r2.SetStrike(true);r2.SetFontSize(20);r3.SetSubscript(VerticalAlign.SUPERSCRIPT);p3.IsWordWrap = true;p3.SetSpacingLineRule(LineSpacingRule.EXACT);p3.IndentationFirstLine = 600;r4.IsItalic = true;r6.SetColor("dd00dd");

NPOI - Word

SetColor przyjmuje jako argument rgb string czyli wartości poszczególnych kolorów w systemie szesnastkowym : „rrggbb”.

Listę punktowaną rozpoczynamy od deklaracji:XWPFNumbering numbering =

doc.CreateNumbering();string abstractNumId =

numbering.AddAbstractNum();string numId =

numbering.AddNum(abstractNumId);

NPOI - Word

A następnie dodajemy punkty:p5 = doc.CreateParagraph();r7 = p5.CreateRun();r7.SetText("first");p5.SetNumID(numId, "0");p5 = doc.CreateParagraph();r7 = p5.CreateRun();r7.SetText("first-first");p5.SetNumID(numId, "1"); i tak dalej.

NPOI - Word

Dokument zapisujemy za pomocą:

FileStream out1 = new FileStream(Path.Combine(Environment.CurrentDirectory, "example.docx"), FileMode.Create);

doc.Write(out1);

out1.Close();

Poniżej przykładowy dokument z użyciem wymienionych komend:

NPOI - Word

NPOI - Excel

Dokument xls tworzymy alnalogicznie:

HSSFWorkbook workbook = new HSSFWorkbook();

Możemy dodać informacje o dokumencie:

DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();

dsi.Company = "NPOI Team";

workbook.DocumentSummaryInformation = dsi;

NPOI - Excel

SummaryInformation si = PropertySetFactory.CreateSummaryInformation();

si.Subject = "NPOI SDK Example";workbook.SummaryInformation = si;Tworzymy arkusz:ISheet sheet1 = workbook.CreateSheet("Sheet1");Wiersz i komórki:IRow row0 = sheet1.CreateRow(0);ICell cell0 = row0.CreateCell(0);ICell cell1 = row0.CreateCell(1);

NPOI - Excel

Uzupełniamy komórki:

cell0.SetCellValue("Product1");

Tworzymy listę wybieraną w obszarze komórek:

CellRangeAddressList rangeList = new CellRangeAddressList();

rangeList.AddCellRangeAddress(new CellRangeAddress(1, 3, 1, 1));

DVConstraint dvconstraint = DVConstraint.CreateFormulaListConstraint("Sheet1!$A$2:$A$4");

NPOI - Excel

HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);

((HSSFSheet)sheet1).AddValidationData(dataValidation);

Możemy obrócić tekst w komórce o x stopni:

ICellStyle style = workbook.CreateCellStyle();

style.Rotation = (short)x;

row.GetCell(0).CellStyle = style;

NPOI - Excel

Tworzenie komentarza:

IDrawing patr = (HSSFPatriarch)sheet1.CreateDrawingPatriarch();

IComment comment1 = patr.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 4, 2, 6, 5));

comment1.String = (new HSSFRichTextString("We can set comments in POI"));

comment1.Author = ("Apache Software Foundation");

NPOI - Excel

Przypisanie komentarza do komórki:cell0.CellComment = (comment1);Możemy też zrobić to na inny sposób:HSSFComment comment2 =

(HSSFComment)patr.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 4, 8, 6, 11));

comment2.SetFillColor(204, 236, 255);HSSFRichTextString str = new

HSSFRichTextString("Normal body temperature");comment2.Author = "Bill Gates";

NPOI - Excel

Formatujemy kometarz:

IFont font = workbook.CreateFont();

font.FontName = ("Arial");

font.FontHeightInPoints = 10;

font.Boldweight = (short)FontBoldWeight.Bold;

font.Color = HSSFColor.Red.Index;

str.ApplyFont(font);

Dodajemy tekst do komentarza, komentarz do komórki oraz ustawiamy stałe wyświetlanie:

NPOI - Excel

comment2.String = str;comment2.Row = 10;comment2.Column = 1;comment2.Visible = true;Wpisywanie daty:cell0.SetCellValue(DateTime.Now);I formatowanie daty:ICellStyle cellStyle = workbook.CreateCellStyle();

NPOI - Excel

cellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("[$-409]h:mm:ss AM/PM;@");

cell0.CellStyle = cellStyle;

Formatowanie warunkowe:

ISheetConditionalFormatting hscf = sheet1.SheetConditionalFormatting;

IConditionalFormattingRule rule = hscf.CreateConditionalFormattingRule(

ComparisonOperator.Between, "3", "8");

NPOI - Excel

IPatternFormatting patternFmt = rule.CreatePatternFormatting();

patternFmt.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;

CellRangeAddress[] regions = {

new CellRangeAddress(14, 14, 1, 1) };

hscf.AddConditionalFormatting(regions, rule);

W ten sposób pole B15 bedzię miało czerwone tło jeśli wpiszemy tam liczbę miedzy 3 i 8.

NPOI - Excel

Format liczbowy:

IDataFormat format = workbook.CreateDataFormat();

cellStyle = workbook.CreateCellStyle();

cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");

cell0.CellStyle = cellStyle;

Otrzymamy format przecinkowy z dwoma miejscami po przecinku.

NPOI - Excel

Formuły:

row21.CreateCell(0).CellFormula = "SUM(A21:B21)";

row21.CreateCell(1).CellFormula = "cos(5)+sin(10)";

Zapisywanie pliku:

FileStream file = new FileStream(@"test.xls", FileMode.Create);

workbook.Write(file);

file.Close();

NPOI - Excel

Przykładowy dokument z powyższymi komendami:

Podsumowanie

Obiekty com pozwalają nam na eksport danych do dokumentów pakietu office, jednak nie bez komplikacji. Po pierwsze podejście to wymaga zainstalowania na maszynie pakietu offiece lub odpowiednieko pakietu. Po drugie tworzenie dokumentu w ten sposób nie należy do najprzyjemniejszych. Osobiście miałem spore problemy z atrybutami, które przyjmują specyficzne formaty danych. Dodatkowo o błędzie dowiadujemy się najczęściej podczas działania programu a nie kompilacji.

Podsumowanie

Biblioteka NPOI dostarcza alternatywne rozwiązanie. Nie wymaga ona instalowanie niczego na maszynie, a praca z nią jest przyjemniejsza. Niestety nie jest pozbawiona wad. Jedną z nich jest niesystematyczność: niektóre ustawienia dokonujemy za pomocą atrybutów: r4.IsItalic = true;, a niektóre za pomocą metod: r1.SetBold(true);. Bibliotekę tą chroni licencja: Apache License 2.0 (Apache).