@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 CHANGED
@@ -3708,7 +3708,7 @@ const shouldEscapeXmlAttr = (tagName, attrName)=>{
3708
3708
  minDate: undefined,
3709
3709
  maxDate: undefined
3710
3710
  }));
3711
- // Use Maps for case-insensitive unique value collection during analysis
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
- // Preserve original behavior: only build shared items for select string fields
3725
- if (field.name === 'top') {
3726
- const normalized = value.toLocaleLowerCase();
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.minValue === undefined || value < field.minValue) {
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.name === 'secteur' ? 1 : field.sharedItems.length;
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 && field.name === 'top') {
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
- if (field.name === 'secteur') {
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
- if (field.name === 'cost') {
3867
- sharedItemsAttrs.containsMixedTypes = '1';
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
- if (field.name === 'ww') {
3894
- sharedItemsAttrs.count = field.hasBlank ? '3' : '2';
3895
- sharedItemChildren.push(createElement('b', {
3896
- v: '0'
3897
- }, []));
3898
- sharedItemChildren.push(createElement('b', {
3899
- v: '1'
3900
- }, []));
3901
- if (field.hasBlank) {
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
- if (field.name === 'contratClient' || field.name === 'secteur' || field.name === 'vertical' || field.name === 'parentOppy' || field.name === 'pole' || field.name === 'oppyClosed' || field.name === 'domain' || field.name === 'businessOwner') {
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]?.name === 'date') {
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
- if (this._fields[colIdx]?.name === 'ww') {
4008
- fieldNodes.push(createElement('x', {
4009
- v: value ? '1' : '0'
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)