PHPExcel API

再续前文,因为考虑如何在 Python 里面读写 Excel,后来研究来研究去,接口根本就不好用,因此干脆用 php 做一个 http 的 api,自己写脚本,于是便有了这个项目:

https://github.com/fish-ball/phpexcel-api

这里面有一个难点在于用 python 去模拟发送一个 multipart/form-data 的表单,经过这个实践,也对 http 的请求响应结构有了更深的了解了。

关于如何使用 python3 发送 multipart/form-data 请求,当时参考的这个最大帮助。

http://www.sharejs.com/codes/python/5088

另外中间遇到了一些编码上面的问题,后面再慢慢做归纳。

下面简单把自己写的文档记录一下:


phpexcel-api

一个 php 处理 excel 的 http api,供其他程序语言调用。

基本架构:

通过 HTTP 提交一个 Post请求,然后返回一个下载 Excel 的响应。

可以通过一个如下的表单来模拟这个请求:

<form action="xlsapi/index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="template" />
    <textarea name="data"></textarea>
    <input type="submit" />
</form>

请求方式是 multipart/form-data,同时提交表单数据以及附件。

因此,请求头应当符合如下格式,这一点请自行参见 multipart/form-data 请求的实现方法:

[Request Headers]
Content-Type: Content-Type:multipart/form-data; boundary=BOUNDER_STRING

因此,POST 的请求体里面包括两个主要的部分:

  1. $_FILE[‘template’]: 用于作为模板的 excel 文件,然后通过。(缺省为空 xls 文件)
  2. $_POST[‘data’]: 用于传递填充模板的“脚本”,具体语法后面会进行叙述。

另外,配置参数通过 $_POST[‘config’] 提供 json 的配置字典,用于覆盖 config 的默认值。

具体配置参数后面会提到。

请求发出之后,本接口会打开模板 xls 文件,然后顺着脚本内容填充数据,最后返回一个响应下载 xls。

具体的响应头形如:

[Response Headers]
Content-Disposition: attachment; filename="excel.xls"
Content-Type: application/vnd.ms-excel

注意两点:

  1. 如果上传的模板文件是 xlsx 的 2007 格式,响应回来的格式会是 xlsx,否则为 xls;
  2. 返回的文件名是配置的文件名,缺省为模板的文件名,如模板缺省,则为 excel.xls。

填充脚本

本 api 的运作步骤如下:

  1. 打开一个模板文件,转到第一个 WorkSheet;
  2. 根据配置项row_delimeter分割脚本行,每行一个脚本命令;
  3. 根据配置项col_delimeter分割每个脚本命令,得到命令参数 args;
  4. 执行命令,args 第一个参数为命令名称,后面的是命令参数;

脚本命令

选择 WorkSheet SELECT_WORKSHEET [OK]

  • index: 选择 worksheet 的序号(从 0 开始)

例如下面的例子会当前活动的 worksheet 选择为第二个(下标为 1)

SELECT_WORKSHEET|1

填充单元格 FILL [OK]

  • cell: 单元格位置,例如 A1
  • content: 填充到该单元格的内容

下面的例子会将今天天气很好,我们去割草。这句话填充到 A1 单元格中:

FILL|A1|今天天气很好,我们去割草

填充单元格(根据坐标) FILL2 [OK]

  • col: 列坐标,从 0 起算
  • row: 行坐标,从 1 起算
  • content: 填充到该单元格的内容

例如,3-4 坐标对应的是 D4 单元格,下面例子将$5.25填写进 D4 单元格中:

FILL2|3|4|$5.25

合并单元格 MERGE [未实现]

  • begin: 选取区域的开始单元格
  • end: 选取区域的结束单元格

例如,下面的例子会将 A1-D3 这 12 个单元格合并:

MERGE|A1|D3

调整区域样式 STYLE [未实现]

  • begin: 选取区域的开始单元格
  • end: 选取区域的结束单元格
  • style: 加粗 BOLD / 斜体 ITALIC / 下划线 UNDERLINE,如果是取消对应的样式,在前面加~符号

例如,下面的例子会将 A2 单元格加粗显示:

STYLE|A2|A2|BOLD

下面的例子取消 A1-F100 范围内所有的加粗效果:

STYLE|A1|F100|~BOLD

调整字号 FONT_SIZE [未实现]

  • begin: 选取区域的开始单元格
  • end: 选取区域的结束单元格
  • size: 字号,用数字表示

例如下面的例子会将 A1 单元格字号调成 16

FONT_SIZE|A1|A1|16

调整单元格是否自动换行 WRAP_TEXT [未生效]

  • begin: 选取区域的开始单元格
  • end: 选取区域的结束单元格
  • wrap: 0 不换行,1 换行

例如下面的例子会将 A1 单元格设置成自动换行

FILL|A1|this cell\nhas multline values
WRAP_TEXT|A1|A1|1

设置单元格超链接 SET_URL [OK]

  • cell: 单元格位置,例如 A1
  • url: 设置单元格链接到的 url

例如下面的例子会给 A1 单元格添加到百度的链接

SET_URL|A1|http://www.baidu.com/

【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/11/php-excel-api.html【PHPExcel API】

发表评论

电子邮件地址不会被公开。 必填项已用*标注