"Serverless" Functions

由于该库是纯JS,读写文件的艰苦工作可以在客户端浏览器或服务器端进行。在服务器端,机械过程基本上是独立于数据解析或生成的。因此,有时明智的做法是组织应用程序,使JSON数据和电子表格文件之间的 "最后一英里 "转换独立于主应用程序。

直截了当的架构会将JSON数据转换分割成一个单独的微服务或应用程序。由于只有在请求导入或导出时才需要它,而且这个过程本身相对独立于典型服务的其他部分,所以 "无服务器 "架构是非常合适的。由于 "功能 "与应用程序的其他部分分开,它可以被集成到用Java或Go或Python或其他语言构建的平台中

这个演示讨论了一般的架构,并为流行的商业系统和自我托管的替代方案提供了例子。这些例子只是为了演示非常基本的功能。

Simple Strategies

Data Normalization

大多数编程语言和平台都可以处理 CSV 或 JSON,但不能直接使用 XLS 或 XLSX 或 XLSB。可以解析来自 HTTP POST 请求的表单数据,并且可以将包含的文件转换为 CSV 或 JSON。 XLSX.stream.to_csv 实用程序可以将行流式传输到标准 HTTP 响应。 XLSX.utils.sheet_to_json 可以生成一组对象,这些对象可以提供给另一个服务。

在最简单的层面上,文件系统上的一个文件可以使用NodeJS包中的bin脚本进行转换。

$ xlsx /path/to/uploads/file > /tmp/new_csv_file

从一个实用的脚本中,工作簿可以用两行来转换。

var workbook = XLSX.readFile("path/to/file.xlsb");
XLSX.writeFile(workbook, "output/path/file.csv");

Report Generation

对于已经生成 JSON 或 CSV 或 HTML 输出的现有平台,该库可以处理数据并生成带有修饰的新文件。XLSX.utils.sheet_add_json和 XLSX.utils.sheet_add_json XLSX.utils.sheet_add_aoa 到现有工作表:

var ws = XLSX.utils.aoa_to_sheet([
	["Company Report"],
	[],
	["Item", "Cost"]
]);
XLSX.utils.sheet_add_json(ws, [
	{ item: "Coffee", cost: 5 },
	{ item: "Cake", cost: 20 }
], { skipHeader: true, origin: -1, header: ["item", "cost"] });

Deployment Targets

0.8 开始的 Node 版本以及无数与 ES3 和 ES5 兼容的 JS 引擎都支持该库。所有主要服务都使用主要版本 4 之后的 Node 版本,因此在这些环境中直接使用该库应该没有问题。

请注意,大多数云提供商会主动将表单数据转换为 UTF8 字符串。这在处理 XLSX 和 XLSB 文件时尤其成问题,因为它们自然包含不是有效的 UTF8 字符的代码。因此,这些演示仅专门处理 Base64 编码的文件。要在命令行上进行测试,请在管道到 curl 之前使用 base64 工具对数据进行编码:

base64 test.xlsb | curl -F "data=@-;filename=test.xlsb" http://localhost/

AWS Lambda

通过 AWS Gateway API,可以在 HTTP 请求上触发 Lambda 函数。LambdaProxy示例从表单数据 LambdaProxy 读取文件并转换为 CSV。

在 AWS 上部署时,请务必在本地 npm install 模块包含在 ZIP 文件中。

读取表单数据时,请务必在 AWS API Gateway 控制台中包含必要的二进制类型。为此,请导航到控制台设置选项卡中的“二进制媒体类型”部分。要读取文件,您可能需要添加 "multipart/form-data" 。要下载文件,您可能需要添加 "application/vnd.ms-excel"

Azure Functions

Azure 支持多种类型的触发器。AzureHTTPTrigger显示了将提交的文件转换为 CSV 的示例 HTTP 触发器 AzureHTTPTrigger

在Azure上部署时,一定要从远程控制台安装模块,如 "Azure Functions JavaScript开发者指南 "中所述。

Firebase Functions

Firebase 函数可以通过 HTTP 请求触发,类似于 REST API。在 Firebase 目录中,示例函数读取通过 HTTP 发送的文件并将其转换为 CSV,并以字符串的形式发送响应。

要在本地运行此演示,请运行 npm i -g firebase-tools 安装 Firebase CLI 并 npm i 安装依赖项,然后 firebase use --add 连接到现有 Firebase 项目。运行 firebase emulators:start 以启动本地服务器。