Excel Reader
Excel Reader 插件实现了从 Microsoft Excel 文件读取数据的能力。
配置
获取样例文件
从这里下载用于演示的 Excel 压缩文件,并解压缩放置到 /tmp/in 目录下。 三个文件夹的内容相同,其中
demo.xlsx是 Excel 新格式demo_old.xls是 Excel 老格式demo_gbk.xlsx是在 Windows 下创建,已 GBK 编码存储的文件
文件内容,如下表所示:
| 编号 | 整数类型 | 浮点数类型 | 字符串类型 | 日期类型 | 公式计算 | 单元格式化 |
|---|---|---|---|---|---|---|
| 1 | 11 | 1102.234 | Addax 加上中文 | 2021/9/10 | 5544.17 | ¥1,102.23 |
| 2 | 12 | 1103.234 | Addax 加上中文 | 2021/9/11 | 5552.17 | ¥1,103.23 |
| 3 | 13 | 1104.234 | Addax 加上中文 | 2021/9/12 | 5560.17 | ¥1,104.23 |
| 4 | 14 | 1105.234 | Addax 加上中文 | 2021/9/13 | 5568.17 | ¥1,105.23 |
| 5 | 15 | 1106.234 | Addax 加上中文 | 2021/9/14 | 5576.17 | ¥1,106.23 |
| 6 | 16 | 1107.234 | Addax 加上中文 | 2021/9/15 | 5584.17 | ¥1,107.23 |
| 7 | 17 | 1108.234 | Addax 加上中文 | 2021/9/16 | 5592.17 | ¥1,108.23 |
| 8 | 18 | 1109.234 | Addax 加上中文 | 2021/9/17 | 5600.17 | ¥1,109.23 |
| 9 | 19 | 1110.234 | Addax 加上中文 | 2021/9/18 | 5608.17 | ¥1,110.23 |
| 10 | 20 | 1111.234 | Addax 加上中文 | 2021/9/19 | 5616.17 | ¥1,111.23 |
| 11 | 21 | 1112.234 | Addax 加上中文 | 2021/9/20 | 5624.17 | ¥1,112.23 |
| 12 | 22 | 1113.234 | Addax 加上中文 | 2021/9/21 | 5632.17 | ¥1,113.23 |
| 13 | 23 | 1114.234 | Addax 加上中文 | 2021/9/22 | 5640.17 | ¥1,114.23 |
| 14 | 24 | 1115.234 | Addax 加上中文 | 2021/9/23 | 5648.17 | ¥1,115.23 |
| 15 | 25 | 1116.234 | Addax 加上中文 | 2021/9/24 | 5656.17 | ¥1,116.23 |
| 16 | 26 | 1117.234 | Addax 加上中文 | 2021/9/25 | 5664.17 | ¥1,117.23 |
| 17 | 27 | 1118.234 | Addax 加上中文 | 2021/9/26 | 5672.17 | ¥1,118.23 |
| 18 | 28 | 1119.234 | Addax 加上中文 | 2021/9/27 | 5680.17 | ¥1,119.23 |
| 19 | 29 | 1120.234 | Addax 加上中文 | 2021/9/28 | 5688.17 | ¥1,120.23 |
| 20 | 30 | 1121.234 | Addax 加上中文 | 2021/9/29 | 5696.17 | ¥1,121.23 |
表头大致说明了单元数据的特征
创建 job 文件
创建如下 json 文件
{
"job": {
"setting": {
"speed": {
"channel": 2,
"bytes": -1
}
},
"content": {
"reader": {
"name": "excelreader",
"parameter": {
"path": [
"/tmp/in"
],
"header": true,
"skipRows": 0
}
},
"writer": {
"parameter": {
"print": true
},
"name": "streamwriter"
}
}
}
}将输出内容存保为到 job/excel2stream.json 文件中,执行采集命令:
$ bin/addax.sh job/excel2stream.json如果没有报错,应该得到如下输出:
Details
2026-09-22 10:37:24.324 [ main] INFO Engine -
___ _ _
/ _ \ | | | |
/ /_\ \ __| | __| | __ ___ __
| _ |/ _` |/ _` |/ _` \ \/ /
| | | | (_| | (_| | (_| |> <
\_| |_/\__,_|\__,_|\__,_/_/\_\
:: Addax version :: (v6.1.1-SNAPSHOT)
2026-09-22 10:37:24.451 [ main] INFO Engine -
{
"setting":{
"speed":{
"channel":2,
"bytes":-1
}
},
"content":{
"reader":{
"name":"excelreader",
"parameter":{
"path":[
"/tmp/in"
],
"header":true,
"skipRows":0
}
},
"writer":{
"parameter":{
"print":true
},
"name":"streamwriter"
}
}
}
2026-09-22 10:37:24.466 [ main] INFO JobContainer - The jobContainer begins to process the job.
2026-09-22 10:37:24.472 [ job-0] INFO FileHelper - Total source files to process: 3
2026-09-22 10:37:24.472 [ job-0] INFO ExcelReader$Job - The number of files to read is: [3]
2026-09-22 10:37:24.473 [ job-0] INFO JobContainer - The Reader.Job [excelreader] perform prepare work .
2026-09-22 10:37:24.473 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] perform prepare work .
2026-09-22 10:37:24.474 [ job-0] INFO JobContainer - Job set Channel-Number to 2 channel(s).
2026-09-22 10:37:24.474 [ job-0] INFO JobContainer - The Reader.Job [excelreader] is divided into [2] task(s).
2026-09-22 10:37:24.474 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] is divided into [2] task(s).
2026-09-22 10:37:24.492 [ job-0] INFO JobContainer - The Scheduler launches [1] taskGroup(s).
2026-09-22 10:37:24.494 [ taskGroup-0] INFO TaskGroupContainer - The taskGroupId=[0] started [2] channels for [2] tasks.
2026-09-22 10:37:24.495 [ taskGroup-0] INFO Channel - The Channel set byte_speed_limit to -1, No bps activated.
2026-09-22 10:37:24.496 [ taskGroup-0] INFO Channel - The Channel set record_speed_limit to -1, No tps activated.
2026-09-22 10:37:24.498 [ reader-0-0] INFO ExcelReader$Task - The first row is skipped as a table header
2026-09-22 10:37:24.499 [ reader-0-1] INFO ExcelReader$Task - The first row is skipped as a table header
2026-09-22 10:37:24.499 [ reader-0-0] INFO ExcelReader$Task - Begin to read file /tmp/in/demo_gbk.xlsx
2026-09-22 10:37:24.499 [ reader-0-1] INFO ExcelReader$Task - Begin to read file /tmp/in/demo_old.xls
2026-09-22T02:37:24.526709Z reader-0-0 ERROR Log4j API could not find a logging provider.
2026-09-22 10:37:24.623 [ reader-0-1] INFO XlsDomHelper - Read sheet [Sheet1] of /tmp/in/demo_old.xls
2026-09-22 10:37:24.676 [ reader-0-0] INFO XlsxStreamHelper - Read sheet [Sheet1] of /tmp/in/demo_gbk.xlsx
2026-09-22 10:37:24.689 [ reader-0-0] INFO ExcelReader$Task - Begin to read file /tmp/in/demo.xlsx
2026-09-22 10:37:24.701 [ reader-0-0] INFO XlsxStreamHelper - Read sheet [Sheet1] of /tmp/in/demo.xlsx
1 11 1102.234 Addax加上中文 2021-09-10 00:00:00 5544.17 1102.234
1 11 1102.234 Addax加上中文 2021-09-10 00:00:00 5544.17 1102.234
1 12 1103.234 Addax加上中文 2021-09-11 00:00:00 5552.17 1103.234
2 12 1103.234 Addax加上中文 2021-09-11 00:00:00 5552.17 1103.234
1 13 1104.234 Addax加上中文 2021-09-12 00:00:00 5560.17 1104.234
3 13 1104.234 Addax加上中文 2021-09-12 00:00:00 5560.17 1104.234
1 14 1105.234 Addax加上中文 2021-09-13 00:00:00 5568.17 1105.234
4 14 1105.234 Addax加上中文 2021-09-13 00:00:00 5568.17 1105.234
1 15 1106.234 Addax加上中文 2021-09-14 00:00:00 5576.17 1106.234
5 15 1106.234 Addax加上中文 2021-09-14 00:00:00 5576.17 1106.234
1 16 1107.234 Addax加上中文 2021-09-15 00:00:00 5584.17 1107.234
6 16 1107.234 Addax加上中文 2021-09-15 00:00:00 5584.17 1107.234
1 17 1108.234 Addax加上中文 2021-09-16 00:00:00 5592.17 1108.234
7 17 1108.234 Addax加上中文 2021-09-16 00:00:00 5592.17 1108.234
1 18 1109.234 Addax加上中文 2021-09-17 00:00:00 5600.17 1109.234
8 18 1109.234 Addax加上中文 2021-09-17 00:00:00 5600.17 1109.234
1 19 1110.234 Addax加上中文 2021-09-18 00:00:00 5608.17 1110.234
9 19 1110.234 Addax加上中文 2021-09-18 00:00:00 5608.17 1110.234
1 20 1111.234 Addax加上中文 2021-09-19 00:00:00 5616.17 1111.234
10 20 1111.234 Addax加上中文 2021-09-19 00:00:00 5616.17 1111.234
1 21 1112.234 Addax加上中文 2021-09-20 00:00:00 5624.17 1112.234
11 21 1112.234 Addax加上中文 2021-09-20 00:00:00 5624.17 1112.234
1 22 1113.234 Addax加上中文 2021-09-21 00:00:00 5632.17 1113.234
12 22 1113.234 Addax加上中文 2021-09-21 00:00:00 5632.17 1113.234
1 23 1114.234 Addax加上中文 2021-09-22 00:00:00 5640.17 1114.234
13 23 1114.234 Addax加上中文 2021-09-22 00:00:00 5640.17 1114.234
1 24 1115.234 Addax加上中文 2021-09-23 00:00:00 5648.17 1115.234
14 24 1115.234 Addax加上中文 2021-09-23 00:00:00 5648.17 1115.234
1 25 1116.234 Addax加上中文 2021-09-24 00:00:00 5656.17 1116.234
15 25 1116.234 Addax加上中文 2021-09-24 00:00:00 5656.17 1116.234
1 26 1117.234 Addax加上中文 2021-09-25 00:00:00 5664.17 1117.234
16 26 1117.234 Addax加上中文 2021-09-25 00:00:00 5664.17 1117.234
1 27 1118.234 Addax加上中文 2021-09-26 00:00:00 5672.17 1118.234
17 27 1118.234 Addax加上中文 2021-09-26 00:00:00 5672.17 1118.234
1 28 1119.234 Addax加上中文 2021-09-27 00:00:00 5680.17 1119.234
18 28 1119.234 Addax加上中文 2021-09-27 00:00:00 5680.17 1119.234
1 29 1120.234 Addax加上中文 2021-09-28 00:00:00 5688.17 1120.234
19 29 1120.234 Addax加上中文 2021-09-28 00:00:00 5688.17 1120.234
1 30 1121.234 Addax加上中文 2021-09-29 00:00:00 5696.17 1121.234
20 30 1121.234 Addax加上中文 2021-09-29 00:00:00 5696.17 1121.234
1 11 1102.234 Addax加上中文 2021-09-10 00:00:00 5544.17 1102.234
2 12 1103.234 Addax加上中文 2021-09-11 00:00:00 5552.17 1103.234
3 13 1104.234 Addax加上中文 2021-09-12 00:00:00 5560.17 1104.234
4 14 1105.234 Addax加上中文 2021-09-13 00:00:00 5568.17 1105.234
5 15 1106.234 Addax加上中文 2021-09-14 00:00:00 5576.17 1106.234
6 16 1107.234 Addax加上中文 2021-09-15 00:00:00 5584.17 1107.234
7 17 1108.234 Addax加上中文 2021-09-16 00:00:00 5592.17 1108.234
8 18 1109.234 Addax加上中文 2021-09-17 00:00:00 5600.17 1109.234
9 19 1110.234 Addax加上中文 2021-09-18 00:00:00 5608.17 1110.234
10 20 1111.234 Addax加上中文 2021-09-19 00:00:00 5616.17 1111.234
11 21 1112.234 Addax加上中文 2021-09-20 00:00:00 5624.17 1112.234
12 22 1113.234 Addax加上中文 2021-09-21 00:00:00 5632.17 1113.234
13 23 1114.234 Addax加上中文 2021-09-22 00:00:00 5640.17 1114.234
14 24 1115.234 Addax加上中文 2021-09-23 00:00:00 5648.17 1115.234
15 25 1116.234 Addax加上中文 2021-09-24 00:00:00 5656.17 1116.234
16 26 1117.234 Addax加上中文 2021-09-25 00:00:00 5664.17 1117.234
17 27 1118.234 Addax加上中文 2021-09-26 00:00:00 5672.17 1118.234
18 28 1119.234 Addax加上中文 2021-09-27 00:00:00 5680.17 1119.234
19 29 1120.234 Addax加上中文 2021-09-28 00:00:00 5688.17 1120.234
20 30 1121.234 Addax加上中文 2021-09-29 00:00:00 5696.17 1121.234
2026-09-22 10:37:27.497 [ job-0] INFO AbstractScheduler - The scheduler has completed all tasks.
2026-09-22 10:37:27.499 [ job-0] INFO JobContainer - The Writer.Job [streamwriter] perform post work.
2026-09-22 10:37:27.499 [ job-0] INFO JobContainer - The Reader.Job [excelreader] perform post work.
2026-09-22 10:37:27.511 [ job-0] INFO StandAloneJobContainerCommunicator - Total 60 records, 3360 bytes | Speed 1.09KB/s, 20 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.346s | Percentage 100.00%
2026-09-22 10:37:27.514 [ job-0] INFO JobContainer -
Job start at : 2026-09-22 10:37:24
Job end at : 2026-09-22 10:37:27
Job took secs : 3s
Total bytes : 3360
Average bps : 1.09KB/s
Average rps : 20rec/s
Number of rec : 60
Failed record : 0参数说明
| 配置项 | 是否必须 | 类型 | 默认值 | 描述 |
|---|---|---|---|---|
| path | 是 | string/list | 无 | 指定要读取的文件夹,可以指定多个 |
| header | 否 | boolean | false | 文件是否包含头 |
| skipRows | 否 | int | 0 | 要跳过前多少行 |
| sheetIndex | 否 | int | 0 | 要读取的 sheet 序号,从 0 开始 |
| sheetName | 否 | string | 无 | 要读取的 sheet 名称,不要和 sheetIndex 同时使用 |
| trim | 否 | boolean | true | 是否去除字符串单元格两端的空白 |
header
Excel 文件是否包含头,如果包含,则跳过
skipRows
指定要跳过的行数, 默认为 0,表示不跳过。这里要注意的是,假定 设置了 header 为 true,同时设置 skipRows 为 2。则表示前三行都跳过。 如果 header 为 false, 则表示跳过前两行。
sheetIndex / sheetName
默认只读取第一个 sheet,sheetIndex 从 0 开始计数,sheetName 按名字指定,两者不要同时设置。 当文件包含多个 sheet 而作业没有指定时,插件会输出一条告警,说明只读取了哪一个。
trim
是否去除文本单元格两端的空白,默认为 true。Excel 中的文本经常带有肉眼看不见的空格, 默认会一并去掉;需要保留原始文本时设置为 false。
去除的是 Unicode 空白;不换行空格(U+00A0)属于字符而不是空白,两种设置下都会保留。
空值与公式
- 没有值的单元格——空白、空字符串、错误值(
#DIV/0!之类)以及被跳过的单元格——都读取为NULL,不会是空字符串 - 每条记录的列数与最宽的一行对齐,中间缺失的单元格补
NULL,因此列不会错位 - 公式单元格读取的是 Excel 保存在文件里的计算结果。如果文件由程序生成(openpyxl、POI 等)而没有保存结果,公式列会读成
NULL并给出告警,用 Excel 打开并保存一次即可 - 列数以表头行(
header为true时)或第一个数据行为准,后续更宽的行会按实际列数输出并告警一次
支持的数据类型
Excel 读取功能的实现依赖于 Apache POI 项目,该实现对单元格的数据类型定义很宽泛。 仅定义了布尔型(Boolean),数值型 (Double),字符串型(String) 三种。其中数值型包括所有整数,小数和日期。 目前对于数值类型做了简单区分
- 使用库工具类探测是否为日期类型,如果是,则判断为日期类型
- 将数值转换为长整形,并和原值比较,如果大小相等,则判断为长整型(Long)
- 否则判断为浮点型(Double)
内存占用
xlsx 采用流式读取,只保留正在处理的一行,内存占用与文件大小无关;xls 因为格式本身 限制(最多 65536 行)采用一次性载入,内存占用有上限。
限制
- 暂不支持指定列读取
- 暂不支持跳过尾部行数(比如有总结的尾行可能并不符合要求)
- 不支持加密(口令保护)的工作簿,遇到会直接报错
- 目录下的文件按内容识别(ZIP / OLE2 魔数),不是 Excel 的文件会被跳过并给出告警; 后缀不对但内容是工作簿的文件同样能读取