@agile-team/mach-table-xlsx 0.23.0 → 0.25.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.
- package/README.md +15 -7
- package/dist/index.cjs +2 -2
- package/dist/index.js +2 -2
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/ChenyCHENYU/MachTable/main/assets/mach-table-logo.svg" alt="MachTable" width="760" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
1
5
|
# @agile-team/mach-table-xlsx
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
MachTable 0.25 的可选 XLSX 导入导出扩展。工作簿引擎由宿主动态注入,因此普通表格页面不会下载 Excel 代码。
|
|
4
8
|
|
|
5
9
|
```bash
|
|
6
10
|
pnpm add @agile-team/mach-table-xlsx xlsx
|
|
@@ -9,18 +13,22 @@ pnpm add @agile-team/mach-table-xlsx xlsx
|
|
|
9
13
|
```ts
|
|
10
14
|
import { createXlsxExtension } from "@agile-team/mach-table-xlsx";
|
|
11
15
|
|
|
12
|
-
const
|
|
13
|
-
|
|
16
|
+
const excel = createXlsxExtension(() => import("xlsx"));
|
|
17
|
+
|
|
18
|
+
await excel.export(api, {
|
|
19
|
+
fileName: "orders.xlsx",
|
|
20
|
+
sheetName: "Orders"
|
|
21
|
+
});
|
|
14
22
|
|
|
15
|
-
await
|
|
23
|
+
await excel.import(api, await file.arrayBuffer(), {
|
|
16
24
|
sheet: 0,
|
|
17
25
|
mode: "replace",
|
|
18
26
|
coerceNumbers: true
|
|
19
27
|
});
|
|
20
28
|
```
|
|
21
29
|
|
|
22
|
-
|
|
30
|
+
扩展复用 Core 的选择范围、表头、公式注入防护和安全导入规则。`xlsx` 只是示例引擎,不是本包的捆绑依赖;可注入经过项目批准的兼容引擎。
|
|
23
31
|
|
|
24
|
-
|
|
32
|
+
文档:[XLSX 指南](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/recipes/xlsx.md) · [企业接入](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/enterprise-integration.md)
|
|
25
33
|
|
|
26
|
-
Source-available © ChenyCHENYU (Agile Team).
|
|
34
|
+
Source-available © ChenyCHENYU (Agile Team). 任何使用均须事先取得书面授权。详见 [LICENSE](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSE) 与[授权流程](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSING.md)。
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var w=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var E=(e,o)=>{for(var n in o)w(e,n,{get:o[n],enumerable:!0})},T=(e,o,n,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of y(o))!S.call(e,r)&&r!==n&&w(e,r,{get:()=>o[r],enumerable:!(t=b(o,r))||t.enumerable});return e};var _=e=>T(w({},"__esModule",{value:!0}),e);var
|
|
2
|
-
`),d={separator:t.separator,mode:t.mode,headerRowIndex:t.headerRowIndex,coerceNumbers:t.coerceNumbers,parseValue:t.parseValue};return e.importCsv(u,d)}function G(e){return{export(o,n){return h(o,e,n)},import(o,n,t){return k(o,e,n,t)}}}0&&(module.exports={createXlsxExtension,exportGridToXlsx,importGridFromXlsx});
|
|
1
|
+
"use strict";var w=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var E=(e,o)=>{for(var n in o)w(e,n,{get:o[n],enumerable:!0})},T=(e,o,n,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of y(o))!S.call(e,r)&&r!==n&&w(e,r,{get:()=>o[r],enumerable:!(t=b(o,r))||t.enumerable});return e};var _=e=>T(w({},"__esModule",{value:!0}),e);var C={};E(C,{createXlsxExtension:()=>G,exportGridToXlsx:()=>h,importGridFromXlsx:()=>k});module.exports=_(C);var x=require("@agile-team/mach-table");function f(e){return typeof e=="object"&&e!==null&&"utils"in e}async function m(e){let o=typeof e=="function"?await e():e,n=typeof o=="object"&&o!==null&&"default"in o?o.default:void 0,t=f(o)?o:f(n)?n:void 0;if(!t?.utils?.book_new||!t.utils.aoa_to_sheet||!t.utils.book_append_sheet)throw new TypeError("[MachTable] Invalid XLSX engine adapter.");return t}function N(e){return(e??"Data").replace(/[\\/?*\[\]:]/g," ").trim().slice(0,31)||"Data"}function P(e){let n=(e?.trim()||"mach-table.xlsx").replace(/[\\/:*?"<>|\u0000-\u001f]/g," ").trim()||"mach-table.xlsx";return/\.xlsx$/i.test(n)?n:`${n}.xlsx`}function g(e){let o=e??",";if(o.length!==1||/["\r\n]/.test(o))throw new TypeError("[MachTable] XLSX CSV bridge requires a single non-quote separator character.");return o}async function h(e,o,n={}){let t=await m(o),r=g(n.columnSeparator),i=e.io.exportCsv(n),a=(0,x.parseCsv)(i,r).map((d,l)=>d.map((c,X)=>n.transformCell?.(c,l,X)??c)),s=t.utils.book_new(),p=t.utils.aoa_to_sheet(a);t.utils.book_append_sheet(s,p,N(n.sheetName));let u=P(n.fileName);if(t.writeFileXLSX)await t.writeFileXLSX(s,u,n.writeOptions);else if(t.writeFile)await t.writeFile(s,u,n.writeOptions);else throw new TypeError("[MachTable] XLSX engine must expose writeFileXLSX or writeFile.");return s}function F(e,o){let n="";return typeof e=="string"?n=e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?n=e.toString():typeof e=="symbol"?n=e.description??"":typeof e=="function"?n=e.name:e!=null&&(n=JSON.stringify(e)??""),n.includes(o)||/["\n\r]/.test(n)?`"${n.replace(/"/g,'""')}"`:n}async function k(e,o,n,t={}){let r=await m(o);if(!r.read||!r.utils.sheet_to_json)throw new TypeError("[MachTable] XLSX import requires engine.read and utils.sheet_to_json.");let i=r.read(n,t.readOptions);if(!i||!Array.isArray(i.SheetNames)||!i.Sheets||typeof i.Sheets!="object")throw new TypeError("[MachTable] XLSX engine returned an invalid workbook.");let a=typeof t.sheet=="number"?i.SheetNames[t.sheet]:t.sheet??i.SheetNames[0];if(!a||!(a in i.Sheets))throw new RangeError(`[MachTable] Worksheet not found: ${String(t.sheet??0)}.`);let s=r.utils.sheet_to_json(i.Sheets[a],{header:1,raw:!1});if(!Array.isArray(s)||s.some(l=>!Array.isArray(l)))throw new TypeError("[MachTable] XLSX worksheet must resolve to an array of rows.");let p=g(t.separator),u=s.map(l=>l.map(c=>F(c,p)).join(p)).join(`
|
|
2
|
+
`),d={separator:t.separator,mode:t.mode,headerRowIndex:t.headerRowIndex,coerceNumbers:t.coerceNumbers,parseValue:t.parseValue};return e.io.importCsv(u,d)}function G(e){return{export(o,n){return h(o,e,n)},import(o,n,t){return k(o,e,n,t)}}}0&&(module.exports={createXlsxExtension,exportGridToXlsx,importGridFromXlsx});
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{parseCsv as g}from"@agile-team/mach-table";function w(e){return typeof e=="object"&&e!==null&&"utils"in e}async function f(e){let t=typeof e=="function"?await e():e,n=typeof t=="object"&&t!==null&&"default"in t?t.default:void 0,o=w(t)?t:w(n)?n:void 0;if(!o?.utils?.book_new||!o.utils.aoa_to_sheet||!o.utils.book_append_sheet)throw new TypeError("[MachTable] Invalid XLSX engine adapter.");return o}function h(e){return(e??"Data").replace(/[\\/?*\[\]:]/g," ").trim().slice(0,31)||"Data"}function k(e){let n=(e?.trim()||"mach-table.xlsx").replace(/[\\/:*?"<>|\u0000-\u001f]/g," ").trim()||"mach-table.xlsx";return/\.xlsx$/i.test(n)?n:`${n}.xlsx`}function x(e){let t=e??",";if(t.length!==1||/["\r\n]/.test(t))throw new TypeError("[MachTable] XLSX CSV bridge requires a single non-quote separator character.");return t}async function X(e,t,n={}){let o=await f(t),
|
|
2
|
-
`),d={separator:o.separator,mode:o.mode,headerRowIndex:o.headerRowIndex,coerceNumbers:o.coerceNumbers,parseValue:o.parseValue};return e.importCsv(u,d)}function E(e){return{export(t,n){return X(t,e,n)},import(t,n,o){return y(t,e,n,o)}}}export{E as createXlsxExtension,X as exportGridToXlsx,y as importGridFromXlsx};
|
|
1
|
+
import{parseCsv as g}from"@agile-team/mach-table";function w(e){return typeof e=="object"&&e!==null&&"utils"in e}async function f(e){let t=typeof e=="function"?await e():e,n=typeof t=="object"&&t!==null&&"default"in t?t.default:void 0,o=w(t)?t:w(n)?n:void 0;if(!o?.utils?.book_new||!o.utils.aoa_to_sheet||!o.utils.book_append_sheet)throw new TypeError("[MachTable] Invalid XLSX engine adapter.");return o}function h(e){return(e??"Data").replace(/[\\/?*\[\]:]/g," ").trim().slice(0,31)||"Data"}function k(e){let n=(e?.trim()||"mach-table.xlsx").replace(/[\\/:*?"<>|\u0000-\u001f]/g," ").trim()||"mach-table.xlsx";return/\.xlsx$/i.test(n)?n:`${n}.xlsx`}function x(e){let t=e??",";if(t.length!==1||/["\r\n]/.test(t))throw new TypeError("[MachTable] XLSX CSV bridge requires a single non-quote separator character.");return t}async function X(e,t,n={}){let o=await f(t),s=x(n.columnSeparator),r=e.io.exportCsv(n),a=g(r,s).map((d,l)=>d.map((c,m)=>n.transformCell?.(c,l,m)??c)),i=o.utils.book_new(),p=o.utils.aoa_to_sheet(a);o.utils.book_append_sheet(i,p,h(n.sheetName));let u=k(n.fileName);if(o.writeFileXLSX)await o.writeFileXLSX(i,u,n.writeOptions);else if(o.writeFile)await o.writeFile(i,u,n.writeOptions);else throw new TypeError("[MachTable] XLSX engine must expose writeFileXLSX or writeFile.");return i}function b(e,t){let n="";return typeof e=="string"?n=e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?n=e.toString():typeof e=="symbol"?n=e.description??"":typeof e=="function"?n=e.name:e!=null&&(n=JSON.stringify(e)??""),n.includes(t)||/["\n\r]/.test(n)?`"${n.replace(/"/g,'""')}"`:n}async function y(e,t,n,o={}){let s=await f(t);if(!s.read||!s.utils.sheet_to_json)throw new TypeError("[MachTable] XLSX import requires engine.read and utils.sheet_to_json.");let r=s.read(n,o.readOptions);if(!r||!Array.isArray(r.SheetNames)||!r.Sheets||typeof r.Sheets!="object")throw new TypeError("[MachTable] XLSX engine returned an invalid workbook.");let a=typeof o.sheet=="number"?r.SheetNames[o.sheet]:o.sheet??r.SheetNames[0];if(!a||!(a in r.Sheets))throw new RangeError(`[MachTable] Worksheet not found: ${String(o.sheet??0)}.`);let i=s.utils.sheet_to_json(r.Sheets[a],{header:1,raw:!1});if(!Array.isArray(i)||i.some(l=>!Array.isArray(l)))throw new TypeError("[MachTable] XLSX worksheet must resolve to an array of rows.");let p=x(o.separator),u=i.map(l=>l.map(c=>b(c,p)).join(p)).join(`
|
|
2
|
+
`),d={separator:o.separator,mode:o.mode,headerRowIndex:o.headerRowIndex,coerceNumbers:o.coerceNumbers,parseValue:o.parseValue};return e.io.importCsv(u,d)}function E(e){return{export(t,n){return X(t,e,n)},import(t,n,o){return y(t,e,n,o)}}}export{E as createXlsxExtension,X as exportGridToXlsx,y as importGridFromXlsx};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agile-team/mach-table-xlsx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "Optional, engine-agnostic XLSX import and export extension for MachTable",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"data-grid",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"sideEffects": false,
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@agile-team/mach-table": "0.
|
|
51
|
+
"@agile-team/mach-table": "0.25.0"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsup",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"test": "vitest run",
|
|
57
57
|
"test:coverage": "vitest run --coverage"
|
|
58
58
|
},
|
|
59
|
-
"readme": "# @agile-team/mach-table-xlsx\n\
|
|
59
|
+
"readme": "<p align=\"center\">\n <img src=\"https://raw.githubusercontent.com/ChenyCHENYU/MachTable/main/assets/mach-table-logo.svg\" alt=\"MachTable\" width=\"760\" />\n</p>\n\n# @agile-team/mach-table-xlsx\n\nMachTable 0.25 的可选 XLSX 导入导出扩展。工作簿引擎由宿主动态注入,因此普通表格页面不会下载 Excel 代码。\n\n```bash\npnpm add @agile-team/mach-table-xlsx xlsx\n```\n\n```ts\nimport { createXlsxExtension } from \"@agile-team/mach-table-xlsx\";\n\nconst excel = createXlsxExtension(() => import(\"xlsx\"));\n\nawait excel.export(api, {\n fileName: \"orders.xlsx\",\n sheetName: \"Orders\"\n});\n\nawait excel.import(api, await file.arrayBuffer(), {\n sheet: 0,\n mode: \"replace\",\n coerceNumbers: true\n});\n```\n\n扩展复用 Core 的选择范围、表头、公式注入防护和安全导入规则。`xlsx` 只是示例引擎,不是本包的捆绑依赖;可注入经过项目批准的兼容引擎。\n\n文档:[XLSX 指南](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/recipes/xlsx.md) · [企业接入](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/enterprise-integration.md)\n\nSource-available © ChenyCHENYU (Agile Team). 任何使用均须事先取得书面授权。详见 [LICENSE](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSE) 与[授权流程](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSING.md)。\n"
|
|
60
60
|
}
|