Export danych do word’a i excel’a
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).