Skip to content

Commit 57fd995

Browse files
committed
feat(table): update column/row size by index
1 parent daee588 commit 57fd995

File tree

5 files changed

+122
-3
lines changed

5 files changed

+122
-3
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Automizer, { CmToDxa, modify, TableData } from '../src/index';
2+
3+
test('update row hight/column width in a nested table', async () => {
4+
const automizer = new Automizer({
5+
templateDir: `${__dirname}/pptx-templates`,
6+
outputDir: `${__dirname}/pptx-output`,
7+
});
8+
9+
const pres = automizer
10+
.loadRoot(`RootTemplate.pptx`)
11+
.load(`NestedTables.pptx`, 'tables');
12+
13+
await pres
14+
.addSlide('tables', 4, async (slide) => {
15+
const tableData: TableData = {
16+
body: [
17+
{ values: ['top left', 123, 345, 'subsub3-1', 'subsub3-2', 'Last'] },
18+
{ values: [undefined, 't1', 't2', 't3', 't3', ''] },
19+
{ values: ['label 0', 1, 2, 3, 3, 'l0'] },
20+
{ values: ['label 1', 123, 345, 4563, 4671, 'l1'] },
21+
{ values: ['label 2', 123, 345, 4562, 4672] },
22+
{ values: ['label 3', 123, 345, 4561, 4673, 'l3'] },
23+
{ values: [undefined, 'Foo', 'ter', 4564, 4674, ''] },
24+
],
25+
};
26+
27+
slide.modifyElement('NestedTable3', [
28+
modify.setTable(tableData, {
29+
expand: [
30+
{
31+
mode: 'row',
32+
tag: '{{each:row}}',
33+
count: 3,
34+
},
35+
{
36+
mode: 'column',
37+
tag: '{{each:subSub3}}',
38+
count: 1,
39+
},
40+
],
41+
}),
42+
// Update first column width to 8cm
43+
modify.updateColumnWidth(0, CmToDxa(8)),
44+
// Update last row's height to 3cm
45+
modify.updateRowHeight(6, CmToDxa(3)),
46+
// Will also work on non-nested tables
47+
]);
48+
})
49+
.write(`modify-nested-table-grid-size.test.pptx`);
50+
51+
// expect(data.length).toBe(12);
52+
});

__tests__/modify-nested-table.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Automizer, { modify, TableData } from '../src/index';
22

3-
test('read table data from slide', async () => {
3+
test('modify a nested table with tags', async () => {
44
const automizer = new Automizer({
55
templateDir: `${__dirname}/pptx-templates`,
66
outputDir: `${__dirname}/pptx-output`,

src/helper/modify-table-helper.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ModifyTableParams, TableData, TableInfo } from '../types/table-types';
1+
import { ModifyTableParams, TableData } from '../types/table-types';
22
import { ModifyTable } from '../modify/modify-table';
33
import { XmlDocument, XmlElement } from '../types/xml-types';
44
import { XmlSlideHelper } from './xml-slide-helper';
@@ -69,4 +69,17 @@ export default class ModifyTableHelper {
6969
const modTable = new ModifyTable(element, data);
7070
modTable.adjustWidth();
7171
};
72+
73+
static updateColumnWidth =
74+
(index: number, size: number) =>
75+
(element: XmlDocument | XmlElement): void => {
76+
const modTable = new ModifyTable(element);
77+
modTable.updateColumnWidth(index, size);
78+
};
79+
static updateRowHeight =
80+
(index: number, size: number) =>
81+
(element: XmlDocument | XmlElement): void => {
82+
const modTable = new ModifyTable(element);
83+
modTable.updateRowHeight(index, size);
84+
};
7285
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ const setTableData = ModifyTableHelper.setTableData;
5757
const adjustHeight = ModifyTableHelper.adjustHeight;
5858
const adjustWidth = ModifyTableHelper.adjustWidth;
5959
const setTable = ModifyTableHelper.setTable;
60+
const updateColumnWidth = ModifyTableHelper.updateColumnWidth;
61+
const updateRowHeight = ModifyTableHelper.updateRowHeight;
6062

6163
const setRelationTarget = ModifyImageHelper.setRelationTarget;
6264
const setDuotoneFill = ModifyImageHelper.setDuotoneFill;
@@ -124,6 +126,8 @@ export const modify = {
124126
setTableData,
125127
adjustHeight,
126128
adjustWidth,
129+
updateColumnWidth,
130+
updateRowHeight,
127131
setTable,
128132
setRelationTarget,
129133
setDuotoneFill,

src/modify/modify-table.ts

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export class ModifyTable {
2525
this.table = new ModifyXmlHelper(table);
2626
this.xml = table;
2727

28-
this.data.body.forEach((row) => {
28+
this.data?.body.forEach((row) => {
2929
this.maxCols =
3030
row.values.length > this.maxCols ? row.values.length : this.maxCols;
3131
});
@@ -241,6 +241,56 @@ export class ModifyTable {
241241
return this;
242242
}
243243

244+
updateColumnWidth(c: number, size: number) {
245+
const tableWidth = this.getTableSize('cx');
246+
const targetSize = Math.round(size);
247+
let currentSize = 0;
248+
249+
this.table.modify({
250+
'a:gridCol': {
251+
index: c,
252+
modify: [
253+
(ele) => {
254+
currentSize = Number(ele.getAttribute('w'));
255+
},
256+
ModifyXmlHelper.attribute('w', targetSize),
257+
],
258+
},
259+
});
260+
261+
const diff = currentSize - targetSize;
262+
const targetWidth = tableWidth - diff;
263+
264+
this.setSize('cx', targetWidth);
265+
266+
return this;
267+
}
268+
269+
updateRowHeight(r: number, size: number) {
270+
const tableSize = this.getTableSize('cy');
271+
const targetSize = Math.round(size);
272+
let currentSize = 0;
273+
274+
this.table.modify({
275+
'a:tr': {
276+
index: r,
277+
modify: [
278+
(ele) => {
279+
currentSize = Number(ele.getAttribute('h'));
280+
},
281+
ModifyXmlHelper.attribute('h', targetSize),
282+
],
283+
},
284+
});
285+
286+
const diff = currentSize - targetSize;
287+
const targetTableSize = tableSize - diff;
288+
289+
this.setSize('cy', targetTableSize);
290+
291+
return this;
292+
}
293+
244294
setSize(orientation: 'cx' | 'cy', size: number): void {
245295
const sizeElement = this.xml
246296
.getElementsByTagName('p:xfrm')[0]

0 commit comments

Comments
 (0)