1
+ import * as R from 'ramda' ;
2
+ import XLSX from 'xlsx' ;
3
+ import { Data } from 'dash-table/components/Table/props' ;
4
+
5
+ interface IMergeObject {
6
+ s : { r : number , c : number } ;
7
+ e : { r : number , c : number } ;
8
+ }
9
+
10
+ export function transformMultDimArray ( array : ( string | string [ ] ) [ ] , maxLength : number ) : string [ ] [ ] {
11
+ const newArray : string [ ] [ ] = array . map ( row => {
12
+ if ( row instanceof Array && row . length < maxLength ) {
13
+ return row . concat ( Array ( maxLength - row . length ) . fill ( '' ) ) ;
14
+ }
15
+ if ( maxLength === 0 || maxLength === 1 ) {
16
+ return [ row ] ;
17
+ }
18
+ if ( row instanceof String || typeof ( row ) === 'string' ) {
19
+ return Array ( maxLength ) . fill ( row ) ;
20
+ }
21
+ return row ;
22
+ } ) ;
23
+ return newArray ;
24
+ }
25
+
26
+ export function getMergeRanges ( array : string [ ] [ ] ) {
27
+ let apiMergeArray : IMergeObject [ ] = [ ] ;
28
+ const iForEachOuter = R . addIndex < ( string [ ] ) , void > ( R . forEach ) ;
29
+ const iForEachInner = R . addIndex < ( string ) , void > ( R . forEach ) ;
30
+ iForEachOuter ( ( row : string [ ] , rIndex : number ) => {
31
+ let dict : any = { } ;
32
+ iForEachInner ( ( cell : string , cIndex : number ) => {
33
+ if ( ! dict [ cell ] ) {
34
+ dict [ cell ] = { s : { r : rIndex , c : cIndex } , e : { r : rIndex , c : cIndex } } ;
35
+ } else {
36
+ if ( cIndex === ( dict [ cell ] . e . c + 1 ) ) {
37
+ dict [ cell ] . e = { r : rIndex , c : cIndex } ;
38
+ } else {
39
+ apiMergeArray . push ( dict [ cell ] ) ;
40
+ dict [ cell ] = { s : { r : rIndex , c : cIndex } , e : { r : rIndex , c : cIndex } } ;
41
+ }
42
+ }
43
+ } , row ) ;
44
+ const objectsToMerge : IMergeObject [ ] = Object . values ( dict ) ;
45
+ apiMergeArray = R . concat ( apiMergeArray , objectsToMerge ) ;
46
+ } , array ) ;
47
+ return R . filter ( ( item : IMergeObject ) => item . s . c !== item . e . c || item . s . r !== item . e . r , apiMergeArray ) ;
48
+ }
49
+
50
+ export function createWorkbook ( ws : XLSX . WorkSheet ) {
51
+ const wb = XLSX . utils . book_new ( ) ;
52
+ XLSX . utils . book_append_sheet ( wb , ws , 'SheetJS' ) ;
53
+ return wb ;
54
+ }
55
+
56
+ export function createWorksheet ( heading : string [ ] [ ] , data : Data , columnID : string [ ] , exportHeader : string ) {
57
+ const ws = XLSX . utils . aoa_to_sheet ( heading ) ;
58
+ if ( exportHeader === 'display' || exportHeader === 'names' || exportHeader === 'none' ) {
59
+ XLSX . utils . sheet_add_json ( ws , data , {
60
+ skipHeader : true ,
61
+ origin : heading . length
62
+ } ) ;
63
+ if ( exportHeader === 'display' ) {
64
+ ws [ '!merges' ] = getMergeRanges ( heading ) ;
65
+ }
66
+ } else if ( exportHeader === 'ids' ) {
67
+ XLSX . utils . sheet_add_json ( ws , data , { header : columnID } ) ;
68
+ }
69
+ return ws ;
70
+ }
71
+
72
+ export function createHeadings ( columnHeaders : ( string | string [ ] ) [ ] , maxLength : number ) {
73
+ const transformedArray = transformMultDimArray ( columnHeaders , maxLength ) ;
74
+ return R . transpose ( transformedArray ) ;
75
+ }
0 commit comments