Skip to content

Excel Reader ​

Excel Reader 插件实现了从 Microsoft Excel 文件读取数据的能力。

配置 ​

获取样例文件 ​

从这里下载用于演示的 Excel 压缩文件,并解压缩放置到 /tmp/in 目录下。 三个文件夹的内容相同,其中

  • demo.xlsx 是 Excel 新格式
  • demo_old.xls 是 Excel 老格式
  • demo_gbk.xlsx 是在 Windows 下创建,已 GBK 编码存储的文件

文件内容,如下表所示:

编号整数类型浮点数类型字符串类型日期类型公式计算单元格式化
1111102.234Addax 加上中文2021/9/105544.17¥1,102.23
2121103.234Addax 加上中文2021/9/115552.17¥1,103.23
3131104.234Addax 加上中文2021/9/125560.17¥1,104.23
4141105.234Addax 加上中文2021/9/135568.17¥1,105.23
5151106.234Addax 加上中文2021/9/145576.17¥1,106.23
6161107.234Addax 加上中文2021/9/155584.17¥1,107.23
7171108.234Addax 加上中文2021/9/165592.17¥1,108.23
8181109.234Addax 加上中文2021/9/175600.17¥1,109.23
9191110.234Addax 加上中文2021/9/185608.17¥1,110.23
10201111.234Addax 加上中文2021/9/195616.17¥1,111.23
11211112.234Addax 加上中文2021/9/205624.17¥1,112.23
12221113.234Addax 加上中文2021/9/215632.17¥1,113.23
13231114.234Addax 加上中文2021/9/225640.17¥1,114.23
14241115.234Addax 加上中文2021/9/235648.17¥1,115.23
15251116.234Addax 加上中文2021/9/245656.17¥1,116.23
16261117.234Addax 加上中文2021/9/255664.17¥1,117.23
17271118.234Addax 加上中文2021/9/265672.17¥1,118.23
18281119.234Addax 加上中文2021/9/275680.17¥1,119.23
19291120.234Addax 加上中文2021/9/285688.17¥1,120.23
20301121.234Addax 加上中文2021/9/295696.17¥1,121.23

表头大致说明了单元数据的特征

创建 job 文件 ​

创建如下 json 文件

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 文件中,执行采集命令:

bash
$ bin/addax.sh job/excel2stream.json

如果没有报错,应该得到如下输出:

Details
txt
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否booleanfalse文件是否包含头
skipRows否int0要跳过前多少行
sheetIndex否int0要读取的 sheet 序号,从 0 开始
sheetName否string无要读取的 sheet 名称,不要和 sheetIndex 同时使用
trim否booleantrue是否去除字符串单元格两端的空白

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) 三种。其中数值型包括所有整数,小数和日期。 目前对于数值类型做了简单区分

  1. 使用库工具类探测是否为日期类型,如果是,则判断为日期类型
  2. 将数值转换为长整形,并和原值比较,如果大小相等,则判断为长整型(Long)
  3. 否则判断为浮点型(Double)

内存占用 ​

xlsx 采用流式读取,只保留正在处理的一行,内存占用与文件大小无关;xls 因为格式本身 限制(最多 65536 行)采用一次性载入,内存占用有上限。

限制 ​

  1. 暂不支持指定列读取
  2. 暂不支持跳过尾部行数(比如有总结的尾行可能并不符合要求)
  3. 不支持加密(口令保护)的工作簿,遇到会直接报错
  4. 目录下的文件按内容识别(ZIP / OLE2 魔数),不是 Excel 的文件会被跳过并给出告警; 后缀不对但内容是工作簿的文件同样能读取