@cj-tech-master/excelts 9.2.1 → 9.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.
Files changed (383) hide show
  1. package/README.md +25 -2
  2. package/README_zh.md +29 -6
  3. package/dist/browser/index.browser.d.ts +1 -1
  4. package/dist/browser/index.browser.js +4 -0
  5. package/dist/browser/index.d.ts +1 -1
  6. package/dist/browser/index.js +4 -0
  7. package/dist/browser/modules/excel/cell.d.ts +17 -3
  8. package/dist/browser/modules/excel/cell.js +170 -22
  9. package/dist/browser/modules/excel/defined-names.d.ts +96 -1
  10. package/dist/browser/modules/excel/defined-names.js +411 -21
  11. package/dist/browser/modules/excel/image.d.ts +11 -0
  12. package/dist/browser/modules/excel/image.js +24 -1
  13. package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  14. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +14 -0
  15. package/dist/browser/modules/excel/stream/workbook-reader.d.ts +2 -1
  16. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  17. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +48 -1
  18. package/dist/browser/modules/excel/stream/workbook-writer.d.ts +3 -2
  19. package/dist/browser/modules/excel/stream/worksheet-reader.js +17 -1
  20. package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +39 -6
  21. package/dist/browser/modules/excel/stream/worksheet-writer.js +45 -5
  22. package/dist/browser/modules/excel/table.js +15 -2
  23. package/dist/browser/modules/excel/types.d.ts +133 -2
  24. package/dist/browser/modules/excel/utils/col-cache.d.ts +1 -0
  25. package/dist/browser/modules/excel/utils/col-cache.js +15 -0
  26. package/dist/browser/modules/excel/utils/drawing-utils.d.ts +3 -3
  27. package/dist/browser/modules/excel/utils/drawing-utils.js +4 -0
  28. package/dist/browser/modules/excel/utils/external-link-formula.d.ts +76 -0
  29. package/dist/browser/modules/excel/utils/external-link-formula.js +208 -0
  30. package/dist/browser/modules/excel/utils/iterate-stream.d.ts +9 -3
  31. package/dist/browser/modules/excel/utils/iterate-stream.js +3 -1
  32. package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +19 -0
  33. package/dist/browser/modules/excel/utils/ooxml-paths.js +37 -2
  34. package/dist/browser/modules/excel/utils/shared-strings.d.ts +8 -3
  35. package/dist/browser/modules/excel/utils/shared-strings.js +21 -2
  36. package/dist/browser/modules/excel/utils/workbook-protection.d.ts +30 -0
  37. package/dist/browser/modules/excel/utils/workbook-protection.js +30 -0
  38. package/dist/browser/modules/excel/workbook.browser.d.ts +257 -6
  39. package/dist/browser/modules/excel/workbook.browser.js +318 -34
  40. package/dist/browser/modules/excel/workbook.d.ts +1 -1
  41. package/dist/browser/modules/excel/worksheet.d.ts +3 -1
  42. package/dist/browser/modules/excel/worksheet.js +21 -2
  43. package/dist/browser/modules/excel/xlsx/rel-type.d.ts +15 -0
  44. package/dist/browser/modules/excel/xlsx/rel-type.js +16 -1
  45. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  46. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  47. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  48. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  49. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  50. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  51. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  52. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  53. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  54. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  55. package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  56. package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  57. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  58. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  59. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  60. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  61. package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  62. package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  63. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  64. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  65. package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  66. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  67. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  68. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  69. package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  70. package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  71. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +410 -20
  72. package/dist/browser/modules/excel/xlsx/xlsx.d.ts +7 -4
  73. package/dist/browser/modules/excel/xlsx/xlsx.js +4 -5
  74. package/dist/browser/modules/formula/compile/address-utils.d.ts +62 -0
  75. package/dist/browser/modules/formula/compile/address-utils.js +83 -0
  76. package/dist/browser/modules/formula/compile/binder.d.ts +42 -0
  77. package/dist/browser/modules/formula/compile/binder.js +487 -0
  78. package/dist/browser/modules/formula/compile/bound-ast.d.ts +230 -0
  79. package/dist/browser/modules/formula/compile/bound-ast.js +80 -0
  80. package/dist/browser/modules/formula/compile/compiled-formula.d.ts +137 -0
  81. package/dist/browser/modules/formula/compile/compiled-formula.js +383 -0
  82. package/dist/browser/modules/formula/compile/dependency-analysis.d.ts +93 -0
  83. package/dist/browser/modules/formula/compile/dependency-analysis.js +432 -0
  84. package/dist/browser/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  85. package/dist/browser/modules/formula/compile/structured-ref-utils.js +136 -0
  86. package/dist/browser/modules/formula/default-syntax-probe.d.ts +79 -0
  87. package/dist/browser/modules/formula/default-syntax-probe.js +83 -0
  88. package/dist/browser/modules/formula/functions/_date-context.d.ts +4 -0
  89. package/dist/browser/modules/formula/functions/_date-context.js +29 -0
  90. package/dist/browser/modules/formula/functions/_shared.d.ts +121 -0
  91. package/dist/browser/modules/formula/functions/_shared.js +381 -0
  92. package/dist/browser/modules/formula/functions/conditional.d.ts +27 -0
  93. package/dist/browser/modules/formula/functions/conditional.js +343 -0
  94. package/dist/browser/modules/formula/functions/database.d.ts +37 -0
  95. package/dist/browser/modules/formula/functions/database.js +274 -0
  96. package/dist/browser/modules/formula/functions/date.d.ts +61 -0
  97. package/dist/browser/modules/formula/functions/date.js +855 -0
  98. package/dist/browser/modules/formula/functions/dynamic-array.d.ts +23 -0
  99. package/dist/browser/modules/formula/functions/dynamic-array.js +860 -0
  100. package/dist/browser/modules/formula/functions/engineering.d.ts +57 -0
  101. package/dist/browser/modules/formula/functions/engineering.js +1128 -0
  102. package/dist/browser/modules/formula/functions/financial.d.ts +202 -0
  103. package/dist/browser/modules/formula/functions/financial.js +2296 -0
  104. package/dist/browser/modules/formula/functions/lookup.d.ts +18 -0
  105. package/dist/browser/modules/formula/functions/lookup.js +886 -0
  106. package/dist/browser/modules/formula/functions/math.d.ts +114 -0
  107. package/dist/browser/modules/formula/functions/math.js +1406 -0
  108. package/dist/browser/modules/formula/functions/statistical.d.ts +193 -0
  109. package/dist/browser/modules/formula/functions/statistical.js +3390 -0
  110. package/dist/browser/modules/formula/functions/text.d.ts +86 -0
  111. package/dist/browser/modules/formula/functions/text.js +1845 -0
  112. package/dist/browser/modules/formula/host-registry.d.ts +53 -0
  113. package/dist/browser/modules/formula/host-registry.js +69 -0
  114. package/dist/browser/modules/formula/index.d.ts +39 -0
  115. package/dist/browser/modules/formula/index.js +49 -0
  116. package/dist/browser/modules/formula/install.d.ts +62 -0
  117. package/dist/browser/modules/formula/install.js +88 -0
  118. package/dist/browser/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  119. package/dist/browser/modules/formula/integration/apply-writeback-plan.js +210 -0
  120. package/dist/browser/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  121. package/dist/browser/modules/formula/integration/calculate-formulas-impl.js +616 -0
  122. package/dist/browser/modules/formula/integration/calculate-formulas.d.ts +67 -0
  123. package/dist/browser/modules/formula/integration/calculate-formulas.js +68 -0
  124. package/dist/browser/modules/formula/integration/formula-instance.d.ts +64 -0
  125. package/dist/browser/modules/formula/integration/formula-instance.js +79 -0
  126. package/dist/browser/modules/formula/integration/workbook-adapter.d.ts +26 -0
  127. package/dist/browser/modules/formula/integration/workbook-adapter.js +324 -0
  128. package/dist/browser/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  129. package/dist/browser/modules/formula/integration/workbook-snapshot.js +77 -0
  130. package/dist/browser/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  131. package/dist/browser/modules/formula/materialize/build-writeback-plan.js +473 -0
  132. package/dist/browser/modules/formula/materialize/spill-engine.d.ts +9 -0
  133. package/dist/browser/modules/formula/materialize/spill-engine.js +38 -0
  134. package/dist/browser/modules/formula/materialize/types.d.ts +179 -0
  135. package/dist/browser/modules/formula/materialize/types.js +29 -0
  136. package/dist/browser/modules/formula/materialize/writeback-plan.d.ts +167 -0
  137. package/dist/browser/modules/formula/materialize/writeback-plan.js +27 -0
  138. package/dist/browser/modules/formula/runtime/evaluator.d.ts +151 -0
  139. package/dist/browser/modules/formula/runtime/evaluator.js +2291 -0
  140. package/dist/browser/modules/formula/runtime/function-registry.d.ts +47 -0
  141. package/dist/browser/modules/formula/runtime/function-registry.js +840 -0
  142. package/dist/browser/modules/formula/runtime/values.d.ts +211 -0
  143. package/dist/browser/modules/formula/runtime/values.js +385 -0
  144. package/dist/browser/modules/formula/syntax/ast.d.ts +129 -0
  145. package/dist/browser/modules/formula/syntax/ast.js +28 -0
  146. package/dist/browser/modules/formula/syntax/parser.d.ts +18 -0
  147. package/dist/browser/modules/formula/syntax/parser.js +439 -0
  148. package/dist/browser/modules/formula/syntax/token-types.d.ts +153 -0
  149. package/dist/browser/modules/formula/syntax/token-types.js +59 -0
  150. package/dist/browser/modules/formula/syntax/tokenizer.d.ts +10 -0
  151. package/dist/browser/modules/formula/syntax/tokenizer.js +1074 -0
  152. package/dist/browser/modules/pdf/excel-bridge.js +9 -0
  153. package/dist/cjs/index.js +4 -0
  154. package/dist/cjs/modules/excel/cell.js +170 -22
  155. package/dist/cjs/modules/excel/defined-names.js +411 -21
  156. package/dist/cjs/modules/excel/image.js +24 -1
  157. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +14 -0
  158. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +48 -1
  159. package/dist/cjs/modules/excel/stream/worksheet-reader.js +17 -1
  160. package/dist/cjs/modules/excel/stream/worksheet-writer.js +45 -5
  161. package/dist/cjs/modules/excel/table.js +15 -2
  162. package/dist/cjs/modules/excel/utils/col-cache.js +15 -0
  163. package/dist/cjs/modules/excel/utils/drawing-utils.js +4 -0
  164. package/dist/cjs/modules/excel/utils/external-link-formula.js +212 -0
  165. package/dist/cjs/modules/excel/utils/iterate-stream.js +3 -1
  166. package/dist/cjs/modules/excel/utils/ooxml-paths.js +42 -2
  167. package/dist/cjs/modules/excel/utils/shared-strings.js +21 -2
  168. package/dist/cjs/modules/excel/utils/workbook-protection.js +33 -0
  169. package/dist/cjs/modules/excel/workbook.browser.js +318 -34
  170. package/dist/cjs/modules/excel/worksheet.js +20 -1
  171. package/dist/cjs/modules/excel/xlsx/rel-type.js +16 -1
  172. package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  173. package/dist/cjs/modules/excel/xlsx/xform/book/external-link-xform.js +333 -0
  174. package/dist/cjs/modules/excel/xlsx/xform/book/external-reference-xform.js +27 -0
  175. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  176. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-protection-xform.js +69 -0
  177. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  178. package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +18 -0
  179. package/dist/cjs/modules/excel/xlsx/xform/core/metadata-xform.js +161 -0
  180. package/dist/cjs/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +108 -0
  181. package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  182. package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  183. package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  184. package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  185. package/dist/cjs/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +83 -0
  186. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  187. package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  188. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +408 -18
  189. package/dist/cjs/modules/excel/xlsx/xlsx.js +4 -5
  190. package/dist/cjs/modules/formula/compile/address-utils.js +89 -0
  191. package/dist/cjs/modules/formula/compile/binder.js +489 -0
  192. package/dist/cjs/modules/formula/compile/bound-ast.js +68 -0
  193. package/dist/cjs/modules/formula/compile/compiled-formula.js +387 -0
  194. package/dist/cjs/modules/formula/compile/dependency-analysis.js +437 -0
  195. package/dist/cjs/modules/formula/compile/structured-ref-utils.js +141 -0
  196. package/dist/cjs/modules/formula/default-syntax-probe.js +87 -0
  197. package/dist/cjs/modules/formula/functions/_date-context.js +33 -0
  198. package/dist/cjs/modules/formula/functions/_shared.js +396 -0
  199. package/dist/cjs/modules/formula/functions/conditional.js +354 -0
  200. package/dist/cjs/modules/formula/functions/database.js +288 -0
  201. package/dist/cjs/modules/formula/functions/date.js +883 -0
  202. package/dist/cjs/modules/formula/functions/dynamic-array.js +881 -0
  203. package/dist/cjs/modules/formula/functions/engineering.js +1183 -0
  204. package/dist/cjs/modules/formula/functions/financial.js +2348 -0
  205. package/dist/cjs/modules/formula/functions/lookup.js +902 -0
  206. package/dist/cjs/modules/formula/functions/math.js +1487 -0
  207. package/dist/cjs/modules/formula/functions/statistical.js +3488 -0
  208. package/dist/cjs/modules/formula/functions/text.js +1889 -0
  209. package/dist/cjs/modules/formula/host-registry.js +75 -0
  210. package/dist/cjs/modules/formula/index.js +58 -0
  211. package/dist/cjs/modules/formula/install.js +93 -0
  212. package/dist/cjs/modules/formula/integration/apply-writeback-plan.js +213 -0
  213. package/dist/cjs/modules/formula/integration/calculate-formulas-impl.js +619 -0
  214. package/dist/cjs/modules/formula/integration/calculate-formulas.js +71 -0
  215. package/dist/cjs/modules/formula/integration/formula-instance.js +82 -0
  216. package/dist/cjs/modules/formula/integration/workbook-adapter.js +327 -0
  217. package/dist/cjs/modules/formula/integration/workbook-snapshot.js +84 -0
  218. package/dist/cjs/modules/formula/materialize/build-writeback-plan.js +475 -0
  219. package/dist/cjs/modules/formula/materialize/spill-engine.js +42 -0
  220. package/dist/cjs/modules/formula/materialize/types.js +32 -0
  221. package/dist/cjs/modules/formula/materialize/writeback-plan.js +28 -0
  222. package/dist/cjs/modules/formula/runtime/evaluator.js +2298 -0
  223. package/dist/cjs/modules/formula/runtime/function-registry.js +846 -0
  224. package/dist/cjs/modules/formula/runtime/values.js +385 -0
  225. package/dist/cjs/modules/formula/syntax/ast.js +8 -0
  226. package/dist/cjs/modules/formula/syntax/parser.js +440 -0
  227. package/dist/cjs/modules/formula/syntax/token-types.js +32 -0
  228. package/dist/cjs/modules/formula/syntax/tokenizer.js +1076 -0
  229. package/dist/cjs/modules/pdf/excel-bridge.js +9 -0
  230. package/dist/esm/index.browser.js +4 -0
  231. package/dist/esm/index.js +4 -0
  232. package/dist/esm/modules/excel/cell.js +170 -22
  233. package/dist/esm/modules/excel/defined-names.js +411 -21
  234. package/dist/esm/modules/excel/image.js +24 -1
  235. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +14 -0
  236. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +48 -1
  237. package/dist/esm/modules/excel/stream/worksheet-reader.js +17 -1
  238. package/dist/esm/modules/excel/stream/worksheet-writer.js +45 -5
  239. package/dist/esm/modules/excel/table.js +15 -2
  240. package/dist/esm/modules/excel/utils/col-cache.js +15 -0
  241. package/dist/esm/modules/excel/utils/drawing-utils.js +4 -0
  242. package/dist/esm/modules/excel/utils/external-link-formula.js +208 -0
  243. package/dist/esm/modules/excel/utils/iterate-stream.js +3 -1
  244. package/dist/esm/modules/excel/utils/ooxml-paths.js +37 -2
  245. package/dist/esm/modules/excel/utils/shared-strings.js +21 -2
  246. package/dist/esm/modules/excel/utils/workbook-protection.js +30 -0
  247. package/dist/esm/modules/excel/workbook.browser.js +318 -34
  248. package/dist/esm/modules/excel/worksheet.js +21 -2
  249. package/dist/esm/modules/excel/xlsx/rel-type.js +16 -1
  250. package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  251. package/dist/esm/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  252. package/dist/esm/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  253. package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  254. package/dist/esm/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  255. package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  256. package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  257. package/dist/esm/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  258. package/dist/esm/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  259. package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  260. package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  261. package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  262. package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  263. package/dist/esm/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  264. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  265. package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  266. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +410 -20
  267. package/dist/esm/modules/excel/xlsx/xlsx.js +4 -5
  268. package/dist/esm/modules/formula/compile/address-utils.js +83 -0
  269. package/dist/esm/modules/formula/compile/binder.js +487 -0
  270. package/dist/esm/modules/formula/compile/bound-ast.js +80 -0
  271. package/dist/esm/modules/formula/compile/compiled-formula.js +383 -0
  272. package/dist/esm/modules/formula/compile/dependency-analysis.js +432 -0
  273. package/dist/esm/modules/formula/compile/structured-ref-utils.js +136 -0
  274. package/dist/esm/modules/formula/default-syntax-probe.js +83 -0
  275. package/dist/esm/modules/formula/functions/_date-context.js +29 -0
  276. package/dist/esm/modules/formula/functions/_shared.js +381 -0
  277. package/dist/esm/modules/formula/functions/conditional.js +343 -0
  278. package/dist/esm/modules/formula/functions/database.js +274 -0
  279. package/dist/esm/modules/formula/functions/date.js +855 -0
  280. package/dist/esm/modules/formula/functions/dynamic-array.js +860 -0
  281. package/dist/esm/modules/formula/functions/engineering.js +1128 -0
  282. package/dist/esm/modules/formula/functions/financial.js +2296 -0
  283. package/dist/esm/modules/formula/functions/lookup.js +886 -0
  284. package/dist/esm/modules/formula/functions/math.js +1406 -0
  285. package/dist/esm/modules/formula/functions/statistical.js +3390 -0
  286. package/dist/esm/modules/formula/functions/text.js +1845 -0
  287. package/dist/esm/modules/formula/host-registry.js +69 -0
  288. package/dist/esm/modules/formula/index.js +49 -0
  289. package/dist/esm/modules/formula/install.js +88 -0
  290. package/dist/esm/modules/formula/integration/apply-writeback-plan.js +210 -0
  291. package/dist/esm/modules/formula/integration/calculate-formulas-impl.js +616 -0
  292. package/dist/esm/modules/formula/integration/calculate-formulas.js +68 -0
  293. package/dist/esm/modules/formula/integration/formula-instance.js +79 -0
  294. package/dist/esm/modules/formula/integration/workbook-adapter.js +324 -0
  295. package/dist/esm/modules/formula/integration/workbook-snapshot.js +77 -0
  296. package/dist/esm/modules/formula/materialize/build-writeback-plan.js +473 -0
  297. package/dist/esm/modules/formula/materialize/spill-engine.js +38 -0
  298. package/dist/esm/modules/formula/materialize/types.js +29 -0
  299. package/dist/esm/modules/formula/materialize/writeback-plan.js +27 -0
  300. package/dist/esm/modules/formula/runtime/evaluator.js +2291 -0
  301. package/dist/esm/modules/formula/runtime/function-registry.js +840 -0
  302. package/dist/esm/modules/formula/runtime/values.js +385 -0
  303. package/dist/esm/modules/formula/syntax/ast.js +28 -0
  304. package/dist/esm/modules/formula/syntax/parser.js +439 -0
  305. package/dist/esm/modules/formula/syntax/token-types.js +59 -0
  306. package/dist/esm/modules/formula/syntax/tokenizer.js +1074 -0
  307. package/dist/esm/modules/pdf/excel-bridge.js +9 -0
  308. package/dist/iife/excelts.iife.js +2302 -373
  309. package/dist/iife/excelts.iife.js.map +1 -1
  310. package/dist/iife/excelts.iife.min.js +34 -34
  311. package/dist/types/index.browser.d.ts +1 -1
  312. package/dist/types/index.d.ts +1 -1
  313. package/dist/types/modules/excel/cell.d.ts +17 -3
  314. package/dist/types/modules/excel/defined-names.d.ts +96 -1
  315. package/dist/types/modules/excel/image.d.ts +11 -0
  316. package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  317. package/dist/types/modules/excel/stream/workbook-reader.d.ts +2 -1
  318. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  319. package/dist/types/modules/excel/stream/workbook-writer.d.ts +3 -2
  320. package/dist/types/modules/excel/stream/worksheet-writer.d.ts +39 -6
  321. package/dist/types/modules/excel/types.d.ts +133 -2
  322. package/dist/types/modules/excel/utils/col-cache.d.ts +1 -0
  323. package/dist/types/modules/excel/utils/drawing-utils.d.ts +3 -3
  324. package/dist/types/modules/excel/utils/external-link-formula.d.ts +76 -0
  325. package/dist/types/modules/excel/utils/iterate-stream.d.ts +9 -3
  326. package/dist/types/modules/excel/utils/ooxml-paths.d.ts +19 -0
  327. package/dist/types/modules/excel/utils/shared-strings.d.ts +8 -3
  328. package/dist/types/modules/excel/utils/workbook-protection.d.ts +30 -0
  329. package/dist/types/modules/excel/workbook.browser.d.ts +257 -6
  330. package/dist/types/modules/excel/workbook.d.ts +1 -1
  331. package/dist/types/modules/excel/worksheet.d.ts +3 -1
  332. package/dist/types/modules/excel/xlsx/rel-type.d.ts +15 -0
  333. package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  334. package/dist/types/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  335. package/dist/types/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  336. package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  337. package/dist/types/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  338. package/dist/types/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  339. package/dist/types/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  340. package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  341. package/dist/types/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  342. package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  343. package/dist/types/modules/excel/xlsx/xlsx.d.ts +7 -4
  344. package/dist/types/modules/formula/compile/address-utils.d.ts +62 -0
  345. package/dist/types/modules/formula/compile/binder.d.ts +42 -0
  346. package/dist/types/modules/formula/compile/bound-ast.d.ts +230 -0
  347. package/dist/types/modules/formula/compile/compiled-formula.d.ts +137 -0
  348. package/dist/types/modules/formula/compile/dependency-analysis.d.ts +93 -0
  349. package/dist/types/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  350. package/dist/types/modules/formula/default-syntax-probe.d.ts +79 -0
  351. package/dist/types/modules/formula/functions/_date-context.d.ts +4 -0
  352. package/dist/types/modules/formula/functions/_shared.d.ts +121 -0
  353. package/dist/types/modules/formula/functions/conditional.d.ts +27 -0
  354. package/dist/types/modules/formula/functions/database.d.ts +37 -0
  355. package/dist/types/modules/formula/functions/date.d.ts +61 -0
  356. package/dist/types/modules/formula/functions/dynamic-array.d.ts +23 -0
  357. package/dist/types/modules/formula/functions/engineering.d.ts +57 -0
  358. package/dist/types/modules/formula/functions/financial.d.ts +202 -0
  359. package/dist/types/modules/formula/functions/lookup.d.ts +18 -0
  360. package/dist/types/modules/formula/functions/math.d.ts +114 -0
  361. package/dist/types/modules/formula/functions/statistical.d.ts +193 -0
  362. package/dist/types/modules/formula/functions/text.d.ts +86 -0
  363. package/dist/types/modules/formula/host-registry.d.ts +53 -0
  364. package/dist/types/modules/formula/index.d.ts +39 -0
  365. package/dist/types/modules/formula/install.d.ts +62 -0
  366. package/dist/types/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  367. package/dist/types/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  368. package/dist/types/modules/formula/integration/calculate-formulas.d.ts +67 -0
  369. package/dist/types/modules/formula/integration/formula-instance.d.ts +64 -0
  370. package/dist/types/modules/formula/integration/workbook-adapter.d.ts +26 -0
  371. package/dist/types/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  372. package/dist/types/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  373. package/dist/types/modules/formula/materialize/spill-engine.d.ts +9 -0
  374. package/dist/types/modules/formula/materialize/types.d.ts +179 -0
  375. package/dist/types/modules/formula/materialize/writeback-plan.d.ts +167 -0
  376. package/dist/types/modules/formula/runtime/evaluator.d.ts +151 -0
  377. package/dist/types/modules/formula/runtime/function-registry.d.ts +47 -0
  378. package/dist/types/modules/formula/runtime/values.d.ts +211 -0
  379. package/dist/types/modules/formula/syntax/ast.d.ts +129 -0
  380. package/dist/types/modules/formula/syntax/parser.d.ts +18 -0
  381. package/dist/types/modules/formula/syntax/token-types.d.ts +153 -0
  382. package/dist/types/modules/formula/syntax/tokenizer.d.ts +10 -0
  383. package/package.json +28 -28
@@ -0,0 +1,881 @@
1
+ "use strict";
2
+ /**
3
+ * Dynamic Array Functions — Native RuntimeValue Implementation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fnFILTER = fnFILTER;
7
+ exports.fnSORT = fnSORT;
8
+ exports.fnUNIQUE = fnUNIQUE;
9
+ exports.fnSORTBY = fnSORTBY;
10
+ exports.fnSUBTOTAL = fnSUBTOTAL;
11
+ exports.fnAGGREGATE = fnAGGREGATE;
12
+ exports.fnSEQUENCE = fnSEQUENCE;
13
+ exports.fnRANDARRAY = fnRANDARRAY;
14
+ exports.fnTOCOL = fnTOCOL;
15
+ exports.fnTOROW = fnTOROW;
16
+ exports.fnCHOOSEROWS = fnCHOOSEROWS;
17
+ exports.fnCHOOSECOLS = fnCHOOSECOLS;
18
+ exports.fnVSTACK = fnVSTACK;
19
+ exports.fnHSTACK = fnHSTACK;
20
+ exports.fnTAKE = fnTAKE;
21
+ exports.fnDROP = fnDROP;
22
+ exports.fnWRAPROWS = fnWRAPROWS;
23
+ exports.fnWRAPCOLS = fnWRAPCOLS;
24
+ exports.fnEXPAND = fnEXPAND;
25
+ const values_1 = require("../runtime/values");
26
+ const _shared_1 = require("./_shared");
27
+ const math_1 = require("./math");
28
+ const statistical_1 = require("./statistical");
29
+ function isScalarError(v) {
30
+ return v.kind === 4 /* RVKind.Error */;
31
+ }
32
+ function isScalarBlankOrEmpty(v) {
33
+ return v.kind === 0 /* RVKind.Blank */ || (v.kind === 2 /* RVKind.String */ && v.value === "");
34
+ }
35
+ /**
36
+ * Kind-priority ordering for cross-type sorting.
37
+ *
38
+ * `compareScalarsSameKind` returns `NaN` when the two operands have
39
+ * different kinds, so SORT/SORTBY need a deterministic tiebreak. Excel's
40
+ * workbook-grade sort groups values by kind — Numbers before Strings,
41
+ * Strings before Booleans, Booleans before Blanks/Errors — which is the
42
+ * priority we encode here.
43
+ */
44
+ function kindPriority(k) {
45
+ switch (k) {
46
+ case 1 /* RVKind.Number */:
47
+ return 0;
48
+ case 2 /* RVKind.String */:
49
+ return 1;
50
+ case 3 /* RVKind.Boolean */:
51
+ return 2;
52
+ case 0 /* RVKind.Blank */:
53
+ return 3;
54
+ case 4 /* RVKind.Error */:
55
+ return 4;
56
+ default:
57
+ return 5;
58
+ }
59
+ }
60
+ /**
61
+ * Locale-independent comparator for SORT / SORTBY.
62
+ *
63
+ * Uses `compareScalarsSameKind` for same-kind ordering (strings compared
64
+ * case-insensitively, not via `localeCompare`, so results are stable
65
+ * across machines) and falls back to `kindPriority` when the operands
66
+ * differ in kind.
67
+ */
68
+ function compareForSort(a, b) {
69
+ if (a.kind !== b.kind) {
70
+ return kindPriority(a.kind) - kindPriority(b.kind);
71
+ }
72
+ const cmp = (0, values_1.compareScalarsSameKind)(a, b);
73
+ return Number.isNaN(cmp) ? 0 : cmp;
74
+ }
75
+ function fnFILTER(args) {
76
+ const dataArr = (0, _shared_1.asArray)(args[0]);
77
+ const includeArr = (0, _shared_1.asArray)(args[1]);
78
+ if (!dataArr || !includeArr) {
79
+ return values_1.ERRORS.VALUE;
80
+ }
81
+ // Excel requires `include` to be a 1-column vector matching data's
82
+ // height (the common row-filter shape). A mismatched shape previously
83
+ // let rows slip through silently because `getCell` out-of-bounds
84
+ // returns BLANK, which reads as FALSE.
85
+ if (includeArr.width !== 1 || includeArr.height !== dataArr.height) {
86
+ return values_1.ERRORS.VALUE;
87
+ }
88
+ const ifEmpty = args.length > 2 ? (0, values_1.topLeft)(args[2]) : null;
89
+ const resultRows = [];
90
+ for (let r = 0; r < dataArr.height; r++) {
91
+ const inc = (0, _shared_1.getCell)(includeArr, r, 0);
92
+ if (inc.kind === 4 /* RVKind.Error */) {
93
+ return inc;
94
+ }
95
+ if ((inc.kind === 3 /* RVKind.Boolean */ && inc.value) ||
96
+ (inc.kind === 1 /* RVKind.Number */ && inc.value !== 0)) {
97
+ const row = [];
98
+ for (let c = 0; c < dataArr.width; c++) {
99
+ row.push((0, _shared_1.getCell)(dataArr, r, c));
100
+ }
101
+ resultRows.push(row);
102
+ }
103
+ }
104
+ if (resultRows.length === 0) {
105
+ return ifEmpty !== null ? (0, values_1.rvArray)([[ifEmpty]]) : values_1.ERRORS.CALC;
106
+ }
107
+ return (0, values_1.rvArray)(resultRows);
108
+ }
109
+ function fnSORT(args) {
110
+ const dataArr = (0, _shared_1.asArray)(args[0]);
111
+ if (!dataArr) {
112
+ return values_1.ERRORS.VALUE;
113
+ }
114
+ const rows = [];
115
+ for (let r = 0; r < dataArr.height; r++) {
116
+ const row = [];
117
+ for (let c = 0; c < dataArr.width; c++) {
118
+ row.push((0, _shared_1.getCell)(dataArr, r, c));
119
+ }
120
+ rows.push(row);
121
+ }
122
+ const sortIndexV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
123
+ if ((0, values_1.isError)(sortIndexV)) {
124
+ return sortIndexV;
125
+ }
126
+ const sortOrderV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(1);
127
+ if ((0, values_1.isError)(sortOrderV)) {
128
+ return sortOrderV;
129
+ }
130
+ const byColV = args.length > 3 ? (0, values_1.toBooleanRV)(args[3]) : { kind: 3 /* RVKind.Boolean */, value: false };
131
+ if ((0, values_1.isError)(byColV)) {
132
+ return byColV;
133
+ }
134
+ // Truncate the index so fractional inputs don't silently become NaN
135
+ // when used as array subscripts. Then bounds-check against the axis
136
+ // SORT will actually walk — this turns `SORT(arr, 0)` / out-of-range
137
+ // values into the documented #VALUE! instead of a soft-fail.
138
+ const sortIndex = Math.trunc(sortIndexV.value);
139
+ if (byColV.value) {
140
+ if (sortIndex < 1 || sortIndex > dataArr.height) {
141
+ return values_1.ERRORS.VALUE;
142
+ }
143
+ const colIndices = Array.from({ length: dataArr.width }, (_, i) => i);
144
+ const rowIdx = sortIndex - 1;
145
+ colIndices.sort((a, b) => {
146
+ const va = (0, _shared_1.getCell)(dataArr, rowIdx, a);
147
+ const vb = (0, _shared_1.getCell)(dataArr, rowIdx, b);
148
+ return compareForSort(va, vb) * sortOrderV.value;
149
+ });
150
+ return (0, values_1.rvArray)(rows.map(row => colIndices.map(c => row[c])));
151
+ }
152
+ if (sortIndex < 1 || sortIndex > dataArr.width) {
153
+ return values_1.ERRORS.VALUE;
154
+ }
155
+ const col = sortIndex - 1;
156
+ rows.sort((a, b) => compareForSort(a[col], b[col]) * sortOrderV.value);
157
+ return (0, values_1.rvArray)(rows);
158
+ }
159
+ function fnUNIQUE(args) {
160
+ const dataArr = (0, _shared_1.asArray)(args[0]);
161
+ if (!dataArr) {
162
+ return values_1.ERRORS.VALUE;
163
+ }
164
+ const byColV = args.length > 1 ? (0, values_1.toBooleanRV)(args[1]) : { kind: 3 /* RVKind.Boolean */, value: false };
165
+ if ((0, values_1.isError)(byColV)) {
166
+ return byColV;
167
+ }
168
+ const exactlyOnceV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
169
+ if ((0, values_1.isError)(exactlyOnceV)) {
170
+ return exactlyOnceV;
171
+ }
172
+ if (byColV.value) {
173
+ const transposed = [];
174
+ for (let c = 0; c < dataArr.width; c++) {
175
+ const col = [];
176
+ for (let r = 0; r < dataArr.height; r++) {
177
+ col.push((0, _shared_1.getCell)(dataArr, r, c));
178
+ }
179
+ transposed.push(col);
180
+ }
181
+ const unique = applyUnique(transposed, exactlyOnceV.value);
182
+ if (unique.length === 0) {
183
+ return values_1.ERRORS.VALUE;
184
+ }
185
+ const numRows = unique[0].length;
186
+ const result = [];
187
+ for (let r = 0; r < numRows; r++) {
188
+ result.push(unique.map(ci => ci[r]));
189
+ }
190
+ return (0, values_1.rvArray)(result);
191
+ }
192
+ const dataRows = [];
193
+ for (let r = 0; r < dataArr.height; r++) {
194
+ const row = [];
195
+ for (let c = 0; c < dataArr.width; c++) {
196
+ row.push((0, _shared_1.getCell)(dataArr, r, c));
197
+ }
198
+ dataRows.push(row);
199
+ }
200
+ const result = applyUnique(dataRows, exactlyOnceV.value);
201
+ return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.VALUE;
202
+ }
203
+ function applyUnique(rows, exactlyOnce) {
204
+ const keyCount = new Map();
205
+ const keyToRows = new Map();
206
+ const order = [];
207
+ for (const row of rows) {
208
+ // Key the row by (kind, textual form) per cell so that UNIQUE preserves
209
+ // Excel's type-aware equality: the number `1` and the string `"1"` are
210
+ // distinct entries. Without the kind prefix they would collide because
211
+ // `toStringRV` renders both as `"1"`.
212
+ const key = row.map(c => `${c.kind}\u0001${scalarUniqueKey(c)}`).join("\u0002");
213
+ if (!keyCount.has(key)) {
214
+ order.push(key);
215
+ keyToRows.set(key, row);
216
+ }
217
+ keyCount.set(key, (keyCount.get(key) ?? 0) + 1);
218
+ }
219
+ const result = [];
220
+ for (const key of order) {
221
+ if (exactlyOnce && (keyCount.get(key) ?? 0) > 1) {
222
+ continue;
223
+ }
224
+ result.push(keyToRows.get(key));
225
+ }
226
+ return result;
227
+ }
228
+ /**
229
+ * Produce a string that fully identifies a scalar for equality purposes,
230
+ * distinguishing kinds that stringify identically but must not merge.
231
+ */
232
+ function scalarUniqueKey(v) {
233
+ if (v.kind === 1 /* RVKind.Number */) {
234
+ // Using `toString` instead of localised formatting keeps NaN/Infinity
235
+ // / -0 distinguishable from `0`, which matters for exact duplication
236
+ // detection.
237
+ return Object.is(v.value, -0) ? "-0" : String(v.value);
238
+ }
239
+ if (v.kind === 3 /* RVKind.Boolean */) {
240
+ return v.value ? "1" : "0";
241
+ }
242
+ if (v.kind === 4 /* RVKind.Error */) {
243
+ return v.code;
244
+ }
245
+ if (v.kind === 0 /* RVKind.Blank */) {
246
+ return "";
247
+ }
248
+ return v.value.toLowerCase();
249
+ }
250
+ function fnSORTBY(args) {
251
+ const dataArr = (0, _shared_1.asArray)(args[0]);
252
+ if (!dataArr || args.length < 2) {
253
+ return values_1.ERRORS.VALUE;
254
+ }
255
+ const data = [];
256
+ for (let r = 0; r < dataArr.height; r++) {
257
+ const row = [];
258
+ for (let c = 0; c < dataArr.width; c++) {
259
+ row.push((0, _shared_1.getCell)(dataArr, r, c));
260
+ }
261
+ data.push({ row, idx: r });
262
+ }
263
+ const sortKeys = [];
264
+ for (let i = 1; i < args.length; i += 2) {
265
+ const keyArr = (0, _shared_1.asArray)(args[i]);
266
+ if (!keyArr) {
267
+ return values_1.ERRORS.VALUE;
268
+ }
269
+ const orderV = i + 1 < args.length ? (0, values_1.toNumberRV)(args[i + 1]) : (0, values_1.rvNumber)(1);
270
+ if ((0, values_1.isError)(orderV)) {
271
+ return orderV;
272
+ }
273
+ sortKeys.push({ arr: keyArr, order: orderV.value });
274
+ }
275
+ data.sort((a, b) => {
276
+ for (const sk of sortKeys) {
277
+ const va = (0, _shared_1.getCell)(sk.arr, a.idx, 0);
278
+ const vb = (0, _shared_1.getCell)(sk.arr, b.idx, 0);
279
+ const cmp = compareForSort(va, vb);
280
+ if (cmp !== 0) {
281
+ return cmp * sk.order;
282
+ }
283
+ }
284
+ return 0;
285
+ });
286
+ return (0, values_1.rvArray)(data.map(d => d.row));
287
+ }
288
+ function fnSUBTOTAL(args) {
289
+ const funcNumV = (0, values_1.toNumberRV)(args[0]);
290
+ if ((0, values_1.isError)(funcNumV)) {
291
+ return funcNumV;
292
+ }
293
+ // Excel skips cells whose own formula is SUBTOTAL/AGGREGATE to avoid
294
+ // double-counting when an outer aggregate spans a totals row or another
295
+ // subtotal cell. `buildRangeArray` marks those cells via
296
+ // `subtotalMask`; we strip them here before handing off to the
297
+ // underlying aggregator.
298
+ let dataArgs = (0, _shared_1.stripSubtotalMaskedCells)(args.slice(1));
299
+ // Truncate toward zero: Excel rejects non-integer function codes, so
300
+ // `SUBTOTAL(9.5, …)` should behave as `SUBTOTAL(9, …)` rather than
301
+ // slipping through the switch and returning #VALUE!. (R6-P1-9)
302
+ const rawFn = Math.trunc(funcNumV.value);
303
+ const fn = rawFn > 100 ? rawFn - 100 : rawFn;
304
+ // The 1xx variants (101-111) additionally skip hidden rows. Excel's
305
+ // plain 1-11 codes only skip filter-hidden rows — but our worksheet
306
+ // model carries a single `row.hidden` boolean that conflates the two
307
+ // states, so we apply hidden-row stripping only to the 1xx variants
308
+ // (matching manual-hide semantics; filter-hide remains a limitation
309
+ // at the adapter layer, not here).
310
+ if (rawFn > 100) {
311
+ dataArgs = (0, _shared_1.stripHiddenRowCells)(dataArgs);
312
+ }
313
+ switch (fn) {
314
+ case 1:
315
+ return (0, math_1.fnAVERAGE)(dataArgs);
316
+ case 2:
317
+ return (0, math_1.fnCOUNT)(dataArgs);
318
+ case 3:
319
+ return (0, math_1.fnCOUNTA)(dataArgs);
320
+ case 4:
321
+ return (0, math_1.fnMAX)(dataArgs);
322
+ case 5:
323
+ return (0, math_1.fnMIN)(dataArgs);
324
+ case 6:
325
+ return (0, math_1.fnPRODUCT)(dataArgs);
326
+ case 7:
327
+ return (0, statistical_1.fnSTDEV)(dataArgs);
328
+ case 8:
329
+ return (0, statistical_1.fnSTDEVP)(dataArgs);
330
+ case 9:
331
+ return (0, math_1.fnSUM)(dataArgs);
332
+ case 10:
333
+ return (0, statistical_1.fnVAR)(dataArgs);
334
+ case 11:
335
+ return (0, statistical_1.fnVARP)(dataArgs);
336
+ default:
337
+ return values_1.ERRORS.VALUE;
338
+ }
339
+ }
340
+ function fnAGGREGATE(args) {
341
+ const funcNumV = (0, values_1.toNumberRV)(args[0]);
342
+ if ((0, values_1.isError)(funcNumV)) {
343
+ return funcNumV;
344
+ }
345
+ // Resolve the "options" parameter (arg[1]). Excel's option codes
346
+ // (0–7) control which cells to skip:
347
+ // 0 or omitted → ignore nested SUBTOTAL/AGGREGATE
348
+ // 1 → ignore hidden rows + nested
349
+ // 2 → ignore errors + nested
350
+ // 3 → ignore hidden rows + errors + nested
351
+ // 4 → ignore nothing
352
+ // 5 → ignore hidden rows (keep nested)
353
+ // 6 → ignore errors (keep nested)
354
+ // 7 → ignore hidden rows + errors (keep nested)
355
+ const optV = args[1] !== undefined ? (0, values_1.toNumberRV)(args[1]) : undefined;
356
+ if (optV && (0, values_1.isError)(optV)) {
357
+ return optV;
358
+ }
359
+ const option = optV ? Math.trunc(optV.value) : 0;
360
+ const skipNested = option <= 3; // 0,1,2,3 skip nested SUBTOTAL/AGGREGATE
361
+ const skipHidden = option === 1 || option === 3 || option === 5 || option === 7;
362
+ const skipErrors = option === 2 || option === 3 || option === 6 || option === 7;
363
+ let dataArgs = args.slice(2);
364
+ if (skipNested) {
365
+ dataArgs = (0, _shared_1.stripSubtotalMaskedCells)(dataArgs);
366
+ }
367
+ if (skipHidden) {
368
+ dataArgs = (0, _shared_1.stripHiddenRowCells)(dataArgs);
369
+ }
370
+ if (skipErrors) {
371
+ dataArgs = (0, _shared_1.stripErrorCells)(dataArgs);
372
+ }
373
+ // Excel rejects non-integer function codes; truncate toward zero
374
+ // so AGGREGATE(9.5, …) behaves as AGGREGATE(9, …), matching SUBTOTAL.
375
+ const fnCode = Math.trunc(funcNumV.value);
376
+ switch (fnCode) {
377
+ case 1:
378
+ return (0, math_1.fnAVERAGE)(dataArgs);
379
+ case 2:
380
+ return (0, math_1.fnCOUNT)(dataArgs);
381
+ case 3:
382
+ return (0, math_1.fnCOUNTA)(dataArgs);
383
+ case 4:
384
+ return (0, math_1.fnMAX)(dataArgs);
385
+ case 5:
386
+ return (0, math_1.fnMIN)(dataArgs);
387
+ case 6:
388
+ return (0, math_1.fnPRODUCT)(dataArgs);
389
+ case 7:
390
+ return (0, statistical_1.fnSTDEV)(dataArgs);
391
+ case 8:
392
+ return (0, statistical_1.fnSTDEVP)(dataArgs);
393
+ case 9:
394
+ return (0, math_1.fnSUM)(dataArgs);
395
+ case 10:
396
+ return (0, statistical_1.fnVAR)(dataArgs);
397
+ case 11:
398
+ return (0, statistical_1.fnVARP)(dataArgs);
399
+ case 12:
400
+ return (0, statistical_1.fnMEDIAN)(dataArgs);
401
+ case 13:
402
+ return (0, statistical_1.fnMODE)(dataArgs);
403
+ case 14:
404
+ return (0, statistical_1.fnLARGE)(dataArgs);
405
+ case 15:
406
+ return (0, statistical_1.fnSMALL)(dataArgs);
407
+ case 16:
408
+ return (0, statistical_1.fnPERCENTILE)(dataArgs);
409
+ case 17:
410
+ return (0, statistical_1.fnQUARTILE)(dataArgs);
411
+ case 18:
412
+ return (0, statistical_1.fnPERCENTILEEXC)(dataArgs);
413
+ case 19:
414
+ return (0, statistical_1.fnQUARTILEEXC)(dataArgs);
415
+ default:
416
+ return values_1.ERRORS.VALUE;
417
+ }
418
+ }
419
+ function fnSEQUENCE(args) {
420
+ const rowsV = (0, values_1.toNumberRV)(args[0]);
421
+ if ((0, values_1.isError)(rowsV)) {
422
+ return rowsV;
423
+ }
424
+ const colsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
425
+ if ((0, values_1.isError)(colsV)) {
426
+ return colsV;
427
+ }
428
+ const startV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(1);
429
+ if ((0, values_1.isError)(startV)) {
430
+ return startV;
431
+ }
432
+ const stepV = args.length > 3 ? (0, values_1.toNumberRV)(args[3]) : (0, values_1.rvNumber)(1);
433
+ if ((0, values_1.isError)(stepV)) {
434
+ return stepV;
435
+ }
436
+ // Excel truncates row/col counts toward zero and rejects anything
437
+ // below 1. Without this guard `SEQUENCE(-3)` would produce an empty
438
+ // ArrayValue which breaks downstream rectangularisation, and
439
+ // `SEQUENCE(2.5, 2)` would generate 3 rows instead of Excel's 2.
440
+ const rowCount = Math.trunc(rowsV.value);
441
+ const colCount = Math.trunc(colsV.value);
442
+ if (!Number.isFinite(rowCount) || !Number.isFinite(colCount) || rowCount < 1 || colCount < 1) {
443
+ return values_1.ERRORS.NUM;
444
+ }
445
+ // Bound the output to the same 10M-cell budget the rest of the array
446
+ // pipeline uses. SEQUENCE(1e9, 1e9) would otherwise try to allocate
447
+ // 1e18 scalars before OOM-ing (R6-P1-4).
448
+ if (rowCount * colCount > 10000000) {
449
+ return values_1.ERRORS.NUM;
450
+ }
451
+ const result = [];
452
+ let val = startV.value;
453
+ for (let r = 0; r < rowCount; r++) {
454
+ const row = [];
455
+ for (let c = 0; c < colCount; c++) {
456
+ row.push((0, values_1.rvNumber)(val));
457
+ val += stepV.value;
458
+ }
459
+ result.push(row);
460
+ }
461
+ return (0, values_1.rvArray)(result);
462
+ }
463
+ function fnRANDARRAY(args) {
464
+ const rowsV = args.length > 0 ? (0, values_1.toNumberRV)(args[0]) : (0, values_1.rvNumber)(1);
465
+ if ((0, values_1.isError)(rowsV)) {
466
+ return rowsV;
467
+ }
468
+ const colsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
469
+ if ((0, values_1.isError)(colsV)) {
470
+ return colsV;
471
+ }
472
+ const minV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(0);
473
+ if ((0, values_1.isError)(minV)) {
474
+ return minV;
475
+ }
476
+ const maxV = args.length > 3 ? (0, values_1.toNumberRV)(args[3]) : (0, values_1.rvNumber)(1);
477
+ if ((0, values_1.isError)(maxV)) {
478
+ return maxV;
479
+ }
480
+ const wholeV = args.length > 4 ? (0, values_1.toBooleanRV)(args[4]) : { kind: 3 /* RVKind.Boolean */, value: false };
481
+ if ((0, values_1.isError)(wholeV)) {
482
+ return wholeV;
483
+ }
484
+ const rowCount = Math.trunc(rowsV.value);
485
+ const colCount = Math.trunc(colsV.value);
486
+ // Excel rejects rows/cols < 1 and min > max with #VALUE!, and when the
487
+ // `whole` flag is TRUE it additionally requires integer min/max.
488
+ if (!Number.isFinite(rowCount) ||
489
+ !Number.isFinite(colCount) ||
490
+ rowCount < 1 ||
491
+ colCount < 1 ||
492
+ minV.value > maxV.value) {
493
+ return values_1.ERRORS.VALUE;
494
+ }
495
+ if (wholeV.value && (!Number.isInteger(minV.value) || !Number.isInteger(maxV.value))) {
496
+ return values_1.ERRORS.VALUE;
497
+ }
498
+ // Same 10M-cell budget as SEQUENCE / MAKEARRAY / broadcastBinaryOp —
499
+ // otherwise `RANDARRAY(1e6, 1e6)` OOMs the host. (R6-P1-4)
500
+ if (rowCount * colCount > 10000000) {
501
+ return values_1.ERRORS.NUM;
502
+ }
503
+ const result = [];
504
+ for (let r = 0; r < rowCount; r++) {
505
+ const row = [];
506
+ for (let c = 0; c < colCount; c++) {
507
+ if (wholeV.value) {
508
+ // Draw a uniform integer in [min, max] inclusive. The old code
509
+ // did `Math.floor(min + random() * (max - min))` which excluded
510
+ // `max` almost always.
511
+ const span = maxV.value - minV.value + 1;
512
+ row.push((0, values_1.rvNumber)(minV.value + Math.floor(Math.random() * span)));
513
+ }
514
+ else {
515
+ row.push((0, values_1.rvNumber)(minV.value + Math.random() * (maxV.value - minV.value)));
516
+ }
517
+ }
518
+ result.push(row);
519
+ }
520
+ return (0, values_1.rvArray)(result);
521
+ }
522
+ function fnTOCOL(args) {
523
+ if (!(0, values_1.isArray)(args[0])) {
524
+ return (0, values_1.rvArray)([[(0, values_1.topLeft)(args[0])]]);
525
+ }
526
+ const arr = args[0];
527
+ const ignoreV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
528
+ if ((0, values_1.isError)(ignoreV)) {
529
+ return ignoreV;
530
+ }
531
+ const scanV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
532
+ if ((0, values_1.isError)(scanV)) {
533
+ return scanV;
534
+ }
535
+ const result = [];
536
+ const addCell = (v) => {
537
+ if (ignoreV.value === 1 && isScalarBlankOrEmpty(v)) {
538
+ return;
539
+ }
540
+ if (ignoreV.value === 2 && isScalarError(v)) {
541
+ return;
542
+ }
543
+ if (ignoreV.value === 3 && (isScalarBlankOrEmpty(v) || isScalarError(v))) {
544
+ return;
545
+ }
546
+ result.push([v]);
547
+ };
548
+ if (scanV.value) {
549
+ for (let c = 0; c < arr.width; c++) {
550
+ for (let r = 0; r < arr.height; r++) {
551
+ addCell((0, _shared_1.getCell)(arr, r, c));
552
+ }
553
+ }
554
+ }
555
+ else {
556
+ for (let r = 0; r < arr.height; r++) {
557
+ for (let c = 0; c < arr.width; c++) {
558
+ addCell((0, _shared_1.getCell)(arr, r, c));
559
+ }
560
+ }
561
+ }
562
+ return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
563
+ }
564
+ function fnTOROW(args) {
565
+ if (!(0, values_1.isArray)(args[0])) {
566
+ return (0, values_1.rvArray)([[(0, values_1.topLeft)(args[0])]]);
567
+ }
568
+ const arr = args[0];
569
+ const ignoreV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
570
+ if ((0, values_1.isError)(ignoreV)) {
571
+ return ignoreV;
572
+ }
573
+ const scanV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
574
+ if ((0, values_1.isError)(scanV)) {
575
+ return scanV;
576
+ }
577
+ const result = [];
578
+ const addCell = (v) => {
579
+ if (ignoreV.value === 1 && isScalarBlankOrEmpty(v)) {
580
+ return;
581
+ }
582
+ if (ignoreV.value === 2 && isScalarError(v)) {
583
+ return;
584
+ }
585
+ if (ignoreV.value === 3 && (isScalarBlankOrEmpty(v) || isScalarError(v))) {
586
+ return;
587
+ }
588
+ result.push(v);
589
+ };
590
+ if (scanV.value) {
591
+ for (let c = 0; c < arr.width; c++) {
592
+ for (let r = 0; r < arr.height; r++) {
593
+ addCell((0, _shared_1.getCell)(arr, r, c));
594
+ }
595
+ }
596
+ }
597
+ else {
598
+ for (let r = 0; r < arr.height; r++) {
599
+ for (let c = 0; c < arr.width; c++) {
600
+ addCell((0, _shared_1.getCell)(arr, r, c));
601
+ }
602
+ }
603
+ }
604
+ return result.length > 0 ? (0, values_1.rvArray)([result]) : values_1.ERRORS.CALC;
605
+ }
606
+ function fnCHOOSEROWS(args) {
607
+ const d = (0, _shared_1.asArray)(args[0]);
608
+ if (!d) {
609
+ return values_1.ERRORS.VALUE;
610
+ }
611
+ const result = [];
612
+ for (let i = 1; i < args.length; i++) {
613
+ const nV = (0, values_1.toNumberRV)(args[i]);
614
+ if ((0, values_1.isError)(nV)) {
615
+ return nV;
616
+ }
617
+ const idx = nV.value > 0 ? nV.value - 1 : d.height + nV.value;
618
+ if (idx < 0 || idx >= d.height) {
619
+ return values_1.ERRORS.VALUE;
620
+ }
621
+ const row = [];
622
+ for (let c = 0; c < d.width; c++) {
623
+ row.push((0, _shared_1.getCell)(d, idx, c));
624
+ }
625
+ result.push(row);
626
+ }
627
+ return (0, values_1.rvArray)(result);
628
+ }
629
+ function fnCHOOSECOLS(args) {
630
+ const d = (0, _shared_1.asArray)(args[0]);
631
+ if (!d) {
632
+ return values_1.ERRORS.VALUE;
633
+ }
634
+ const ci = [];
635
+ for (let i = 1; i < args.length; i++) {
636
+ const nV = (0, values_1.toNumberRV)(args[i]);
637
+ if ((0, values_1.isError)(nV)) {
638
+ return nV;
639
+ }
640
+ const idx = nV.value > 0 ? nV.value - 1 : d.width + nV.value;
641
+ if (idx < 0 || idx >= d.width) {
642
+ return values_1.ERRORS.VALUE;
643
+ }
644
+ ci.push(idx);
645
+ }
646
+ const result = [];
647
+ for (let r = 0; r < d.height; r++) {
648
+ result.push(ci.map(c => (0, _shared_1.getCell)(d, r, c)));
649
+ }
650
+ return (0, values_1.rvArray)(result);
651
+ }
652
+ function fnVSTACK(args) {
653
+ const rows = [];
654
+ let maxWidth = 0;
655
+ for (const a of args) {
656
+ if (a.kind === 5 /* RVKind.Array */) {
657
+ for (let r = 0; r < a.height; r++) {
658
+ const row = [];
659
+ for (let c = 0; c < a.width; c++) {
660
+ row.push(a.rows[r][c]);
661
+ }
662
+ rows.push(row);
663
+ if (a.width > maxWidth) {
664
+ maxWidth = a.width;
665
+ }
666
+ }
667
+ }
668
+ else {
669
+ rows.push([(0, values_1.topLeft)(a)]);
670
+ if (maxWidth < 1) {
671
+ maxWidth = 1;
672
+ }
673
+ }
674
+ }
675
+ if (rows.length === 0) {
676
+ return values_1.ERRORS.VALUE;
677
+ }
678
+ // Pad with #N/A (not BLANK) to match Excel, and to stay symmetric with
679
+ // HSTACK's existing behaviour. The previous code left short rows to be
680
+ // rectangularised by `rvArray`, which used BLANK — visually wrong and
681
+ // inconsistent with how HSTACK reports "missing" cells.
682
+ for (const row of rows) {
683
+ while (row.length < maxWidth) {
684
+ row.push(values_1.ERRORS.NA);
685
+ }
686
+ }
687
+ return (0, values_1.rvArray)(rows);
688
+ }
689
+ function fnHSTACK(args) {
690
+ let maxRows = 0;
691
+ const arrays = [];
692
+ for (const a of args) {
693
+ if (a.kind === 5 /* RVKind.Array */) {
694
+ arrays.push(a);
695
+ if (a.height > maxRows) {
696
+ maxRows = a.height;
697
+ }
698
+ }
699
+ else {
700
+ arrays.push((0, values_1.rvArray)([[(0, values_1.topLeft)(a)]]));
701
+ if (maxRows < 1) {
702
+ maxRows = 1;
703
+ }
704
+ }
705
+ }
706
+ const result = [];
707
+ for (let r = 0; r < maxRows; r++) {
708
+ const row = [];
709
+ for (const arr of arrays) {
710
+ if (r < arr.height) {
711
+ for (let c = 0; c < arr.width; c++) {
712
+ row.push(arr.rows[r][c]);
713
+ }
714
+ }
715
+ else {
716
+ for (let c = 0; c < arr.width; c++) {
717
+ row.push(values_1.ERRORS.NA);
718
+ }
719
+ }
720
+ }
721
+ result.push(row);
722
+ }
723
+ return (0, values_1.rvArray)(result);
724
+ }
725
+ function fnTAKE(args) {
726
+ const d = (0, _shared_1.asArray)(args[0]);
727
+ if (!d) {
728
+ return values_1.ERRORS.VALUE;
729
+ }
730
+ const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(d.height);
731
+ if ((0, values_1.isError)(rowsV)) {
732
+ return rowsV;
733
+ }
734
+ const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(d.width);
735
+ if ((0, values_1.isError)(colsV)) {
736
+ return colsV;
737
+ }
738
+ const rS = rowsV.value >= 0 ? 0 : Math.max(0, d.height + rowsV.value);
739
+ const rE = rowsV.value >= 0 ? Math.min(rowsV.value, d.height) : d.height;
740
+ const cS = colsV.value >= 0 ? 0 : Math.max(0, d.width + colsV.value);
741
+ const cE = colsV.value >= 0 ? Math.min(colsV.value, d.width) : d.width;
742
+ const result = [];
743
+ for (let r = rS; r < rE; r++) {
744
+ const row = [];
745
+ for (let c = cS; c < cE; c++) {
746
+ row.push((0, _shared_1.getCell)(d, r, c));
747
+ }
748
+ result.push(row);
749
+ }
750
+ return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
751
+ }
752
+ function fnDROP(args) {
753
+ const d = (0, _shared_1.asArray)(args[0]);
754
+ if (!d) {
755
+ return values_1.ERRORS.VALUE;
756
+ }
757
+ const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
758
+ if ((0, values_1.isError)(rowsV)) {
759
+ return rowsV;
760
+ }
761
+ const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(0);
762
+ if ((0, values_1.isError)(colsV)) {
763
+ return colsV;
764
+ }
765
+ const rS = rowsV.value >= 0 ? rowsV.value : 0;
766
+ const rE = rowsV.value >= 0 ? d.height : d.height + rowsV.value;
767
+ const cS = colsV.value >= 0 ? colsV.value : 0;
768
+ const cE = colsV.value >= 0 ? d.width : d.width + colsV.value;
769
+ const result = [];
770
+ for (let r = rS; r < rE; r++) {
771
+ const row = [];
772
+ for (let c = cS; c < cE; c++) {
773
+ row.push((0, _shared_1.getCell)(d, r, c));
774
+ }
775
+ if (row.length > 0) {
776
+ result.push(row);
777
+ }
778
+ }
779
+ return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
780
+ }
781
+ function fnWRAPROWS(args) {
782
+ if (!(0, values_1.isArray)(args[0])) {
783
+ return values_1.ERRORS.VALUE;
784
+ }
785
+ const arr = args[0];
786
+ const flat = [];
787
+ for (let r = 0; r < arr.height; r++) {
788
+ for (let c = 0; c < arr.width; c++) {
789
+ flat.push((0, _shared_1.getCell)(arr, r, c));
790
+ }
791
+ }
792
+ const wcV = (0, values_1.toNumberRV)(args[1]);
793
+ if ((0, values_1.isError)(wcV)) {
794
+ return wcV;
795
+ }
796
+ if (wcV.value < 1) {
797
+ return values_1.ERRORS.VALUE;
798
+ }
799
+ const pad = args.length > 2 ? (0, values_1.topLeft)(args[2]) : values_1.ERRORS.NA;
800
+ const result = [];
801
+ for (let i = 0; i < flat.length; i += wcV.value) {
802
+ const row = flat.slice(i, i + wcV.value);
803
+ while (row.length < wcV.value) {
804
+ row.push(pad);
805
+ }
806
+ result.push(row);
807
+ }
808
+ return (0, values_1.rvArray)(result);
809
+ }
810
+ function fnWRAPCOLS(args) {
811
+ if (!(0, values_1.isArray)(args[0])) {
812
+ return values_1.ERRORS.VALUE;
813
+ }
814
+ const arr = args[0];
815
+ const flat = [];
816
+ for (let r = 0; r < arr.height; r++) {
817
+ for (let c = 0; c < arr.width; c++) {
818
+ flat.push((0, _shared_1.getCell)(arr, r, c));
819
+ }
820
+ }
821
+ const wcV = (0, values_1.toNumberRV)(args[1]);
822
+ if ((0, values_1.isError)(wcV)) {
823
+ return wcV;
824
+ }
825
+ if (wcV.value < 1) {
826
+ return values_1.ERRORS.VALUE;
827
+ }
828
+ const pad = args.length > 2 ? (0, values_1.topLeft)(args[2]) : values_1.ERRORS.NA;
829
+ const numCols = Math.ceil(flat.length / wcV.value);
830
+ const result = [];
831
+ for (let r = 0; r < wcV.value; r++) {
832
+ const row = [];
833
+ for (let c = 0; c < numCols; c++) {
834
+ const idx = c * wcV.value + r;
835
+ row.push(idx < flat.length ? flat[idx] : pad);
836
+ }
837
+ result.push(row);
838
+ }
839
+ return (0, values_1.rvArray)(result);
840
+ }
841
+ function fnEXPAND(args) {
842
+ const d = (0, _shared_1.asArray)(args[0]);
843
+ if (!d) {
844
+ return values_1.ERRORS.VALUE;
845
+ }
846
+ const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(d.height);
847
+ if ((0, values_1.isError)(rowsV)) {
848
+ return rowsV;
849
+ }
850
+ const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(d.width);
851
+ if ((0, values_1.isError)(colsV)) {
852
+ return colsV;
853
+ }
854
+ // Excel requires the target to be at least as large as the source, and
855
+ // both dimensions to be positive. Without Math.trunc the inner loop
856
+ // runs `c < rowsV.value` comparisons against a float, which produces
857
+ // an off-by-one depending on the fractional part (R6-P1-5).
858
+ const rowCount = Math.trunc(rowsV.value);
859
+ const colCount = Math.trunc(colsV.value);
860
+ if (!Number.isFinite(rowCount) ||
861
+ !Number.isFinite(colCount) ||
862
+ rowCount < d.height ||
863
+ colCount < d.width) {
864
+ return values_1.ERRORS.VALUE;
865
+ }
866
+ // Cap the output size to the same 10M-cell budget the other dynamic
867
+ // array producers use (see MAKEARRAY, broadcastBinaryOp).
868
+ if (rowCount * colCount > 10000000) {
869
+ return values_1.ERRORS.NUM;
870
+ }
871
+ const pad = args.length > 3 ? (0, values_1.topLeft)(args[3]) : values_1.ERRORS.NA;
872
+ const result = [];
873
+ for (let r = 0; r < rowCount; r++) {
874
+ const row = [];
875
+ for (let c = 0; c < colCount; c++) {
876
+ row.push(r < d.height && c < d.width ? (0, _shared_1.getCell)(d, r, c) : pad);
877
+ }
878
+ result.push(row);
879
+ }
880
+ return (0, values_1.rvArray)(result);
881
+ }