@visactor/vtable-export 1.2.1-alpha.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/csv/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  import type * as VTable from '@visactor/vtable';
2
+ import type { CellInfo } from '../excel';
2
3
  type IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;
3
- export declare function exportVTableToCsv(tableInstance: IVTable): string;
4
+ export type ExportVTableToCsvOptions = {
5
+ formatExportOutput?: (cellInfo: CellInfo) => string | undefined;
6
+ };
7
+ export declare function exportVTableToCsv(tableInstance: IVTable, option?: ExportVTableToCsvOptions): string;
4
8
  export {};
package/es/csv/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  const newLine = "\r\n", separator = ",";
2
2
 
3
- export function exportVTableToCsv(tableInstance) {
3
+ export function exportVTableToCsv(tableInstance, option) {
4
4
  const maxRow = tableInstance.rowCount - 1, maxCol = tableInstance.colCount - 1;
5
5
  let copyValue = "";
6
6
  for (let row = 0; row <= maxRow; row++) {
7
7
  for (let col = 0; col <= maxCol; col++) {
8
- const copyCellValue = getCopyCellValue(col, row, tableInstance);
8
+ const copyCellValue = getCopyCellValue(col, row, tableInstance, option);
9
9
  if ("undefined" != typeof Promise && copyCellValue instanceof Promise) ; else {
10
10
  const strCellValue = `${copyCellValue}`;
11
11
  /^\[object .*\]$/.exec(strCellValue) || (copyValue += strCellValue);
@@ -17,7 +17,17 @@ export function exportVTableToCsv(tableInstance) {
17
17
  return copyValue;
18
18
  }
19
19
 
20
- function getCopyCellValue(col, row, tableInstance) {
20
+ function getCopyCellValue(col, row, tableInstance, option) {
21
+ if (null == option ? void 0 : option.formatExportOutput) {
22
+ const cellInfo = {
23
+ cellType: "",
24
+ cellValue: "",
25
+ table: tableInstance,
26
+ col: col,
27
+ row: row
28
+ }, formattedValue = option.formatExportOutput(cellInfo);
29
+ if (void 0 !== formattedValue) return "string" == typeof formattedValue ? '"' + formattedValue + '"' : formattedValue;
30
+ }
21
31
  const cellRange = tableInstance.getCellRange(col, row), copyStartCol = cellRange.start.col, copyStartRow = cellRange.start.row;
22
32
  if (copyStartCol !== col || copyStartRow !== row) return "";
23
33
  const value = tableInstance.getCellValue(col, row);
@@ -1 +1 @@
1
- {"version":3,"sources":["csv/index.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,UAAU,iBAAiB,CAAC,aAAsB;IACtD,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;IAE1C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3C,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YAChE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,aAAa,YAAY,OAAO,EAAE;aAEvE;iBAAM;gBACL,MAAM,YAAY,GAAG,GAAG,aAAa,EAAE,CAAC;gBACxC,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;iBAEzC;qBAAM;oBACL,SAAS,IAAI,YAAY,CAAC;iBAC3B;aACF;YACD,SAAS,IAAI,SAAS,CAAC;SACxB;QACD,SAAS,IAAI,OAAO,CAAC;KACtB;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,GAAW,EAAE,aAAsB;IACxE,MAAM,SAAS,GAAc,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;IAEzC,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,GAAG,EAAE;QAChD,OAAO,EAAE,CAAC;KACX;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;KAC1B;IACD,OAAO,KAAK,CAAC;AACf,CAAC","file":"index.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\n\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\ntype CellRange = VTable.TYPES.CellRange;\n\nconst newLine = '\\r\\n';\nconst separator = ',';\n\nexport function exportVTableToCsv(tableInstance: IVTable): string {\n const minRow = 0;\n const maxRow = tableInstance.rowCount - 1;\n const minCol = 0;\n const maxCol = tableInstance.colCount - 1;\n\n let copyValue = '';\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const copyCellValue = getCopyCellValue(col, row, tableInstance);\n if (typeof Promise !== 'undefined' && copyCellValue instanceof Promise) {\n // not support async\n } else {\n const strCellValue = `${copyCellValue}`;\n if (/^\\[object .*\\]$/.exec(strCellValue)) {\n // ignore object\n } else {\n copyValue += strCellValue;\n }\n }\n copyValue += separator;\n }\n copyValue += newLine;\n }\n return copyValue;\n}\n\nfunction getCopyCellValue(col: number, row: number, tableInstance: IVTable): string | Promise<string> | void {\n const cellRange: CellRange = tableInstance.getCellRange(col, row);\n const copyStartCol = cellRange.start.col;\n const copyStartRow = cellRange.start.row;\n\n if (copyStartCol !== col || copyStartRow !== row) {\n return '';\n }\n\n const value = tableInstance.getCellValue(col, row);\n\n if (typeof value === 'string') {\n return '\"' + value + '\"';\n }\n return value;\n}\n"]}
1
+ {"version":3,"sources":["csv/index.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,SAAS,GAAG,GAAG,CAAC;AAMtB,MAAM,UAAU,iBAAiB,CAAC,aAAsB,EAAE,MAAiC;IACzF,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;IAE1C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3C,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YACxE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,aAAa,YAAY,OAAO,EAAE;aAEvE;iBAAM;gBACL,MAAM,YAAY,GAAG,GAAG,aAAa,EAAE,CAAC;gBACxC,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;iBAEzC;qBAAM;oBACL,SAAS,IAAI,YAAY,CAAC;iBAC3B;aACF;YACD,SAAS,IAAI,SAAS,CAAC;SACxB;QACD,SAAS,IAAI,OAAO,CAAC;KACtB;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAW,EACX,GAAW,EACX,aAAsB,EACtB,MAAiC;IAEjC,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,kBAAkB,EAAE;QAC9B,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjF,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,cAAc,KAAK,SAAS,EAAE;YAChC,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;gBACtC,OAAO,GAAG,GAAG,cAAc,GAAG,GAAG,CAAC;aACnC;YACD,OAAO,cAAc,CAAC;SACvB;KACF;IACD,MAAM,SAAS,GAAc,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;IAEzC,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,GAAG,EAAE;QAChD,OAAO,EAAE,CAAC;KACX;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;KAC1B;IACD,OAAO,KAAK,CAAC;AACf,CAAC","file":"index.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { CellInfo } from '../excel';\n\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\ntype CellRange = VTable.TYPES.CellRange;\n\nconst newLine = '\\r\\n';\nconst separator = ',';\n\nexport type ExportVTableToCsvOptions = {\n formatExportOutput?: (cellInfo: CellInfo) => string | undefined;\n};\n\nexport function exportVTableToCsv(tableInstance: IVTable, option?: ExportVTableToCsvOptions): string {\n const minRow = 0;\n const maxRow = tableInstance.rowCount - 1;\n const minCol = 0;\n const maxCol = tableInstance.colCount - 1;\n\n let copyValue = '';\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const copyCellValue = getCopyCellValue(col, row, tableInstance, option);\n if (typeof Promise !== 'undefined' && copyCellValue instanceof Promise) {\n // not support async\n } else {\n const strCellValue = `${copyCellValue}`;\n if (/^\\[object .*\\]$/.exec(strCellValue)) {\n // ignore object\n } else {\n copyValue += strCellValue;\n }\n }\n copyValue += separator;\n }\n copyValue += newLine;\n }\n return copyValue;\n}\n\nfunction getCopyCellValue(\n col: number,\n row: number,\n tableInstance: IVTable,\n option?: ExportVTableToCsvOptions\n): string | Promise<string> | void {\n if (option?.formatExportOutput) {\n const cellInfo = { cellType: '', cellValue: '', table: tableInstance, col, row };\n const formattedValue = option.formatExportOutput(cellInfo);\n if (formattedValue !== undefined) {\n if (typeof formattedValue === 'string') {\n return '\"' + formattedValue + '\"';\n }\n return formattedValue;\n }\n }\n const cellRange: CellRange = tableInstance.getCellRange(col, row);\n const copyStartCol = cellRange.start.col;\n const copyStartRow = cellRange.start.row;\n\n if (copyStartCol !== col || copyStartRow !== row) {\n return '';\n }\n\n const value = tableInstance.getCellValue(col, row);\n\n if (typeof value === 'string') {\n return '\"' + value + '\"';\n }\n return value;\n}\n"]}
@@ -1,3 +1,14 @@
1
1
  import ExcelJS from 'exceljs';
2
2
  import type { IVTable } from '../util/type';
3
- export declare function exportVTableToExcel(tableInstance: IVTable): Promise<ExcelJS.Buffer>;
3
+ export type CellInfo = {
4
+ cellType: string;
5
+ cellValue: string;
6
+ table: IVTable;
7
+ col: number;
8
+ row: number;
9
+ };
10
+ export type ExportVTableToExcelOptions = {
11
+ ignoreIcon?: boolean;
12
+ formatExportOutput?: (cellInfo: CellInfo) => string | undefined;
13
+ };
14
+ export declare function exportVTableToExcel(tableInstance: IVTable, options?: ExportVTableToExcelOptions): Promise<ExcelJS.Buffer>;
package/es/excel/index.js CHANGED
@@ -34,7 +34,7 @@ import { updateCell, renderChart, graphicUtil } from "@visactor/vtable";
34
34
 
35
35
  import { isArray } from "@visactor/vutils";
36
36
 
37
- export function exportVTableToExcel(tableInstance) {
37
+ export function exportVTableToExcel(tableInstance, options) {
38
38
  return __awaiter(this, void 0, void 0, (function*() {
39
39
  const workbook = new ExcelJS.Workbook, worksheet = workbook.addWorksheet("sheet1");
40
40
  worksheet.properties.defaultRowHeight = 40;
@@ -49,7 +49,7 @@ export function exportVTableToExcel(tableInstance) {
49
49
  const rowHeight = tableInstance.getRowHeight(row);
50
50
  worksheet.getRow(row + 1).height = rowHeight;
51
51
  }
52
- addCell(col, row, tableInstance, worksheet, workbook);
52
+ addCell(col, row, tableInstance, worksheet, workbook, options);
53
53
  const cellRange = tableInstance.getCellRange(col, row);
54
54
  if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {
55
55
  const key = `${cellRange.start.col},${cellRange.start.row}:${cellRange.end.col},${cellRange.end.row}}`;
@@ -74,13 +74,27 @@ export function exportVTableToExcel(tableInstance) {
74
74
  }));
75
75
  }
76
76
 
77
- function addCell(col, row, tableInstance, worksheet, workbook) {
77
+ function addCell(col, row, tableInstance, worksheet, workbook, options) {
78
78
  const {layoutMap: layoutMap} = tableInstance.internalProps, cellType = tableInstance.getCellType(col, row), cellValue = tableInstance.getCellValue(col, row), cellStyle = tableInstance.getCellStyle(col, row), cellLocation = tableInstance.getCellLocation(col, row), define = "body" !== cellLocation ? tableInstance.getHeaderDefine(col, row) : tableInstance.getBodyColumnDefine(col, row);
79
79
  let icons, customRender, customLayout;
80
80
  if (("body" !== cellLocation || ((null == define ? void 0 : define.dragOrder) || !!(null == define ? void 0 : define.icon) || !!(null == define ? void 0 : define.tree))) && (icons = tableInstance.getCellIcons(col, row)),
81
81
  "body" !== cellLocation ? (customRender = null == define ? void 0 : define.headerCustomRender,
82
82
  customLayout = null == define ? void 0 : define.headerCustomLayout) : (customRender = (null == define ? void 0 : define.customRender) || tableInstance.customRender,
83
- customLayout = null == define ? void 0 : define.customLayout), "image" === cellType || "video" === cellType || "progressbar" === cellType || "sparkline" === cellType || layoutMap.isAxisCell(col, row) || isArray(icons) && icons.length || customRender || customLayout) {
83
+ customLayout = null == define ? void 0 : define.customLayout), null == options ? void 0 : options.formatExportOutput) {
84
+ const cellInfo = {
85
+ cellType: cellType,
86
+ cellValue: cellValue,
87
+ table: tableInstance,
88
+ col: col,
89
+ row: row
90
+ }, formattedValue = options.formatExportOutput(cellInfo);
91
+ if (void 0 !== formattedValue) {
92
+ const cell = worksheet.getCell(encodeCellAddress(col, row));
93
+ return cell.value = formattedValue, cell.font = getCellFont(cellStyle, cellType),
94
+ cell.fill = getCellFill(cellStyle), cell.border = getCellBorder(cellStyle), void (cell.alignment = getCellAlignment(cellStyle));
95
+ }
96
+ }
97
+ if ("image" === cellType || "video" === cellType || "progressbar" === cellType || "sparkline" === cellType || layoutMap.isAxisCell(col, row) || !(null == options ? void 0 : options.ignoreIcon) && isArray(icons) && icons.length || customRender || customLayout) {
84
98
  const cellImageBase64 = exportCellImg(col, row, tableInstance), imageId = workbook.addImage({
85
99
  base64: cellImageBase64,
86
100
  extension: "png"
@@ -1 +1 @@
1
- {"version":3,"sources":["excel/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import ExcelJS from 'exceljs';\nimport { encodeCellAddress } from '../util/encode';\nimport type { CellType, IVTable } from '../util/type';\nimport { getCellAlignment, getCellBorder, getCellFill, getCellFont } from './style';\nimport { updateCell, renderChart, graphicUtil } from '@visactor/vtable';\nimport { isArray } from '@visactor/vutils';\nimport type { ColumnDefine, IRowSeriesNumber } from '@visactor/vtable/src/ts-types';\n\nexport async function exportVTableToExcel(tableInstance: IVTable) {\n const workbook = new ExcelJS.Workbook();\n const worksheet = workbook.addWorksheet('sheet1');\n worksheet.properties.defaultRowHeight = 40;\n\n const columns = [];\n const minRow = 0;\n const maxRow = tableInstance.rowCount - 1;\n const minCol = 0;\n const maxCol = tableInstance.colCount - 1;\n const mergeCells = [];\n const mergeCellSet = new Set();\n\n for (let col = minCol; col <= maxCol; col++) {\n const colWith = tableInstance.getColWidth(col);\n columns[col] = { width: colWith / 6 };\n for (let row = minRow; row <= maxRow; row++) {\n if (col === minCol) {\n const rowHeight = tableInstance.getRowHeight(row);\n const worksheetRow = worksheet.getRow(row + 1);\n // worksheetRow.height = rowHeight * 0.75;\n worksheetRow.height = rowHeight;\n }\n\n addCell(col, row, tableInstance, worksheet, workbook);\n\n const cellRange = tableInstance.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n const key = `${cellRange.start.col},${cellRange.start.row}:${cellRange.end.col},${cellRange.end.row}}`;\n if (!mergeCellSet.has(key)) {\n mergeCellSet.add(key);\n mergeCells.push(cellRange);\n }\n }\n }\n }\n\n worksheet.columns = columns;\n mergeCells.forEach(mergeCell => {\n worksheet.mergeCells(\n mergeCell.start.row + 1,\n mergeCell.start.col + 1,\n mergeCell.end.row + 1,\n mergeCell.end.col + 1\n );\n });\n\n // frozen\n const frozenView: ExcelJS.WorksheetViewFrozen[] = [];\n // top frozen\n if (tableInstance.frozenRowCount > 0) {\n frozenView.push({\n state: 'frozen',\n ySplit: tableInstance.frozenRowCount,\n // activeCell: 'A1',\n topLeftCell: encodeCellAddress(0, tableInstance.frozenRowCount)\n });\n }\n // left frozen\n if (tableInstance.frozenColCount > 0) {\n frozenView.push({\n state: 'frozen',\n xSplit: tableInstance.frozenColCount,\n // activeCell: 'A1',\n topLeftCell: encodeCellAddress(tableInstance.frozenColCount, 0)\n });\n }\n // not support bottom&right frozen\n worksheet.views = frozenView;\n\n const buffer = await workbook.xlsx.writeBuffer();\n return buffer;\n}\n\nfunction addCell(\n col: number,\n row: number,\n tableInstance: IVTable,\n worksheet: ExcelJS.Worksheet,\n workbook: ExcelJS.Workbook\n) {\n const { layoutMap } = tableInstance.internalProps;\n const cellType = tableInstance.getCellType(col, row);\n const cellValue = tableInstance.getCellValue(col, row);\n const cellStyle = tableInstance.getCellStyle(col, row);\n\n const cellLocation = tableInstance.getCellLocation(col, row);\n const define =\n cellLocation !== 'body' ? tableInstance.getHeaderDefine(col, row) : tableInstance.getBodyColumnDefine(col, row);\n const mayHaveIcon =\n cellLocation !== 'body'\n ? true\n : (define as IRowSeriesNumber)?.dragOrder || !!define?.icon || !!(define as ColumnDefine)?.tree;\n let icons;\n if (mayHaveIcon) {\n icons = tableInstance.getCellIcons(col, row);\n }\n let customRender;\n let customLayout;\n if (cellLocation !== 'body') {\n customRender = (define as ColumnDefine)?.headerCustomRender;\n customLayout = (define as ColumnDefine)?.headerCustomLayout;\n } else {\n customRender = (define as ColumnDefine)?.customRender || tableInstance.customRender;\n customLayout = (define as ColumnDefine)?.customLayout;\n }\n\n if (\n cellType === 'image' ||\n cellType === 'video' ||\n cellType === 'progressbar' ||\n cellType === 'sparkline' ||\n layoutMap.isAxisCell(col, row) ||\n (isArray(icons) && icons.length) ||\n customRender ||\n customLayout\n ) {\n const cellImageBase64 = exportCellImg(col, row, tableInstance);\n const imageId = workbook.addImage({\n base64: cellImageBase64,\n extension: 'png'\n });\n worksheet.addImage(imageId, {\n tl: { col: col + 1 / 80, row: row + 1 / 120 } as any, // ~1px\n br: { col: col + 1, row: row + 1 } as any,\n editAs: 'oneCell'\n // ext: { width: tableInstance.getColWidth(col), height: tableInstance.getRowHeight(row) }\n });\n } else if (cellType === 'text' || cellType === 'link') {\n const cell = worksheet.getCell(encodeCellAddress(col, row));\n cell.value = getCellValue(cellValue, cellType);\n cell.font = getCellFont(cellStyle, cellType);\n cell.fill = getCellFill(cellStyle);\n cell.border = getCellBorder(cellStyle);\n cell.alignment = getCellAlignment(cellStyle);\n } else if (cellType === 'chart') {\n const cellGroup = tableInstance.scenegraph.getCell(col, row);\n renderChart(cellGroup.firstChild as any); // render chart first\n const cellImageBase64 = exportCellImg(col, row, tableInstance);\n const imageId = workbook.addImage({\n base64: cellImageBase64,\n extension: 'png'\n });\n worksheet.addImage(imageId, {\n tl: { col: col + 1 / 80, row: row + 1 / 120 } as any, // ~1px\n br: { col: col + 1, row: row + 1 } as any,\n editAs: 'oneCell'\n // ext: { width: tableInstance.getColWidth(col), height: tableInstance.getRowHeight(row) }\n });\n tableInstance.scenegraph.updateNextFrame(); // rerender chart to avoid display error\n }\n}\n\nfunction getCellValue(cellValue: string, cellType: CellType) {\n if (cellType === 'link') {\n return {\n text: cellValue,\n hyperlink: cellValue,\n tooltip: cellValue\n };\n }\n return cellValue;\n}\n\nfunction exportCellImg(col: number, row: number, tableInstance: IVTable) {\n let cellGroup = tableInstance.scenegraph.getCell(col, row);\n let needRemove = false;\n if (cellGroup.role === 'empty') {\n cellGroup = updateCell(col, row, tableInstance as any, true);\n cellGroup.setStage(tableInstance.scenegraph.stage);\n needRemove = true;\n }\n const oldStroke = cellGroup.attribute.stroke;\n cellGroup.attribute.stroke = false;\n const canvas = graphicUtil.drawGraphicToCanvas(cellGroup as any, tableInstance.scenegraph.stage) as HTMLCanvasElement;\n cellGroup.attribute.stroke = oldStroke;\n if (needRemove) {\n cellGroup.parent?.removeChild(cellGroup);\n }\n return canvas.toDataURL();\n}\n"]}
1
+ {"version":3,"sources":["excel/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import ExcelJS from 'exceljs';\nimport { encodeCellAddress } from '../util/encode';\nimport type { CellType, IVTable } from '../util/type';\nimport { getCellAlignment, getCellBorder, getCellFill, getCellFont } from './style';\nimport { updateCell, renderChart, graphicUtil } from '@visactor/vtable';\nimport { isArray } from '@visactor/vutils';\nimport type { ColumnDefine, IRowSeriesNumber } from '@visactor/vtable/src/ts-types';\n\nexport type CellInfo = {\n cellType: string;\n cellValue: string;\n table: IVTable;\n col: number;\n row: number;\n};\n\nexport type ExportVTableToExcelOptions = {\n ignoreIcon?: boolean;\n formatExportOutput?: (cellInfo: CellInfo) => string | undefined;\n};\n\nexport async function exportVTableToExcel(tableInstance: IVTable, options?: ExportVTableToExcelOptions) {\n const workbook = new ExcelJS.Workbook();\n const worksheet = workbook.addWorksheet('sheet1');\n worksheet.properties.defaultRowHeight = 40;\n\n const columns = [];\n const minRow = 0;\n const maxRow = tableInstance.rowCount - 1;\n const minCol = 0;\n const maxCol = tableInstance.colCount - 1;\n const mergeCells = [];\n const mergeCellSet = new Set();\n\n for (let col = minCol; col <= maxCol; col++) {\n const colWith = tableInstance.getColWidth(col);\n columns[col] = { width: colWith / 6 };\n for (let row = minRow; row <= maxRow; row++) {\n if (col === minCol) {\n const rowHeight = tableInstance.getRowHeight(row);\n const worksheetRow = worksheet.getRow(row + 1);\n // worksheetRow.height = rowHeight * 0.75;\n worksheetRow.height = rowHeight;\n }\n\n addCell(col, row, tableInstance, worksheet, workbook, options);\n\n const cellRange = tableInstance.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n const key = `${cellRange.start.col},${cellRange.start.row}:${cellRange.end.col},${cellRange.end.row}}`;\n if (!mergeCellSet.has(key)) {\n mergeCellSet.add(key);\n mergeCells.push(cellRange);\n }\n }\n }\n }\n\n worksheet.columns = columns;\n mergeCells.forEach(mergeCell => {\n worksheet.mergeCells(\n mergeCell.start.row + 1,\n mergeCell.start.col + 1,\n mergeCell.end.row + 1,\n mergeCell.end.col + 1\n );\n });\n\n // frozen\n const frozenView: ExcelJS.WorksheetViewFrozen[] = [];\n // top frozen\n if (tableInstance.frozenRowCount > 0) {\n frozenView.push({\n state: 'frozen',\n ySplit: tableInstance.frozenRowCount,\n // activeCell: 'A1',\n topLeftCell: encodeCellAddress(0, tableInstance.frozenRowCount)\n });\n }\n // left frozen\n if (tableInstance.frozenColCount > 0) {\n frozenView.push({\n state: 'frozen',\n xSplit: tableInstance.frozenColCount,\n // activeCell: 'A1',\n topLeftCell: encodeCellAddress(tableInstance.frozenColCount, 0)\n });\n }\n // not support bottom&right frozen\n worksheet.views = frozenView;\n\n const buffer = await workbook.xlsx.writeBuffer();\n return buffer;\n}\n\nfunction addCell(\n col: number,\n row: number,\n tableInstance: IVTable,\n worksheet: ExcelJS.Worksheet,\n workbook: ExcelJS.Workbook,\n options?: ExportVTableToExcelOptions\n) {\n const { layoutMap } = tableInstance.internalProps;\n const cellType = tableInstance.getCellType(col, row);\n const cellValue = tableInstance.getCellValue(col, row);\n const cellStyle = tableInstance.getCellStyle(col, row);\n\n const cellLocation = tableInstance.getCellLocation(col, row);\n const define =\n cellLocation !== 'body' ? tableInstance.getHeaderDefine(col, row) : tableInstance.getBodyColumnDefine(col, row);\n const mayHaveIcon =\n cellLocation !== 'body'\n ? true\n : (define as IRowSeriesNumber)?.dragOrder || !!define?.icon || !!(define as ColumnDefine)?.tree;\n let icons;\n if (mayHaveIcon) {\n icons = tableInstance.getCellIcons(col, row);\n }\n let customRender;\n let customLayout;\n if (cellLocation !== 'body') {\n customRender = (define as ColumnDefine)?.headerCustomRender;\n customLayout = (define as ColumnDefine)?.headerCustomLayout;\n } else {\n customRender = (define as ColumnDefine)?.customRender || tableInstance.customRender;\n customLayout = (define as ColumnDefine)?.customLayout;\n }\n\n if (options?.formatExportOutput) {\n const cellInfo = { cellType, cellValue, table: tableInstance, col, row };\n const formattedValue = options.formatExportOutput(cellInfo);\n if (formattedValue !== undefined) {\n const cell = worksheet.getCell(encodeCellAddress(col, row));\n cell.value = formattedValue;\n cell.font = getCellFont(cellStyle, cellType);\n cell.fill = getCellFill(cellStyle);\n cell.border = getCellBorder(cellStyle);\n cell.alignment = getCellAlignment(cellStyle);\n return;\n }\n }\n\n if (\n cellType === 'image' ||\n cellType === 'video' ||\n cellType === 'progressbar' ||\n cellType === 'sparkline' ||\n layoutMap.isAxisCell(col, row) ||\n (!options?.ignoreIcon && isArray(icons) && icons.length) ||\n customRender ||\n customLayout\n ) {\n const cellImageBase64 = exportCellImg(col, row, tableInstance);\n const imageId = workbook.addImage({\n base64: cellImageBase64,\n extension: 'png'\n });\n worksheet.addImage(imageId, {\n tl: { col: col + 1 / 80, row: row + 1 / 120 } as any, // ~1px\n br: { col: col + 1, row: row + 1 } as any,\n editAs: 'oneCell'\n // ext: { width: tableInstance.getColWidth(col), height: tableInstance.getRowHeight(row) }\n });\n } else if (cellType === 'text' || cellType === 'link') {\n const cell = worksheet.getCell(encodeCellAddress(col, row));\n cell.value = getCellValue(cellValue, cellType);\n cell.font = getCellFont(cellStyle, cellType);\n cell.fill = getCellFill(cellStyle);\n cell.border = getCellBorder(cellStyle);\n cell.alignment = getCellAlignment(cellStyle);\n } else if (cellType === 'chart') {\n const cellGroup = tableInstance.scenegraph.getCell(col, row);\n renderChart(cellGroup.firstChild as any); // render chart first\n const cellImageBase64 = exportCellImg(col, row, tableInstance);\n const imageId = workbook.addImage({\n base64: cellImageBase64,\n extension: 'png'\n });\n worksheet.addImage(imageId, {\n tl: { col: col + 1 / 80, row: row + 1 / 120 } as any, // ~1px\n br: { col: col + 1, row: row + 1 } as any,\n editAs: 'oneCell'\n // ext: { width: tableInstance.getColWidth(col), height: tableInstance.getRowHeight(row) }\n });\n tableInstance.scenegraph.updateNextFrame(); // rerender chart to avoid display error\n }\n}\n\nfunction getCellValue(cellValue: string, cellType: CellType) {\n if (cellType === 'link') {\n return {\n text: cellValue,\n hyperlink: cellValue,\n tooltip: cellValue\n };\n }\n return cellValue;\n}\n\nfunction exportCellImg(col: number, row: number, tableInstance: IVTable) {\n let cellGroup = tableInstance.scenegraph.getCell(col, row);\n let needRemove = false;\n if (cellGroup.role === 'empty') {\n cellGroup = updateCell(col, row, tableInstance as any, true);\n cellGroup.setStage(tableInstance.scenegraph.stage);\n needRemove = true;\n }\n const oldStroke = cellGroup.attribute.stroke;\n cellGroup.attribute.stroke = false;\n const canvas = graphicUtil.drawGraphicToCanvas(cellGroup as any, tableInstance.scenegraph.stage) as HTMLCanvasElement;\n cellGroup.attribute.stroke = oldStroke;\n if (needRemove) {\n cellGroup.parent?.removeChild(cellGroup);\n }\n return canvas.toDataURL();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vtable-export",
3
- "version": "1.2.1-alpha.1",
3
+ "version": "1.3.0",
4
4
  "description": "The export util of VTable",
5
5
  "author": {
6
6
  "name": "VisActor",
@@ -30,11 +30,11 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
- "@visactor/vtable": "1.2.1-alpha.1",
34
33
  "@visactor/vutils": "~0.18.9",
35
34
  "file-saver": "2.0.5",
36
35
  "@types/file-saver": "2.0.7",
37
- "exceljs": "4.4.0"
36
+ "exceljs": "4.4.0",
37
+ "@visactor/vtable": "1.3.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@visactor/vchart": "1.11.0",
@@ -78,9 +78,9 @@
78
78
  "axios": "^1.4.0",
79
79
  "@types/react-is": "^17.0.3",
80
80
  "rollup-plugin-node-resolve": "5.2.0",
81
- "@internal/eslint-config": "0.0.1",
81
+ "@internal/bundler": "0.0.1",
82
82
  "@internal/ts-config": "0.0.1",
83
- "@internal/bundler": "0.0.1"
83
+ "@internal/eslint-config": "0.0.1"
84
84
  },
85
85
  "scripts": {
86
86
  "compile": "tsc --noEmit",