SlideShare a Scribd company logo
1 of 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
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;
oraz
using 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
Wynik komend z poprzedniego slajdu:
• 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.
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.Cur
rentDirectory, "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.Current
Directory, "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.CreateDocumentSummaryIn
formation();
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("She
et1!$A$2:$A$4");
NPOI - Excel
HSSFDataValidation dataValidation = new
HSSFDataValidation(rangeList, dvconstraint);
((HSSFSheet)sheet1).AddValidationData(dataVali
dation);
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).

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Export danych do word’a i excel’a

  • 1. 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
  • 2. 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.
  • 4. Obiekty com W kodzie programu najwygodniej skorzystać z formuły: using Word = Microsoft.Office.Interop.Word; oraz using 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”).
  • 5. 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.
  • 6. 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";
  • 7. Obiekty com - Word Wynik komend z poprzedniego slajdu: • 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.
  • 8. 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);
  • 9. 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.
  • 10. 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; } }
  • 11. 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;
  • 12. 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ę.
  • 13. Obiekty com - Word Przykładowa tabelka z użyciem powyższych komend:
  • 14. 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
  • 15. 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);
  • 16. Obiekty com - Word Tak wygląda stworzony diagram:
  • 17. Obiekty com - Word Wygenerowany dokument możemy zapisać: doc.SaveAs(„sciezka_pliku/nazwa.doc”, Word.WdDocumentType.wdTypeDocument); i mamy zapisany dokument Word.
  • 18. 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";
  • 19. 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)";
  • 20. 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.
  • 21. 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;
  • 22. 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.Cur rentDirectory, "example.xls"), Excel.XlFileFormat.xlWorkbookNormal); Przykładowy plik wykorzystujący wymienione komendy:
  • 23. Obiekty com - Excel
  • 24. 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.
  • 25. NPOI
  • 26. 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;
  • 27. 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);
  • 28. 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);
  • 29. 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");
  • 30. 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);
  • 31. 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.
  • 32. NPOI - Word Dokument zapisujemy za pomocą: FileStream out1 = new FileStream(Path.Combine(Environment.Current Directory, "example.docx"), FileMode.Create); doc.Write(out1); out1.Close(); Poniżej przykładowy dokument z użyciem wymienionych komend:
  • 34. NPOI - Excel Dokument xls tworzymy alnalogicznie: HSSFWorkbook workbook = new HSSFWorkbook(); Możemy dodać informacje o dokumencie: DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryIn formation(); dsi.Company = "NPOI Team"; workbook.DocumentSummaryInformation = dsi;
  • 35. 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);
  • 36. 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("She et1!$A$2:$A$4");
  • 37. NPOI - Excel HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint); ((HSSFSheet)sheet1).AddValidationData(dataVali dation); Możemy obrócić tekst w komórce o x stopni: ICellStyle style = workbook.CreateCellStyle(); style.Rotation = (short)x; row.GetCell(0).CellStyle = style;
  • 38. 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");
  • 39. 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";
  • 40. 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:
  • 41. 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();
  • 42. 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");
  • 43. 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.
  • 44. 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.
  • 45. 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();
  • 46. NPOI - Excel Przykładowy dokument z powyższymi komendami:
  • 47. 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.
  • 48. 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).