2018-09-12 21:01:52 +01:00
|
|
|
// http://officeopenxml.com/WPtableGrid.php
|
2018-10-23 23:44:50 +01:00
|
|
|
import { XmlComponent } from "file/xml-components";
|
2017-09-19 15:49:27 +01:00
|
|
|
import { TableGrid } from "./grid";
|
2019-09-13 00:51:20 +01:00
|
|
|
import { WidthType } from "./table-cell";
|
2018-10-23 23:44:50 +01:00
|
|
|
import { ITableFloatOptions, TableProperties } from "./table-properties";
|
2019-06-25 20:57:46 +01:00
|
|
|
import { TableLayoutType } from "./table-properties/table-layout";
|
2018-10-23 23:44:50 +01:00
|
|
|
import { TableRow } from "./table-row";
|
2019-09-13 00:51:20 +01:00
|
|
|
|
2019-03-08 01:09:21 +00:00
|
|
|
/*
|
|
|
|
0-width columns don't get rendered correctly, so we need
|
|
|
|
to give them some value. A reasonable default would be
|
|
|
|
~6in / numCols, but if we do that it becomes very hard
|
|
|
|
to resize the table using setWidth, unless the layout
|
|
|
|
algorithm is set to 'fixed'. Instead, the approach here
|
|
|
|
means even in 'auto' layout, setting a width on the
|
|
|
|
table will make it look reasonable, as the layout
|
|
|
|
algorithm will expand columns to fit its content
|
|
|
|
*/
|
2019-03-13 02:29:11 +00:00
|
|
|
export interface ITableOptions {
|
2019-09-13 00:51:20 +01:00
|
|
|
readonly rows: TableRow[];
|
2019-03-13 02:29:11 +00:00
|
|
|
readonly width?: number;
|
|
|
|
readonly widthUnitType?: WidthType;
|
|
|
|
readonly columnWidths?: number[];
|
2019-04-18 13:55:18 +10:00
|
|
|
readonly margins?: {
|
|
|
|
readonly marginUnitType?: WidthType;
|
2019-03-13 02:29:11 +00:00
|
|
|
readonly top?: number;
|
|
|
|
readonly bottom?: number;
|
|
|
|
readonly right?: number;
|
|
|
|
readonly left?: number;
|
|
|
|
};
|
|
|
|
readonly float?: ITableFloatOptions;
|
2019-06-25 20:57:46 +01:00
|
|
|
readonly layout?: TableLayoutType;
|
2019-03-13 02:29:11 +00:00
|
|
|
}
|
|
|
|
|
2017-09-19 15:49:27 +01:00
|
|
|
export class Table extends XmlComponent {
|
2018-01-29 01:55:25 +00:00
|
|
|
private readonly properties: TableProperties;
|
2017-09-19 15:49:27 +01:00
|
|
|
|
2019-03-13 02:29:11 +00:00
|
|
|
constructor({
|
|
|
|
rows,
|
|
|
|
width = 100,
|
|
|
|
widthUnitType = WidthType.AUTO,
|
2019-09-13 00:51:20 +01:00
|
|
|
columnWidths = Array<number>(Math.max(...rows.map((row) => row.CellCount))).fill(100),
|
2019-04-18 13:55:18 +10:00
|
|
|
margins: { marginUnitType, top, bottom, right, left } = { marginUnitType: WidthType.AUTO, top: 0, bottom: 0, right: 0, left: 0 },
|
2019-03-13 02:29:11 +00:00
|
|
|
float,
|
2019-06-25 20:57:46 +01:00
|
|
|
layout,
|
2019-03-13 02:29:11 +00:00
|
|
|
}: ITableOptions) {
|
2017-09-19 15:49:27 +01:00
|
|
|
super("w:tbl");
|
|
|
|
this.properties = new TableProperties();
|
|
|
|
this.root.push(this.properties);
|
2018-03-22 23:04:46 +00:00
|
|
|
this.properties.setBorder();
|
2019-03-13 02:29:11 +00:00
|
|
|
this.properties.setWidth(width, widthUnitType);
|
2019-04-18 13:55:18 +10:00
|
|
|
this.properties.CellMargin.addBottomMargin(bottom || 0, marginUnitType);
|
|
|
|
this.properties.CellMargin.addTopMargin(top || 0, marginUnitType);
|
|
|
|
this.properties.CellMargin.addLeftMargin(left || 0, marginUnitType);
|
|
|
|
this.properties.CellMargin.addRightMargin(right || 0, marginUnitType);
|
2017-09-19 15:49:27 +01:00
|
|
|
|
2019-09-13 00:51:20 +01:00
|
|
|
this.root.push(new TableGrid(columnWidths));
|
2017-09-19 15:49:27 +01:00
|
|
|
|
2019-09-13 00:51:20 +01:00
|
|
|
for (const row of rows) {
|
2019-09-22 02:39:38 +01:00
|
|
|
row.Children.forEach((cell, i) => {
|
|
|
|
cell.MetaData = {
|
|
|
|
column: rows.map((r) => r.Children[i]),
|
|
|
|
row: row,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
2019-09-13 00:51:20 +01:00
|
|
|
this.root.push(row);
|
|
|
|
}
|
2019-03-13 02:29:11 +00:00
|
|
|
|
|
|
|
if (float) {
|
|
|
|
this.properties.setTableFloatProperties(float);
|
2017-09-19 15:49:27 +01:00
|
|
|
}
|
2019-06-25 20:57:46 +01:00
|
|
|
|
|
|
|
if (layout) {
|
|
|
|
this.properties.setLayout(layout);
|
|
|
|
}
|
2017-09-19 15:49:27 +01:00
|
|
|
}
|
|
|
|
}
|