Export danych do word’a i excel’a

48
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

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

Page 1: 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

Page 2: Export danych do word’a i excel’a

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.

Page 3: Export danych do word’a i excel’a

Obiekty com

Dodawanie referencji do projektu

Page 4: Export danych do word’a i excel’a

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”).

Page 5: Export danych do word’a i excel’a

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.

Page 6: Export danych do word’a i excel’a

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";

Page 7: Export danych do word’a i excel’a

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:

Page 8: Export danych do word’a i excel’a

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);

Page 9: Export danych do word’a i excel’a

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.

Page 10: Export danych do word’a i excel’a

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;

}}

Page 11: Export danych do word’a i excel’a

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;

Page 12: Export danych do word’a i excel’a

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ę.

Page 13: Export danych do word’a i excel’a

Obiekty com - Word

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

Page 14: Export danych do word’a i excel’a

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

Page 15: Export danych do word’a i excel’a

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);

Page 16: Export danych do word’a i excel’a

Obiekty com - Word

Tak wygląda stworzony diagram:

Page 17: Export danych do word’a i excel’a

Obiekty com - Word

Wygenerowany dokument możemy zapisać:

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

i mamy zapisany dokument Word.

Page 18: Export danych do word’a i excel’a

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";

Page 19: Export danych do word’a i excel’a

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)";

Page 20: Export danych do word’a i excel’a

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.

Page 21: Export danych do word’a i excel’a

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;

Page 22: Export danych do word’a i excel’a

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:

Page 23: Export danych do word’a i excel’a

Obiekty com - Excel

Page 24: Export danych do word’a i excel’a

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.

Page 25: Export danych do word’a i excel’a

NPOI

Page 26: Export danych do word’a i excel’a

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;

Page 27: Export danych do word’a i excel’a

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);

Page 28: Export danych do word’a i excel’a

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);

Page 29: Export danych do word’a i excel’a

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");

Page 30: Export danych do word’a i excel’a

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);

Page 31: Export danych do word’a i excel’a

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.

Page 32: Export danych do word’a i excel’a

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:

Page 33: Export danych do word’a i excel’a

NPOI - Word

Page 34: Export danych do word’a i excel’a

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;

Page 35: Export danych do word’a i excel’a

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);

Page 36: Export danych do word’a i excel’a

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");

Page 37: Export danych do word’a i excel’a

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;

Page 38: Export danych do word’a i excel’a

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");

Page 39: Export danych do word’a i excel’a

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";

Page 40: Export danych do word’a i excel’a

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:

Page 41: Export danych do word’a i excel’a

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();

Page 42: Export danych do word’a i excel’a

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");

Page 43: Export danych do word’a i excel’a

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.

Page 44: Export danych do word’a i excel’a

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.

Page 45: Export danych do word’a i excel’a

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();

Page 46: Export danych do word’a i excel’a

NPOI - Excel

Przykładowy dokument z powyższymi komendami:

Page 47: Export danych do word’a i excel’a

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.

Page 48: Export danych do word’a i excel’a

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).