@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
@@ -1,10 +1,12 @@
1
1
  import { colCache } from "../../../utils/col-cache.js";
2
2
  import { BaseXform } from "../base-xform.js";
3
3
  import { DefinedNamesXform } from "./defined-name-xform.js";
4
+ import { ExternalReferenceXform } from "./external-reference-xform.js";
4
5
  import { WorksheetXform } from "./sheet-xform.js";
5
6
  import { WorkbookCalcPropertiesXform } from "./workbook-calc-properties-xform.js";
6
7
  import { WorkbookPivotCacheXform } from "./workbook-pivot-cache-xform.js";
7
8
  import { WorkbookPropertiesXform } from "./workbook-properties-xform.js";
9
+ import { WorkbookProtectionXform } from "./workbook-protection-xform.js";
8
10
  import { WorkbookViewXform } from "./workbook-view-xform.js";
9
11
  import { ListXform } from "../list-xform.js";
10
12
  import { StaticXform } from "../static-xform.js";
@@ -15,6 +17,7 @@ class WorkbookXform extends BaseXform {
15
17
  this.map = {
16
18
  fileVersion: WorkbookXform.STATIC_XFORMS.fileVersion,
17
19
  workbookPr: new WorkbookPropertiesXform(),
20
+ workbookProtection: new WorkbookProtectionXform(),
18
21
  bookViews: new ListXform({
19
22
  tag: "bookViews",
20
23
  count: false,
@@ -31,6 +34,11 @@ class WorkbookXform extends BaseXform {
31
34
  tag: "pivotCaches",
32
35
  count: false,
33
36
  childXform: new WorkbookPivotCacheXform()
37
+ }),
38
+ externalReferences: new ListXform({
39
+ tag: "externalReferences",
40
+ count: false,
41
+ childXform: new ExternalReferenceXform()
34
42
  })
35
43
  };
36
44
  }
@@ -90,6 +98,7 @@ class WorkbookXform extends BaseXform {
90
98
  xmlStream.openNode("workbook", WorkbookXform.WORKBOOK_ATTRIBUTES);
91
99
  this.map.fileVersion.render(xmlStream);
92
100
  this.map.workbookPr.render(xmlStream, model.properties);
101
+ this.map.workbookProtection.render(xmlStream, model.protection);
93
102
  this.map.bookViews.render(xmlStream, model.views);
94
103
  this.map.sheets.render(xmlStream, model.sheets);
95
104
  this.map.definedNames.render(xmlStream, model.definedNames);
@@ -107,6 +116,15 @@ class WorkbookXform extends BaseXform {
107
116
  return true;
108
117
  });
109
118
  this.map.pivotCaches.render(xmlStream, uniquePivotCaches);
119
+ // <externalReferences> order matters: one entry per externalLink in
120
+ // declaration order, each carrying the r:id that resolves (via
121
+ // workbook.xml.rels) to `xl/externalLinks/externalLink{N}.xml`. The
122
+ // index inside this list is exactly the `[N]` used in formula strings.
123
+ const externalLinks = model.externalLinks ?? [];
124
+ if (externalLinks.length > 0) {
125
+ const externalReferenceModels = externalLinks.map((link) => ({ rId: link.rId }));
126
+ this.map.externalReferences.render(xmlStream, externalReferenceModels);
127
+ }
110
128
  xmlStream.closeNode();
111
129
  }
112
130
  parseOpen(node) {
@@ -142,8 +160,9 @@ class WorkbookXform extends BaseXform {
142
160
  this.model = {
143
161
  sheets: this.map.sheets.model,
144
162
  properties: this.map.workbookPr.model || {},
163
+ protection: this.map.workbookProtection.model,
145
164
  views: this.map.bookViews.model,
146
- calcProperties: {}
165
+ calcProperties: this.map.calcPr.model || {}
147
166
  };
148
167
  if (this.map.definedNames.model) {
149
168
  this.model.definedNames = this.map.definedNames.model;
@@ -151,6 +170,13 @@ class WorkbookXform extends BaseXform {
151
170
  if (this.map.pivotCaches.model && this.map.pivotCaches.model.length > 0) {
152
171
  this.model.pivotCaches = this.map.pivotCaches.model;
153
172
  }
173
+ // Attach parsed <externalReferences> as a list of { rId } objects.
174
+ // The reader in xlsx.browser.ts will later join each entry with the
175
+ // matching workbookRels row (to pick up the externalLink Target) and
176
+ // the parsed externalLinkN.xml part (to pick up sheetNames / cache).
177
+ if (this.map.externalReferences.model && this.map.externalReferences.model.length > 0) {
178
+ this.model.externalReferences = this.map.externalReferences.model;
179
+ }
154
180
  return false;
155
181
  default:
156
182
  // not quite sure how we get here!
@@ -190,13 +216,20 @@ class WorkbookXform extends BaseXform {
190
216
  const definedNames = [];
191
217
  if (model.definedNames) {
192
218
  model.definedNames.forEach((definedName) => {
219
+ // For print area/titles, use rawText to extract ranges since the xform
220
+ // layer no longer pre-classifies content (two-phase design).
221
+ const effectiveRanges = definedName.ranges?.length > 0
222
+ ? definedName.ranges
223
+ : definedName.rawText
224
+ ? [definedName.rawText]
225
+ : [];
193
226
  if (definedName.name === "_xlnm.Print_Area") {
194
227
  worksheet = worksheets[definedName.localSheetId];
195
- if (worksheet && definedName.ranges?.length > 0) {
228
+ if (worksheet && effectiveRanges.length > 0) {
196
229
  if (!worksheet.pageSetup) {
197
230
  worksheet.pageSetup = {};
198
231
  }
199
- const range = colCache.decodeEx(definedName.ranges[0]);
232
+ const range = colCache.decodeEx(effectiveRanges[0]);
200
233
  worksheet.pageSetup.printArea = worksheet.pageSetup.printArea
201
234
  ? `${worksheet.pageSetup.printArea}&&${range.dimensions}`
202
235
  : range.dimensions;
@@ -204,11 +237,11 @@ class WorkbookXform extends BaseXform {
204
237
  }
205
238
  else if (definedName.name === "_xlnm.Print_Titles") {
206
239
  worksheet = worksheets[definedName.localSheetId];
207
- if (worksheet && definedName.ranges?.length > 0) {
240
+ if (worksheet && effectiveRanges.length > 0) {
208
241
  if (!worksheet.pageSetup) {
209
242
  worksheet.pageSetup = {};
210
243
  }
211
- const rangeString = definedName.ranges.join(",");
244
+ const rangeString = effectiveRanges.join(",");
212
245
  const dollarRegex = /\$/g;
213
246
  const rowRangeRegex = /\$\d+:\$\d+/;
214
247
  const rowRangeMatches = rangeString.match(rowRangeRegex);
@@ -1,4 +1,4 @@
1
- import { OOXML_PATHS, commentsPathFromName, ctrlPropPath, drawingPath, pivotCacheDefinitionPath, pivotCacheRecordsPath, pivotTablePath, tablePath, toContentTypesPartName, worksheetPath } from "../../../utils/ooxml-paths.js";
1
+ import { OOXML_PATHS, commentsPathFromName, ctrlPropPath, drawingPath, externalLinkPath, pivotCacheDefinitionPath, pivotCacheRecordsPath, pivotTablePath, tablePath, toContentTypesPartName, worksheetPath } from "../../../utils/ooxml-paths.js";
2
2
  import { BaseXform } from "../base-xform.js";
3
3
  import { StdDocAttributes } from "../../../../xml/writer.js";
4
4
  // used for rendering the [Content_Types].xml file
@@ -74,6 +74,17 @@ class ContentTypesXform extends BaseXform {
74
74
  PartName: toContentTypesPartName(OOXML_PATHS.xlStyles),
75
75
  ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
76
76
  });
77
+ // Each externalLink part needs its own Override. Omitted entries make
78
+ // Excel fail to load the external reference (and, in some builds,
79
+ // trigger a "the workbook is damaged" dialog).
80
+ if (model.externalLinks && model.externalLinks.length > 0) {
81
+ for (const link of model.externalLinks) {
82
+ xmlStream.leafNode("Override", {
83
+ PartName: toContentTypesPartName(externalLinkPath(link.index)),
84
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml"
85
+ });
86
+ }
87
+ }
77
88
  // Add FeaturePropertyBag if checkboxes are used
78
89
  if (model.hasCheckboxes) {
79
90
  xmlStream.leafNode("Override", {
@@ -81,6 +92,13 @@ class ContentTypesXform extends BaseXform {
81
92
  ContentType: "application/vnd.ms-excel.featurepropertybag+xml"
82
93
  });
83
94
  }
95
+ // Add metadata part for dynamic array formulas
96
+ if (model.hasDynamicArrayFormulas) {
97
+ xmlStream.leafNode("Override", {
98
+ PartName: toContentTypesPartName(OOXML_PATHS.xlMetadata),
99
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml"
100
+ });
101
+ }
84
102
  const hasSharedStrings = model.sharedStrings && model.sharedStrings.count;
85
103
  if (hasSharedStrings) {
86
104
  xmlStream.leafNode("Override", {
@@ -0,0 +1,158 @@
1
+ import { BaseXform } from "../base-xform.js";
2
+ import { StdDocAttributes } from "../../../../xml/writer.js";
3
+ // Namespace URIs
4
+ const NS_SPREADSHEETML = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
5
+ const NS_DYNAMIC_ARRAY = "http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray";
6
+ const XLDAPR_EXT_URI = "{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}";
7
+ class MetadataXform extends BaseXform {
8
+ constructor() {
9
+ super(...arguments);
10
+ // Parsing state
11
+ /** metadataType names in declaration order (1-indexed in OOXML) */
12
+ this._metadataTypeNames = [];
13
+ /** Per cellMetadata bk: the rc.t value (metadataType index, 1-indexed) */
14
+ this._cellMetadataTypeRefs = [];
15
+ /** Whether we are currently inside <cellMetadata> */
16
+ this._inCellMetadata = false;
17
+ /** Current rc.t value being collected inside a <bk> */
18
+ this._currentRcType = undefined;
19
+ }
20
+ get tag() {
21
+ return "metadata";
22
+ }
23
+ /**
24
+ * Render xl/metadata.xml for the given model.
25
+ * Only emits content when dynamicArrayCount > 0.
26
+ */
27
+ render(xmlStream, model) {
28
+ if (!model || model.dynamicArrayCount <= 0) {
29
+ return;
30
+ }
31
+ xmlStream.openXml(StdDocAttributes);
32
+ xmlStream.openNode("metadata", {
33
+ xmlns: NS_SPREADSHEETML,
34
+ "xmlns:xda": NS_DYNAMIC_ARRAY
35
+ });
36
+ // metadataTypes: declare XLDAPR
37
+ xmlStream.openNode("metadataTypes", { count: "1" });
38
+ xmlStream.leafNode("metadataType", {
39
+ name: "XLDAPR",
40
+ minSupportedVersion: "120000",
41
+ copy: "1",
42
+ pasteAll: "1",
43
+ pasteValues: "1",
44
+ merge: "1",
45
+ splitFirst: "1",
46
+ rowColShift: "1",
47
+ clearFormats: "1",
48
+ clearComments: "1",
49
+ assign: "1",
50
+ coerce: "1",
51
+ adjust: "1",
52
+ cellMeta: "1"
53
+ });
54
+ xmlStream.closeNode(); // </metadataTypes>
55
+ // futureMetadata: one shared block for all DA formulas
56
+ xmlStream.openNode("futureMetadata", { name: "XLDAPR", count: "1" });
57
+ xmlStream.openNode("bk");
58
+ xmlStream.openNode("extLst");
59
+ xmlStream.openNode("ext", { uri: XLDAPR_EXT_URI });
60
+ xmlStream.leafNode("xda:dynamicArrayProperties", {
61
+ fDynamic: "1",
62
+ fCollapsed: "0"
63
+ });
64
+ xmlStream.closeNode(); // </ext>
65
+ xmlStream.closeNode(); // </extLst>
66
+ xmlStream.closeNode(); // </bk>
67
+ xmlStream.closeNode(); // </futureMetadata>
68
+ // cellMetadata: one record (all DA cells share cm="1" which points here)
69
+ xmlStream.openNode("cellMetadata", { count: "1" });
70
+ xmlStream.openNode("bk");
71
+ // t="1" → metadataType index (1-indexed), v="0" → futureMetadata block index (0-indexed)
72
+ xmlStream.leafNode("rc", { t: "1", v: "0" });
73
+ xmlStream.closeNode(); // </bk>
74
+ xmlStream.closeNode(); // </cellMetadata>
75
+ xmlStream.closeNode(); // </metadata>
76
+ }
77
+ // =========================================================================
78
+ // Parse: build precise cm → metadataType mapping
79
+ // =========================================================================
80
+ reset() {
81
+ this._metadataTypeNames = [];
82
+ this._cellMetadataTypeRefs = [];
83
+ this._inCellMetadata = false;
84
+ this._currentRcType = undefined;
85
+ }
86
+ parseOpen(node) {
87
+ switch (node.name) {
88
+ case "metadata":
89
+ this.reset();
90
+ return true;
91
+ case "metadataType":
92
+ // Collect type names in declaration order (1-indexed in OOXML,
93
+ // but stored 0-indexed here — we adjust when looking up).
94
+ this._metadataTypeNames.push(node.attributes.name || "");
95
+ return true;
96
+ case "cellMetadata":
97
+ this._inCellMetadata = true;
98
+ return true;
99
+ case "bk":
100
+ if (this._inCellMetadata) {
101
+ this._currentRcType = undefined;
102
+ }
103
+ return true;
104
+ case "rc":
105
+ if (this._inCellMetadata && node.attributes.t !== undefined) {
106
+ this._currentRcType = parseInt(node.attributes.t, 10);
107
+ }
108
+ return true;
109
+ // Parse nested elements without action
110
+ case "metadataTypes":
111
+ case "futureMetadata":
112
+ case "extLst":
113
+ case "ext":
114
+ case "xda:dynamicArrayProperties":
115
+ return true;
116
+ default:
117
+ return false;
118
+ }
119
+ }
120
+ parseText() { }
121
+ parseClose(name) {
122
+ switch (name) {
123
+ case "bk":
124
+ if (this._inCellMetadata) {
125
+ // Record the metadataType reference for this cellMetadata entry.
126
+ // rc.t is 1-indexed into metadataTypes; store as-is.
127
+ this._cellMetadataTypeRefs.push(this._currentRcType ?? 0);
128
+ this._currentRcType = undefined;
129
+ }
130
+ return true;
131
+ case "cellMetadata":
132
+ this._inCellMetadata = false;
133
+ return true;
134
+ case "metadata": {
135
+ // Build the set of cm values (1-indexed) that map to XLDAPR.
136
+ // cm on <c> is 1-indexed into cellMetadata bk entries.
137
+ const dynamicArrayCmIndices = new Set();
138
+ for (let i = 0; i < this._cellMetadataTypeRefs.length; i++) {
139
+ const typeIndex = this._cellMetadataTypeRefs[i]; // 1-indexed
140
+ // metadataTypeNames is 0-indexed, so subtract 1
141
+ const typeName = this._metadataTypeNames[typeIndex - 1];
142
+ if (typeName === "XLDAPR") {
143
+ // cm is 1-indexed: bk[0] → cm=1, bk[1] → cm=2, etc.
144
+ dynamicArrayCmIndices.add(i + 1);
145
+ }
146
+ }
147
+ this.model = {
148
+ hasDynamicArrays: dynamicArrayCmIndices.size > 0,
149
+ dynamicArrayCmIndices
150
+ };
151
+ return false; // done parsing
152
+ }
153
+ default:
154
+ return true;
155
+ }
156
+ }
157
+ }
158
+ export { MetadataXform };
@@ -0,0 +1,105 @@
1
+ import { BaseXform } from "../base-xform.js";
2
+ import { BaseCellAnchorXform } from "./base-cell-anchor-xform.js";
3
+ import { ExtXform } from "./ext-xform.js";
4
+ import { PicXform } from "./pic-xform.js";
5
+ import { StaticXform } from "../static-xform.js";
6
+ /** https://en.wikipedia.org/wiki/Office_Open_XML_file_formats#DrawingML */
7
+ const EMU_PER_PIXEL_AT_96_DPI = 9525;
8
+ /**
9
+ * Xform for the <xdr:pos> element (absolute position in EMU).
10
+ * Converts between EMU (in XML) and pixels (in model).
11
+ */
12
+ class PosXform extends BaseXform {
13
+ constructor() {
14
+ super();
15
+ this.map = {};
16
+ this.model = { x: 0, y: 0 };
17
+ }
18
+ get tag() {
19
+ return "xdr:pos";
20
+ }
21
+ render(xmlStream, model) {
22
+ xmlStream.leafNode(this.tag, {
23
+ x: Math.floor(model.x * EMU_PER_PIXEL_AT_96_DPI),
24
+ y: Math.floor(model.y * EMU_PER_PIXEL_AT_96_DPI)
25
+ });
26
+ }
27
+ parseOpen(node) {
28
+ if (node.name === this.tag) {
29
+ this.model = {
30
+ x: parseInt(node.attributes.x ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
31
+ y: parseInt(node.attributes.y ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI
32
+ };
33
+ return true;
34
+ }
35
+ return false;
36
+ }
37
+ parseText() { }
38
+ parseClose() {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Xform for <xdr:absoluteAnchor> — images positioned by absolute coordinates
44
+ * rather than cell references.
45
+ *
46
+ * Structure:
47
+ * ```xml
48
+ * <xdr:absoluteAnchor>
49
+ * <xdr:pos x="0" y="0"/>
50
+ * <xdr:ext cx="1000000" cy="1000000"/>
51
+ * <xdr:pic>...</xdr:pic>
52
+ * <xdr:clientData/>
53
+ * </xdr:absoluteAnchor>
54
+ * ```
55
+ */
56
+ class AbsoluteAnchorXform extends BaseCellAnchorXform {
57
+ constructor() {
58
+ super();
59
+ this.map = {
60
+ "xdr:pos": new PosXform(),
61
+ "xdr:ext": new ExtXform({ tag: "xdr:ext" }),
62
+ "xdr:pic": new PicXform(),
63
+ "xdr:clientData": new StaticXform({ tag: "xdr:clientData" })
64
+ };
65
+ }
66
+ get tag() {
67
+ return "xdr:absoluteAnchor";
68
+ }
69
+ prepare(model, options) {
70
+ if (model.picture) {
71
+ this.map["xdr:pic"].prepare(model.picture, options);
72
+ }
73
+ }
74
+ render(xmlStream, model) {
75
+ xmlStream.openNode(this.tag);
76
+ this.map["xdr:pos"].render(xmlStream, model.range.pos ?? { x: 0, y: 0 });
77
+ this.map["xdr:ext"].render(xmlStream, model.range.ext);
78
+ if (model.picture) {
79
+ this.map["xdr:pic"].render(xmlStream, model.picture);
80
+ }
81
+ this.map["xdr:clientData"].render(xmlStream, {});
82
+ xmlStream.closeNode();
83
+ }
84
+ parseClose(name) {
85
+ if (this.parser) {
86
+ if (!this.parser.parseClose(name)) {
87
+ this.parser = undefined;
88
+ }
89
+ return true;
90
+ }
91
+ switch (name) {
92
+ case this.tag:
93
+ this.model.range.pos = this.map["xdr:pos"].model;
94
+ this.model.range.ext = this.map["xdr:ext"].model;
95
+ this.model.picture = this.map["xdr:pic"].model;
96
+ return false;
97
+ default:
98
+ return true;
99
+ }
100
+ }
101
+ reconcile(model, options) {
102
+ model.medium = this.reconcilePicture(model.picture, options);
103
+ }
104
+ }
105
+ export { AbsoluteAnchorXform };
@@ -31,6 +31,9 @@ class BaseCellAnchorXform extends BaseXform {
31
31
  reconcilePicture(model, options) {
32
32
  if (model && model.rId) {
33
33
  const rel = options.rels[model.rId];
34
+ if (!rel) {
35
+ return undefined;
36
+ }
34
37
  const match = rel.Target.match(/.*\/media\/(.+[.][a-zA-Z]{3,4})/);
35
38
  if (match) {
36
39
  const name = match[1];
@@ -1,10 +1,14 @@
1
1
  import { colCache } from "../../../utils/col-cache.js";
2
2
  import { BaseXform } from "../base-xform.js";
3
+ import { AbsoluteAnchorXform } from "./absolute-anchor-xform.js";
3
4
  import { OneCellAnchorXform } from "./one-cell-anchor-xform.js";
4
5
  import { TwoCellAnchorXform } from "./two-cell-anchor-xform.js";
5
6
  import { StdDocAttributes } from "../../../../xml/writer.js";
6
7
  function getAnchorType(model) {
7
8
  const range = typeof model.range === "string" ? colCache.decode(model.range) : model.range;
9
+ if (range.pos !== undefined) {
10
+ return "xdr:absoluteAnchor";
11
+ }
8
12
  return range.br ? "xdr:twoCellAnchor" : "xdr:oneCellAnchor";
9
13
  }
10
14
  class DrawingXform extends BaseXform {
@@ -12,7 +16,8 @@ class DrawingXform extends BaseXform {
12
16
  super();
13
17
  this.map = {
14
18
  "xdr:twoCellAnchor": new TwoCellAnchorXform(),
15
- "xdr:oneCellAnchor": new OneCellAnchorXform()
19
+ "xdr:oneCellAnchor": new OneCellAnchorXform(),
20
+ "xdr:absoluteAnchor": new AbsoluteAnchorXform()
16
21
  };
17
22
  this.model = { anchors: [] };
18
23
  }
@@ -80,7 +85,10 @@ class DrawingXform extends BaseXform {
80
85
  }
81
86
  reconcile(model, options) {
82
87
  model.anchors.forEach(anchor => {
83
- if (anchor.br) {
88
+ if (anchor.range?.pos !== undefined) {
89
+ this.map["xdr:absoluteAnchor"].reconcile(anchor, options);
90
+ }
91
+ else if (anchor.br) {
84
92
  this.map["xdr:twoCellAnchor"].reconcile(anchor, options);
85
93
  }
86
94
  else {