@niicojs/excel 0.3.3 → 0.3.4
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/dist/index.cjs +32 -76
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -76
- package/package.json +1 -1
- package/src/pivot-cache.ts +26 -78
package/dist/index.cjs
CHANGED
|
@@ -3708,7 +3708,7 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3708
3708
|
minDate: undefined,
|
|
3709
3709
|
maxDate: undefined
|
|
3710
3710
|
}));
|
|
3711
|
-
// Use Maps for
|
|
3711
|
+
// Use Maps for unique value collection during analysis
|
|
3712
3712
|
const sharedItemsMaps = this._fields.map(()=>new Map());
|
|
3713
3713
|
// Analyze data to determine field types and collect unique values
|
|
3714
3714
|
for (const row of data){
|
|
@@ -3721,31 +3721,26 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3721
3721
|
}
|
|
3722
3722
|
if (typeof value === 'string') {
|
|
3723
3723
|
field.isNumeric = false;
|
|
3724
|
-
|
|
3725
|
-
if (
|
|
3726
|
-
|
|
3727
|
-
const map = sharedItemsMaps[colIdx];
|
|
3728
|
-
if (!map.has(normalized)) {
|
|
3729
|
-
map.set(normalized, value);
|
|
3730
|
-
}
|
|
3724
|
+
const map = sharedItemsMaps[colIdx];
|
|
3725
|
+
if (!map.has(value)) {
|
|
3726
|
+
map.set(value, value);
|
|
3731
3727
|
}
|
|
3732
3728
|
} else if (typeof value === 'number') {
|
|
3733
|
-
if (field.
|
|
3734
|
-
field.minValue = value;
|
|
3735
|
-
}
|
|
3736
|
-
if (field.maxValue === undefined || value > field.maxValue) {
|
|
3737
|
-
field.maxValue = value;
|
|
3738
|
-
}
|
|
3739
|
-
if (field.name === 'date') {
|
|
3729
|
+
if (field.isDate) {
|
|
3740
3730
|
const d = this._excelSerialToDate(value);
|
|
3741
|
-
field.isDate = true;
|
|
3742
|
-
field.isNumeric = false;
|
|
3743
3731
|
if (!field.minDate || d < field.minDate) {
|
|
3744
3732
|
field.minDate = d;
|
|
3745
3733
|
}
|
|
3746
3734
|
if (!field.maxDate || d > field.maxDate) {
|
|
3747
3735
|
field.maxDate = d;
|
|
3748
3736
|
}
|
|
3737
|
+
} else {
|
|
3738
|
+
if (field.minValue === undefined || value < field.minValue) {
|
|
3739
|
+
field.minValue = value;
|
|
3740
|
+
}
|
|
3741
|
+
if (field.maxValue === undefined || value > field.maxValue) {
|
|
3742
|
+
field.maxValue = value;
|
|
3743
|
+
}
|
|
3749
3744
|
}
|
|
3750
3745
|
} else if (value instanceof Date) {
|
|
3751
3746
|
field.isDate = true;
|
|
@@ -3764,19 +3759,10 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3764
3759
|
}
|
|
3765
3760
|
// Resolve number formats if styles are available
|
|
3766
3761
|
if (this._styles) {
|
|
3767
|
-
const numericFmtId = 164;
|
|
3768
3762
|
const dateFmtId = this._styles.getOrCreateNumFmtId('mm-dd-yy');
|
|
3769
3763
|
for (const field of this._fields){
|
|
3770
3764
|
if (field.isDate) {
|
|
3771
3765
|
field.numFmtId = dateFmtId;
|
|
3772
|
-
continue;
|
|
3773
|
-
}
|
|
3774
|
-
if (field.isNumeric) {
|
|
3775
|
-
if (field.name === 'jours') {
|
|
3776
|
-
field.numFmtId = 0;
|
|
3777
|
-
} else {
|
|
3778
|
-
field.numFmtId = numericFmtId;
|
|
3779
|
-
}
|
|
3780
3766
|
}
|
|
3781
3767
|
}
|
|
3782
3768
|
}
|
|
@@ -3788,9 +3774,6 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3788
3774
|
const map = sharedItemsMaps[colIdx];
|
|
3789
3775
|
// Convert Map values to array (maintains insertion order in ES6+)
|
|
3790
3776
|
field.sharedItems = Array.from(map.values());
|
|
3791
|
-
if (field.name !== 'top') {
|
|
3792
|
-
field.sharedItems = [];
|
|
3793
|
-
}
|
|
3794
3777
|
// Build reverse lookup Map: value -> index
|
|
3795
3778
|
if (field.sharedItems.length > 0) {
|
|
3796
3779
|
const indexMap = new Map();
|
|
@@ -3799,7 +3782,7 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3799
3782
|
}
|
|
3800
3783
|
this._sharedItemsIndexMap.set(colIdx, indexMap);
|
|
3801
3784
|
if (field.hasBlank) {
|
|
3802
|
-
const blankIndex = field.
|
|
3785
|
+
const blankIndex = field.sharedItems.length;
|
|
3803
3786
|
this._blankItemIndexMap.set(colIdx, blankIndex);
|
|
3804
3787
|
}
|
|
3805
3788
|
}
|
|
@@ -3824,10 +3807,11 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3824
3807
|
const cacheFieldNodes = this._fields.map((field)=>{
|
|
3825
3808
|
const sharedItemsAttrs = {};
|
|
3826
3809
|
const sharedItemChildren = [];
|
|
3827
|
-
if (field.sharedItems.length > 0
|
|
3810
|
+
if (field.sharedItems.length > 0) {
|
|
3828
3811
|
// String field with shared items
|
|
3829
3812
|
const total = field.hasBlank ? field.sharedItems.length + 1 : field.sharedItems.length;
|
|
3830
3813
|
sharedItemsAttrs.count = String(total);
|
|
3814
|
+
sharedItemsAttrs.containsString = '1';
|
|
3831
3815
|
if (field.hasBlank) {
|
|
3832
3816
|
sharedItemsAttrs.containsBlank = '1';
|
|
3833
3817
|
}
|
|
@@ -3837,15 +3821,8 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3837
3821
|
}, []));
|
|
3838
3822
|
}
|
|
3839
3823
|
if (field.hasBlank) {
|
|
3840
|
-
|
|
3841
|
-
sharedItemChildren.splice(1, 0, createElement('m', {}, []));
|
|
3842
|
-
} else {
|
|
3843
|
-
sharedItemChildren.push(createElement('m', {}, []));
|
|
3844
|
-
}
|
|
3824
|
+
sharedItemChildren.push(createElement('m', {}, []));
|
|
3845
3825
|
}
|
|
3846
|
-
} else if (field.name !== 'top' && field.sharedItems.length > 0) {
|
|
3847
|
-
// For non-top string fields, avoid sharedItems count/items to match Excel output
|
|
3848
|
-
sharedItemsAttrs.containsString = '0';
|
|
3849
3826
|
} else if (field.isDate) {
|
|
3850
3827
|
sharedItemsAttrs.containsSemiMixedTypes = '0';
|
|
3851
3828
|
sharedItemsAttrs.containsString = '0';
|
|
@@ -3863,14 +3840,8 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3863
3840
|
}
|
|
3864
3841
|
} else if (field.isNumeric) {
|
|
3865
3842
|
// Numeric field - use "0"/"1" for boolean attributes as Excel expects
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
} else {
|
|
3869
|
-
if (field.name !== 'jours') {
|
|
3870
|
-
sharedItemsAttrs.containsSemiMixedTypes = '0';
|
|
3871
|
-
}
|
|
3872
|
-
sharedItemsAttrs.containsString = '0';
|
|
3873
|
-
}
|
|
3843
|
+
sharedItemsAttrs.containsSemiMixedTypes = '0';
|
|
3844
|
+
sharedItemsAttrs.containsString = '0';
|
|
3874
3845
|
sharedItemsAttrs.containsNumber = '1';
|
|
3875
3846
|
if (field.hasBlank) {
|
|
3876
3847
|
sharedItemsAttrs.containsBlank = '1';
|
|
@@ -3886,31 +3857,22 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3886
3857
|
}
|
|
3887
3858
|
} else if (field.hasBoolean) {
|
|
3888
3859
|
// Boolean-only field (no strings, no numbers)
|
|
3889
|
-
// Excel does not add contains* flags for ww in this dataset
|
|
3890
3860
|
if (field.hasBlank) {
|
|
3891
3861
|
sharedItemsAttrs.containsBlank = '1';
|
|
3892
3862
|
}
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
sharedItemChildren.push(createElement('m', {}, []));
|
|
3903
|
-
}
|
|
3863
|
+
sharedItemsAttrs.count = field.hasBlank ? '3' : '2';
|
|
3864
|
+
sharedItemChildren.push(createElement('b', {
|
|
3865
|
+
v: '0'
|
|
3866
|
+
}, []));
|
|
3867
|
+
sharedItemChildren.push(createElement('b', {
|
|
3868
|
+
v: '1'
|
|
3869
|
+
}, []));
|
|
3870
|
+
if (field.hasBlank) {
|
|
3871
|
+
sharedItemChildren.push(createElement('m', {}, []));
|
|
3904
3872
|
}
|
|
3905
3873
|
} else if (field.hasBlank) {
|
|
3906
3874
|
// Field that only contains blanks
|
|
3907
|
-
|
|
3908
|
-
sharedItemsAttrs.containsBlank = '1';
|
|
3909
|
-
} else {
|
|
3910
|
-
sharedItemsAttrs.containsNonDate = '0';
|
|
3911
|
-
sharedItemsAttrs.containsString = '0';
|
|
3912
|
-
sharedItemsAttrs.containsBlank = '1';
|
|
3913
|
-
}
|
|
3875
|
+
sharedItemsAttrs.containsBlank = '1';
|
|
3914
3876
|
}
|
|
3915
3877
|
const sharedItemsNode = createElement('sharedItems', sharedItemsAttrs, sharedItemChildren);
|
|
3916
3878
|
const cacheFieldAttrs = {
|
|
@@ -3993,7 +3955,7 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
3993
3955
|
}, []));
|
|
3994
3956
|
}
|
|
3995
3957
|
} else if (typeof value === 'number') {
|
|
3996
|
-
if (this._fields[colIdx]?.
|
|
3958
|
+
if (this._fields[colIdx]?.isDate) {
|
|
3997
3959
|
const d = this._excelSerialToDate(value);
|
|
3998
3960
|
fieldNodes.push(createElement('d', {
|
|
3999
3961
|
v: this._formatDate(d)
|
|
@@ -4004,15 +3966,9 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
|
|
|
4004
3966
|
}, []));
|
|
4005
3967
|
}
|
|
4006
3968
|
} else if (typeof value === 'boolean') {
|
|
4007
|
-
|
|
4008
|
-
|
|
4009
|
-
|
|
4010
|
-
}, []));
|
|
4011
|
-
} else {
|
|
4012
|
-
fieldNodes.push(createElement('b', {
|
|
4013
|
-
v: value ? '1' : '0'
|
|
4014
|
-
}, []));
|
|
4015
|
-
}
|
|
3969
|
+
fieldNodes.push(createElement('b', {
|
|
3970
|
+
v: value ? '1' : '0'
|
|
3971
|
+
}, []));
|
|
4016
3972
|
} else if (value instanceof Date) {
|
|
4017
3973
|
fieldNodes.push(createElement('d', {
|
|
4018
3974
|
v: this._formatDate(value)
|