# Tables

You can create tables with `docx`. More information can be found [here](http://officeopenxml.com/WPtable.php).

## Create Table

To create a table, simply use the `createTable()` method on a `document`.

```ts
const table = doc.createTable([NUMBER OF ROWS], [NUMBER OF COLUMNS]);
```

Alternatively, you can create a table object directly, and then add it in the `document`

```ts
const table = new Table(4, 4);
doc.addTable(table);
```

The snippet below creates a table of 2 rows and 4 columns.

```ts
const table = doc.createTable(2, 4);

// Or

const table = new Table(2, 4);
doc.addTable(table);
```

## Rows and Columns

You can get a row or a column from a table like so, where `index` is a number:

### Get Row

```ts
const row = doc.getRow(index);
```

With this, you can merge a row by using the `mergeCells()` method, where `startIndex` is the row number you want to merge from, and `endIndex` is where you want it to merge to:

```ts
row.mergeCells(startIndex, endIndex);
```

You can get a cell from a `row` by using the `getCell()` method, where `index` is the row index:

```ts
row.getCell(index);
```

### Get Column

```ts
const column = doc.getColumn(index);
```

Again, you can merge a row by using the `mergeCells()` method, where `startIndex` is the row number you want to merge from, and `endIndex` is where you want it to merge to:

```ts
column.mergeCells(startIndex, endIndex);
```

You can get a cell from a `column` by using the `getCell()` method, where `index` is the column index:

```ts
column.getCell(index);
```

## Cells

The `createTable()` method created a table with cells. To access the cell, use the `getCell()` method.

```ts
const cell = table.getCell([ROW INDEX], [COLUMN INDEX]);
```

You can also get a cell from a `column` or a `row` with `getCell()`, mentioned previously.

For example:

```ts
const cell = table.getCell(0, 2);

const cell = row.getCell(0);

const cell = column.getCell(2);
```

### Add paragraph to a cell

Once you have got the cell, you can add data to it with the `addParagraph()` method.

```ts
cell.addParagraph(new Paragraph("Hello"));
```

## Borders

BorderStyle can be imported from `docx`. Size determines the thickness. HTML color can be a hex code or alias such as `red`.

```ts
cell.Borders.addTopBorder([BorderStyle], [SIZE], [HTML COLOR]);
```

```ts
cell.Borders.addBottomBorder([BorderStyle], [SIZE], [HTML COLOR]);
```

```ts
cell.Borders.addStartBorder([[BorderStyle]], [SIZE], [HTML COLOR]);
```

```ts
cell.Borders.addEndBorder([BorderStyle], [SIZE], [HTML COLOR]);
```

### Example

```ts
import { BorderStyle } from "docx";

cell.Borders.addStartBorder(BorderStyle.DOT_DOT_DASH, 3, "green");
cell.Borders.addStartBorder(BorderStyle.DOT_DOT_DASH, 3, "#ff8000");
```

## Set Width

```ts
import { WidthType } from "docx";

table.setWidth([WIDTH], [OPTIONAL WidthType. Defaults to DXA]);
```

For example:

```ts
table.setWidth(4535, WidthType.DXA);
```

## Vertical Align

Sets the vertical alignment of the contents of the cell

```ts
import { VerticalAlign } from "docx";

cell.setVerticalAlign([VerticalAlign TYPE]);
```

For example, to center align a cell:

```ts
cell.setVerticalAlign(VerticalAlign.CENTER);
```

## Rows

To get a row, use the `getRow` method on a `table`. There are a handful of methods which you can apply to a row which will be explained below.

```ts
table.getRow([ROW INDEX]);
```

## Merge cells together

### Merging on a row

First obtain the row, and call `mergeCells()`. The first argument is where the merge should start. The second argument is where the merge should end.

```ts
table.getRow(0).mergeCells([FROM INDEX], [TO INDEX]);
```

#### Example

This will merge 3 cells together starting from index `0`:

```ts
table.getRow(0).mergeCells(0, 2);
```

### Merging on a column

It has not been implemented yet, but it will follow a similar structure as merging a row.

## Nested Tables

To have a table within a table

```ts
cell.addTable(new Table(1, 1));
```

## Examples

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo4.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo4.ts_

### Custom borders

Example showing how to add colourful borders to tables

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo20.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo20.ts_

### Adding images

Example showing how to add images to tables

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo24.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo24.ts_

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo36.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo36.ts_

### Alignment of text in a cell

Example showing how align text in a table cell

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo31.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo31.ts_

### Merging rows

Example showing merging of `rows`

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo32.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo32.ts_

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo41.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo41.ts_

### Merging columns

Example showing merging of `columns`

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo43.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo43.ts_

### Floating tables

[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/demo34.ts ':include')

_Source: https://github.com/dolanmiu/docx/blob/master/demo/demo34.ts_

