W poprzednich częściach przedstawione były zagadnienia związane z przygotowaniem prostego dokumentu oraz formatowaniem tekstu. W tej części będzie o tworzeniu tabel przy pomocy Open XML Format SDK.
Dzięki wygodnemu API jakie oferuje Open XML Format SDK tworzenie tabel jest bardzo proste i polega na dodaniu do głównego dokumentu elementu typu Table, w którym następnie osadzamy elementy typu TableRow i TableCell. Najprostszy przykład takiej tabeli wygląda następująco:
Body body = new Body(); Table table = new Table(new TableRow(new TableCell( new Paragraph(new Run(new Text("Hello World!")))))); body.Append(table);
Tabliczka mnożenia
W tym przykładzie stworzymy tabelkę z tabliczką mnożenia (zupełnie taką jak w szkole ;) ):
Multiplication table | ||||||||||
* | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
2 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
3 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 |
4 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 |
5 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |
6 | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 |
7 | 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 |
8 | 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 80 |
9 | 9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 90 |
10 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
We wstępie pokazałem jak przygotować prostą tabelkę. W tym przykładzie też będziemy osadzać w sobie obiekty TableRow i TableCell, ale dodatkowo zadbamy jeszcze o krawędzie i ustawimy by komórka w pierwszym wierszu tabeli rozszerzona była na wszystkie kolumny poniżej.
Zacznijmy więc do ustawienia obramowania, dla całej tabeli ustawimy proste pojedyncze obramowanie, w tym celu wykorzystujemy klasy: TableProperties i TableBorders. Przykład poniżej:
Table table = new Table(); TableProperties tblPr = new TableProperties(); TableBorders tblBorders = new TableBorders(); tblBorders.TopBorder = new TopBorder(); tblBorders.TopBorder.Val = new EnumValue<BorderValues>(BorderValues.Single); tblBorders.BottomBorder = new BottomBorder(); tblBorders.BottomBorder.Val =new EnumValue<BorderValues>( BorderValues.Single); tblBorders.LeftBorder = new LeftBorder(); tblBorders.LeftBorder.Val = new EnumValue<BorderValues>(BorderValues.Single); tblBorders.RightBorder = new RightBorder(); tblBorders.RightBorder.Val = new EnumValue<BorderValues>(BorderValues.Single); tblBorders.InsideHorizontalBorder = new InsideHorizontalBorder(); tblBorders.InsideHorizontalBorder.Val = BorderValues.Single; tblBorders.InsideVerticalBorder = new InsideVerticalBorder(); tblBorders.InsideVerticalBorder.Val = BorderValues.Single; tblPr.Append(tblBorders); table.Append(tblPr);
Teraz zajmijmy się pierwszym wierszem i jego komórką, dla której musimy ustawić cechę by była rozszerzona na 11 kolumn znajdujących się niżej. W tym celu ustawiamy odpowiednie właściwości komórki (TableCellProperties), a dokładniej właściwość GridSpan.
tr = new TableRow(); tc = new TableCell(new Paragraph(new Run(new Text("Multiplication table")))); TableCellProperties tcp=new TableCellProperties(); GridSpan gridSpan=new GridSpan(); gridSpan.Val=11; tcp.Append(gridSpan); tc.Append(tcp); tr.Append(tc);
Teraz zostają już do wykonania tylko proste wyliczenia i ostatecznie otrzymujemy funkcję
public void HelloWorld_table(string docName) { // Create a Wordprocessing document. using (WordprocessingDocument myDoc = WordprocessingDocument.Create(docName, WordprocessingDocumentType.Document)) { // Add a new main document part. MainDocumentPart mainPart = myDoc.AddMainDocumentPart(); //Create DOM tree for simple document. mainPart.Document = new Document(); Body body = new Body(); Table table = new Table(); TableProperties tblPr = new TableProperties(); TableBorders tblBorders = new TableBorders(); tblBorders.TopBorder = new TopBorder(); tblBorders.TopBorder.Val = new EnumValue(BorderValues.Single); tblBorders.BottomBorder = new BottomBorder(); tblBorders.BottomBorder.Val =new EnumValue ( BorderValues.Single); tblBorders.LeftBorder = new LeftBorder(); tblBorders.LeftBorder.Val = new EnumValue (BorderValues.Single); tblBorders.RightBorder = new RightBorder(); tblBorders.RightBorder.Val = new EnumValue (BorderValues.Single); tblBorders.InsideHorizontalBorder = new InsideHorizontalBorder(); tblBorders.InsideHorizontalBorder.Val = BorderValues.Single; tblBorders.InsideVerticalBorder = new InsideVerticalBorder(); tblBorders.InsideVerticalBorder.Val = BorderValues.Single; tblPr.Append(tblBorders); table.Append(tblPr); TableRow tr; TableCell tc; //first row - title tr = new TableRow(); tc = new TableCell(new Paragraph(new Run(new Text("Multiplication table")))); TableCellProperties tcp=new TableCellProperties(); GridSpan gridSpan=new GridSpan(); gridSpan.Val=11; tcp.Append(gridSpan); tc.Append(tcp); tr.Append(tc); table.Append(tr); //second row tr = new TableRow(); tc = new TableCell(); tc.Append(new Paragraph(new Run(new Text("*")))); tr.Append(tc); for (int i = 1; i <= 10; i++) { tr.Append(new TableCell(new Paragraph(new Run(new Text(i.ToString()))))); } table.Append(tr); for (int i = 1; i <= 10; i++) { tr = new TableRow(); tr.Append(new TableCell(new Paragraph(new Run(new Text(i.ToString()))))); for (int j = 1; j <= 10; j++) { tr.Append(new TableCell(new Paragraph(new Run(new Text((i*j).ToString()))))); } table.Append(tr); } //appending table to body body.Append(table); // and body to the document mainPart.Document.Append(body); // Save changes to the main document part. mainPart.Document.Save(); } }
Witam!
OdpowiedzUsuńmam problem z dodaniem kolejnej osobnej tabeli, i jakiegoś tekstu między nimi. Mógłbyś pokazać jakiś przykład...
z góry wielkie dzięki.
szymon.
czesc,
Usuńdawno juz z tym nic nie robilem, ale wydaje mi sie z powinno zadzialac cos takiego:
Body body = new Body();
Table table1 = new Table(new TableRow(new TableCell(
new Paragraph(new Run(new Text("Hello World! from Table 1"))))));
Paragraph p = new Paragraph(new Run(new Text("Paragraph")));
Table table2 = new Table(new TableRow(new TableCell(
new Paragraph(new Run(new Text("Hello World! from Table 2"))))));
body.Append(table1);
body.Append(p);
body.Append(table2);