:fix: insert the continue cell properly
This commit is contained in:
@ -331,6 +331,41 @@ const table7 = new Table({
|
||||
},
|
||||
});
|
||||
|
||||
const table8 = new Table({
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({ children: [new Paragraph("1,1")] }),
|
||||
new TableCell({ children: [new Paragraph("1,2")] }),
|
||||
new TableCell({ children: [new Paragraph("1,3")] }),
|
||||
new TableCell({ children: [new Paragraph("1,4")], rowSpan: 4, borders }),
|
||||
],
|
||||
}),
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({ children: [new Paragraph("2,1")] }),
|
||||
new TableCell({ children: [new Paragraph("2,2")] }),
|
||||
new TableCell({ children: [new Paragraph("2,3")], rowSpan: 3 }),
|
||||
],
|
||||
}),
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({ children: [new Paragraph("3,1")] }),
|
||||
new TableCell({ children: [new Paragraph("3,2")], rowSpan: 2 }),
|
||||
],
|
||||
}),
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({ children: [new Paragraph("4,1")] }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
width: {
|
||||
size: 100,
|
||||
type: WidthType.PERCENTAGE,
|
||||
},
|
||||
});
|
||||
|
||||
doc.addSection({
|
||||
children: [
|
||||
table,
|
||||
@ -352,6 +387,8 @@ doc.addSection({
|
||||
table6,
|
||||
new Paragraph("Merging columns 4"),
|
||||
table7,
|
||||
new Paragraph("Merging columns 5"),
|
||||
table8,
|
||||
],
|
||||
});
|
||||
|
||||
|
@ -70,6 +70,9 @@ export class TableCell extends XmlComponent {
|
||||
|
||||
if (options.verticalMerge) {
|
||||
this.properties.addVerticalMerge(options.verticalMerge);
|
||||
} else if (options.rowSpan && options.rowSpan > 1) {
|
||||
// if cell already have a `verticalMerge`, don't handle `rowSpan`
|
||||
this.properties.addVerticalMerge(VerticalMergeType.RESTART);
|
||||
}
|
||||
|
||||
if (options.margins) {
|
||||
@ -84,10 +87,6 @@ export class TableCell extends XmlComponent {
|
||||
this.properties.addGridSpan(options.columnSpan);
|
||||
}
|
||||
|
||||
if (options.rowSpan && options.rowSpan > 1) {
|
||||
this.properties.addVerticalMerge(VerticalMergeType.RESTART);
|
||||
}
|
||||
|
||||
if (options.width) {
|
||||
this.properties.setWidth(options.width.size, options.width.type);
|
||||
}
|
||||
|
@ -79,25 +79,26 @@ export class Table extends XmlComponent {
|
||||
}
|
||||
|
||||
rows.forEach((row, rowIndex) => {
|
||||
row.cells.forEach((cell, cellIndex) => {
|
||||
if (rowIndex === rows.length - 1) {
|
||||
// don't process the end row
|
||||
return;
|
||||
}
|
||||
let columnIndex = 0;
|
||||
row.cells.forEach((cell) => {
|
||||
// Row Span has to be added in this method and not the constructor because it needs to know information about the column which happens after Table Cell construction
|
||||
// Row Span of 1 will crash word as it will add RESTART and not a corresponding CONTINUE
|
||||
if (cell.options.rowSpan && cell.options.rowSpan > 1) {
|
||||
const columnIndex = row.rootIndexToColumnIndex(cellIndex + 1);
|
||||
const startRowIndex = rowIndex + 1;
|
||||
const endRowIndex = rowIndex + (cell.options.rowSpan - 1);
|
||||
for (let i = startRowIndex; i <= endRowIndex; i++) {
|
||||
rows[i].addCellToColumnIndex(
|
||||
new TableCell({
|
||||
columnSpan: cell.options.columnSpan,
|
||||
borders: cell.options.borders,
|
||||
children: [],
|
||||
verticalMerge: VerticalMergeType.CONTINUE,
|
||||
}),
|
||||
columnIndex,
|
||||
);
|
||||
}
|
||||
const continueCell = new TableCell({
|
||||
// the inserted CONTINUE cell has rowSpan, and will be handled when process the next row
|
||||
rowSpan: cell.options.rowSpan - 1,
|
||||
columnSpan: cell.options.columnSpan,
|
||||
borders: cell.options.borders,
|
||||
children: [],
|
||||
verticalMerge: VerticalMergeType.CONTINUE,
|
||||
});
|
||||
rows[rowIndex + 1].addCellToColumnIndex(continueCell, columnIndex);
|
||||
}
|
||||
columnIndex += cell.options.columnSpan || 1;
|
||||
});
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user