一个用于导出Excel数据的工具。
根据模板导出Excel数据。支持多种数据格式和任何一种编程语言。支持多操作系统。
中文 | English
go 1.16.15
可以通过以下两种方式获取到ExcelExporter工具:
- 下载相应平台的执行文件。
- 下载环境配置
下载github源码仓库进行编译。 步骤如下:
- 执行如下命令,获取源代码仓库工程。
go get -u github.com/xuzhuoxi/ExcelExporter
- 编译工程。
- Windows下执行goxc_build.bat
- Linux或MacOS下执行goxc_build.sh
ExcelExporter -env=%env% -mode=title,data,const,proto -range=client,server,db -lang=as3,c#,go,java,ts -file=json,bin,sql -merge=false -source==源路径 -target=导出路径
示例:
- 导出client范围下的表头与数据,使用的编程语言的c#,数据文件导出为json.
ExcelExporter -mode=client range=client -lang=c# -file=json
- 导出db范围下的sql表脚本以及sql数据脚本,并合并
ExcelExporter -mode=title,data -range=db -file=sql -merge=true
- 导出client范围下的常量表及协议表文件,使用编程语言为go。
ExcelExporter -mode=const,proto -range=client -lang=go
-
-env
- 作用:重新指定环境配置。
- 可选:不指定则使用执行文件目录下的环境配置
-
-mode *
- 作用:指定运行的模式,多个模式可用英文逗号","分隔
- 支持:
- title:
表头导出
后续参数要求:-range、-lang、-file、-merge - data:
数据导出
后续参数要求:-range、-file、-merge - const:
常量表导出
后续参数要求:-range、-lang - proto:
协议表导出
后续参数要求:-range、-lang
- title:
-
-range *
- 作用:指定表头或数据导出时字段范围或过滤协议
- 支持值:client, server, db
- 适用模式:title、data、const、proto
- title、data
指定表头或数据导出时字段范围。
指定导出文件的关联目录。 - const 指定导出文件的关联目录。
- proto 选择要导出的协议表。 指定导出文件的关联目录。
- title、data
指定表头或数据导出时字段范围。
-
-lang *
- 作用:指定相关的编译语言,多个可用英文逗号","分隔
- 支持值:as3、c#、go、java、ts
- 适用模式:title、const、proto
-
-file
- 作用:指定导出的数据文件的格式类型,多个可用英文逗号","分隔
- 支持值:json、bin、sql
- 未完善的支持值: yaml, toml, hcl, env, properties
- 适用模式:title、data
-
-merge
- 作用:当-file包含sql时,指定导出的sql脚本是否合并。默认flase。
- 支持值:true、false
-
-source
- 作用:指定运行时的Excel表来源目录,用于覆盖配置文件project.yaml中source.value的值
- 适用模式:title、data、const、proto
-
-target
- 作用:指定运行时的文件产出目录,用于覆盖配置文件project.yaml中target.value的值
- 适用模式:title、data、const、proto
.配置根目录
├── db: 数据库相关配置与sql模板
│ ├── mysql.yaml: mysql信息配置
│ ├── mysql_table.temp: mysql建表模板
│ ├── mysql_data.temp: mysql插入数据模板
│ ├── ...: 其它扩充
├── lang: 编程语言相关配置
│ ├── as3.yaml: 针对ActionScript3,不同数据文件下各基础数据类型的读写语法配置
│ ├── c#.yaml: 针对c#,不同数据文件下各基础数据类型的读写语法配置
│ ├── c++.yaml: 针对c++,不同数据文件下各基础数据类型的读写语法配置
│ ├── go.yaml: 针对golang,不同数据文件下各基础数据类型的读写语法配置
│ ├── java.yaml: 针对java,不同数据文件下各基础数据类型的读写语法配置
│ ├── ts.yaml: 针对typescript,不同数据文件下各基础数据类型的读写语法配置
│ ├── ...: 其它编程语言下,不同数据文件下各基础数据类型的读写语法配置
├── proxy: 代理代码集(非必要)
│ ├── as: ActionScript3相关的代理代码集
│ ├── go: golang相关的代理代码集
│ ├── java: java相关的代理代码集
│ ├── ts: TypeScript相关的代理代码集
│ ├── ...: 其它编程语言相关的代理代码集
├── templates: 模板文件目录,只支持golang模板语法
│ ├── as3_const.temp: ActionScript3语言下,常量定义模板
│ ├── as3_proto.temp: ActionScript3语言下,协议定义模板
│ ├── as3_title.temp: ActionScript3语言下,Title定义模板
│ ├── c#_const.temp: C#语言下,常量定义模板
│ ├── c#_proto.temp: C#语言下,协议定义模板
│ ├── c#_title.temp: C#语言下,Title定义模板
│ ├── go_const.temp: golang语言下,常量定义模板
│ ├── go_proto.temp: golang语言下,协议定义模板
│ ├── go_title.temp: golang语言下,Title定义模板
│ ├── java_const.temp: java语言下,常量定义模板
│ ├── java_proto.temp: java语言下,协议定义模板
│ ├── java_title.temp: java语言下,Title定义模板
│ ├── ts_const.temp: TypeScript语言下,常量定义模板
│ ├── ts_proto.temp: TypeScript语言下,协议定义模板
│ ├── ts_title.temp: TypeScript语言下,Title定义模板
│ ├── ...: 其它语言下,常量定义模板与Title定义模板
├── source: 默认Excel文件存放目录
├── target: 默认Excel文件存放目录
├── excel.yaml: Excel的表头配置,包括数据表头配置、常量表头配置
├── project.yaml: 项目配置,包括数据源配置、数据输出配置、缓冲配置、大小端配置等
├── system.yaml: 应用配置,包括支持的编程语言配置(扩展名、读写配置、模板关联等)、数据字段类型配置、数据文件配置等
4.2 System配置
负责基本功能相关的配置:system.yaml
- 编程语言信息配置
- 扩展名配置
- 数据类型读写行为配置
- 相关导出模板配置
- 数据库信息配置
- 数据库字段类型映射文件配置
- 数据库建表脚本的模板配置
- 数据库数据脚本的模板配置
- 基础数据类型配置
- 导出数据文件格式配置
以下几种情况,你应该修改 system.yaml
- 扩展或修改编程语言
- 扩展或修改数据库
- 扩展要支持基础数据类型
- 扩展要支持的数据文件格式
4.3 Project配置
负责项目相关的配置:project.yaml
- 数据源配置,包括目录、扩展名等
- 导出信息配置,包括:
- 导出根目录配置
- title、data、const、proto模式下针对client、server、db三种字段范围的导出子目录配置
- 导出sql时子目录配置。
- 处理时缓存设置
以下几种情况,你应该修改 project.yaml
- Excle目录不只一个,并希望在同一条命令处理。可以扩展source.value的路径。
- 在命令行中不提供-source参数,又希望自定义excel的源目录,可以修改source.value的路径。
- 希望自定义文件的输入路径,可以修改target内的属性
4.4 Excel配置
负责Excel相关的配置: excel.yaml
- 自定义文件名前缀,用于处理时忽略
- title和data模式下excel表配置
- prefix:启用前缀配置,针对title和data模式加入处理。
- outputs:导出信息配置,针对client、server、db三种范围,在Sheet中的导出信息坐标
- sql:导出信息配置,针对db导出sql文件时,在Sheet中的导出信息坐标
- key: 主键信息坐标
- table: 表名信息坐标
- file: 脚本文件名信息坐标
- control_row:控制行 行号,用于管理字段的处理范围(字段数量)
- nick_row:字段昵称 行号,方便模板中查找指定单元格式信息。
- name_row:字段名称 行号
- remak_row:字段备注 行号
- range_row:字段适用范围 行号, 针对-range参数作匹配
- data_type_row:字段数据类型 行号,适用于system.yaml中的field_datatypes中的值
- sql_data_type_row:用于sql的数据类型 行号
- ext_name_rows:编程语言专用字段名称 行号
- file_key_rows:数据文件专用字段名称 行号
- data_start_axis:数据开始 坐标
- const模式下excel表配置
- prefix:启用前缀,针对const模式加入处理。
- outputs:导出信息,针对client、server两种字段范围,在Sheet中的导出信息坐标
- name_col:常量名 列号
- value_col:常量值 列号
- type_col:常量值类型 列号
- remark_col:常量注释 列号
- data_start_row:开始行号
- proto模式下excel表配置
- prefix:启用前缀,针对proto模式加入处理。
- id_datatype:协议Id的数值类型信息坐标,建议使用int32或string.
- range_name:适用范围信息坐标,针对-range参数作匹配
- namespace:命名空间信息坐标
- export:导出子目录信息坐标
- id_col:Id信息列号
- file_col:导出文件名信息列号
- name_col:导出类名信息列号
- field_start_col:属性开始列号
- data_start_row:协议数据开始行号
- remark_offset:协议备注偏移值
- blank_break:是否空行中断
以下几种情况,你应该修改excel.yaml
- 自定义Excel源目录路径
- 过滤源目标中部分Excel文件,使之不参与处理。
- 调整导出信息所在Sheet中的位置,包括目录、文件名、命名空间等。
以下以go语言作为说明。
- 配置文件位置
- 默认情况下,编程语言的配置位于res/lang目录下。
- 由system.yaml中languages每一项的ref路径进行关联。
- 例如:go语言配置位于res/lang/go.yaml。
- 配置属性说明
- lang_name:语言名称
- data_types::数据类型配置
- name: 数据类型名称
- operates: 数据类型操作方法名
- file_name: 数据文件名
- get: 取值方法
- set: 设值方法
- 在system.ymal中field_datatypes属性包含的类型类型,在配置中data_types中都言配置上。
- 模板文件位置
- 默认情况下,编程语言的配置位于res/template目录下。
- Title模板由 system.yaml 中 languages 每一项的 temps_title 路径进行关联。
- Const模板由 system.yaml 中 languages 每一项的 temps_const 路径进行关联。
- Proto模板由 system.yaml 中 languages 每一项的 temps_proto 路径进行关联。
- 例如go语言模板如下:
- go_const.temp:res/template/go_const.temp
- go_proto.temp:res/template/go_proto.temp
- go_title.temp:res/template/go_title.temp
- golang语法支持下的模板文件,帮助可查看https://golang.google.cn/pkg/text/template/
以下以mysql数据库作为说明。
- 配置文件位置
- 默认情况下,编程语言的配置位于res/db目录下。
- mysql.yaml为数据配置文件,由 system.yaml 中 databases.list.ref 关联。
- 配置属性说明
- db_name: 数据库名称
- scale_char: Char字符比例
- scale_varchar:Varchar字符比例
- types: 数据库数据类型描述
- 模板文件位置
- 默认情况下,编程语言的配置位于res/db目录下。
- mysql_data.temp为数据脚本模板,由 system.yaml 中 databases.list.temps_data 关联。
- mysql_table.temp 为建表脚本模板,由 system.yaml 中 databases.list.temps_table 关联。
- golang语法支持下的模板文件,帮助可查看https://golang.google.cn/pkg/text/template/
- 四种基础导出功能:
- 表头导出,对应命令参数
-mode=title
- [数据导出](# 5.2 数据导出) ,对应命令参数
-mode=data
- [常量表导出](#5.3 常量表导出),对应命令参数
-mode=const
- [协议导出](#5.4 协议导出) ,对应命令参数
-mode=proto
- 表头导出,对应命令参数
- 特殊导出功能:
- [Sql导出](#5.5 Sql导出),对应
-mode=title
或-mode-data
时,-fiel=sql
- [Sql导出](#5.5 Sql导出),对应
把Excel文件中的表头信息导出为对应语言的数据结构或类
- 遍历源目录中每一个符合的Excel文件。
- 源目录由project.yaml中的soruce.value列表给出。
- 可以通过-source参数重新指定源目录。
- 根据project.yaml中soruce.ext_name列表进行匹配。
- 遍历Excel文件中匹配的的Sheet。
- 根据excel.yaml中的title&data.prefix属性进行匹配。
- 根据-range参数选择对应字段列表。
- -range参数支持client,server,db三种类型,详细请查看。
- 根据-lang参数,选择对应语言的配置及导出模板。
- -lang参数支持go, as3, ts, java, c#,详细请查看。
- 字段列表 => 数据结构或类的字段或属性。
- 相应文件全生成到目标目录中。
- 目标根目录由project.yaml中的target.root列表给出。
- 表头输出目录中project.yaml中的target.title给出,为target.root的相对路径。
- 可以通过-target参数重新指定源目录。
- 根据-range参数的内容,文件分别生成到project.yaml中target.title.client、target.title.server、target.title.database对应的目录中去。
-
注入的数据对象为 *TempTitelProxy
-
常用于模板的公开属性或函数:
- Excel : *excel.ExcelProxy 当前执行的Excel数据代理对象
- Sheet : *excel.ExcelSheet
当前执行的Sheet数据对象 - TitleCtx : *TitleContext
当前执行的表头上下文数据 - FileName : string
表头导出类文件名 - ClassName : string
表头导出类名 - Namespace : string
表头导出类命名空间 - FieldIndex : []int
当前选中的字段索引 - ValueAtAxis : string
取当前Sheet上指定单元格的值 - GetFields : []TitleFieldItem
取得字段信息数组
-
由 GetFields 获的字段对象为 [TitleFieldItem]((/src/core/context_title.go)
-
常用于模板的公开属性或函数
- Index : int 字段索引
- TitleName : string
字段名称:Excel原始值 - TitleRemark : string
字段描述:Excel原始值 - FieldLangName : string
字段名称:编程语言值 - OriginalType : string
字段数据类型:原始值 - FormattedType : string
字段数据类型:格式化值 - LangType : string 字段数据类型:编程语言值
- LangTypeDefine: setting.LangDataType 字段数据类型:编程语言定义
-
[自定义函数](#5.6.1 自定义函数)
- 支持的数据导出格式:bin(二进制), json, sql。
- yaml, toml, hcl, env, properties数据导出时,字段名称会强制处理为小写,本意要求大小写相关,默认不开放
- 要开放yaml等数据导出,请修改system.yaml文件,在"datafiel_formats"列表中补充。
- 遍历源目录中每一个符合的Excel文件。
- 源目录由project.yaml中的soruce.value列表给出。
- 可以通过-source参数重新指定源目录。
- 根据project.yaml中soruce.ext_name列表进行匹配。
- 遍历Excel文件中匹配的的Sheet。
- 根据excel.yaml中的const.prefix属性进行匹配。
- 根据excel.yaml中的name_col、value_col、type_col、remark_col, 定位常量的名称、值、类型、注释。
- 根据excel.yaml中的data_start_row开始向下描述数据,直到最后一行结束,遇空行忽略。
- 根据-lang参数,选择对应语言的配置及导出模板。
- -lang参数支持go, as3, ts, java, c#,详细请查看。
- 相应文件全生成到目标目录中。
- 目标根目录由project.yaml中的target.root列表给出。
- 常量表输出目录中project.yaml中的target.const给出,为target.root的相对路径。
- 可以通过-target参数重新指定根目录。
- 根据-range参数的内容,文件分别生成到project.yaml中target.const.client、target.const.server对应的目录中去。
-
注入的数据对象为*TempConstProxy
-
常用于模板的公开属性或函数:
- Excel : *excel.ExcelProxy
当前执行的Excel数据代理对象 - Sheet : *excel.ExcelSheet
当前执行的Sheet数据对象 - ConstCtx : *ConstContext
当前执行的上下文数据 - FileName : string
导出文件名称 - ClassName : string
导出常量类名 - Namespace : string
导出类名的命名空间名称 - StartRow : int
数据开始行号 - EndRow : int
数据结束行号 - ValueAtAxis : string
取当前Sheet上指定单元格的值 - GetItems : []ConstItem
取得字段信息数组
- Excel : *excel.ExcelProxy
-
由 GetItems 获的字段对象为 [ConstItem]((/src/core/context_const.go)
-
[自定义函数](#5.6.1 自定义函数)
- 遍历源目录中每一个符合的Excel文件。
- 源目录由project.yaml中的soruce.value列表给出。
- 可以通过-source参数重新指定源目录。
- 根据project.yaml中soruce.ext_name列表进行匹配。
- 遍历Excel文件中匹配的的Sheet。
- 根据 excel.yaml 中的 proto.prefix 属性进行匹配。
- 根据 excel.yaml 中的 proto.id_col、proto.field_start_col, 定位协议的Id、开始属性。
- 根据 excel.yaml 中的 proto.data_start_row 开始向正描述数据,直到遇到空行结束。
- 根据-lang参数,选择对应语言的配置及导出模板。
- -lang参数支持go, as3, ts, java, c#,详细请查看。
- 相应文件全生成到目标目录中。
- 目标根目录由project.yaml中的target.root列表给出。
- 常量表输出目录中project.yaml中的target.proto给出,为target.root的相对路径。
- 可以通过-target参数重新指定根目录。
- 根据-range参数的内容,文件分别生成到project.yaml中target.prot.client、target.proto.server对应的目录中去。
-
注入的数据对象为*TempProtoProxy
-
常用于模板的公开属性或函数:
- ProtoItem : *ProtoItem
当前执行的Excel数据代理对象
- SheetProxy : *ProtoSheetProxy
当前执行的Sheet数据对象 - ValueAtAxis : string
取当前Sheet上指定单元格的值 - Namespace : string
导出类的命名空间名称 - ProtoId : string
协议Id - ProtoIdDataType : string
协议Id对应的数据类型 - ClassName : string
导出类名 - ClassRemark : string
导出类名 - GetFields : []ProtoFieldItem
取得字段信息数组
- ProtoItem : *ProtoItem
-
由 GetItems 获的字段对象为 [ProtoFieldItem]((/src/core/context_const.go)
-
常用于模板的公开属性或函数
- Remark : int
备注 - Name : string
属性Key:Excel配置值 - Lang: string
当前处理中的编程语言 - OriginalType : string
属性数据类型:原始值 - FormattedType : string
属性数据类型:格式化值 - IsPointer: bool
是否为指针类型 - IsArray: bool
是否为数组类型 - ArraySize: int
数组长度,非数组或非固定长度时为-1 - LangType : string
属性数据类型:编程语言值 - LangTypeDefine : string
属性数据类型:编程语言定义 - IsCustomType : string
属性数据类型:是否为自定义类型
- Remark : int
-
[自定义函数](#5.6.1 自定义函数)
- Sql导出依赖于表头导出与数据导出的设置。
- 当以下三个条件同时具备时,进行sql导出。
- -ragne中包含db项
- -file中包含sql项
- -mode中至少包含title或data其中之一。
- 导出流程:
-
注入的数据对象为*TempSqlProxy
-
常用于模板的公开属性或函数:
- Excel:*excel.ExcelProxy
当前执行的Excel数据代理对象 - Sheet:*excel.ExcelSheet
当前执行的Sheet数据对象 - SqlCtx:*SqlContext
当前执行的Sql上下文 - TableName : string
数据库表名 - FieldIndex : string
字段选择索引 - StartRow : string
开始行号 - EndRow : int
结束行号 - StartColIndex : int
开始列索引 - ValueAtAxis : string
取当前Sheet上指定单元格的值 - PrimaryKeyLen : int 主键数量
- GetPrimaryKeys : []SqlFieldItem 取得主键信息
- GetFieldItems : []SqlFieldItem 取得字段信息列表
- GetItems : []SqlFieldItem 取得数据信息列表
- Excel:*excel.ExcelProxy
-
[自定义函数](#5.6.1 自定义函数)
模板文件格式为go语言模板,文档说明地址如下:
https://golang.google.cn/pkg/text/template/
自定义函数对全部模板有效
注意:自定义函数的返回值必须是1个或2个,这是官方要求。
当返回值为2个时,第2个返回值类型必须是error。
-
ToLowerCamelCase
把字符串内容转化为小驼峰格式 -
ToUpperCamelCase
把字符串内容转化为大驼峰格式 -
Add
加法 -
Sub
减法 -
NowTime
取当前时间 -
NowTimeStr
取当前时间默认格式字符串 -
NowTimeFormat
取当前时间
2006-01-02 15**:04:05 PM Mon Jan
2006-01-_2 15:04:**05 PM Mon Jan -
NowYear
当前时间年份 -
NowMonth
当前时间月份
一月: 1 -
NowDay
当前时间日期 -
NowWeekday
当前时间星期几
星期日: 0 -
NowHour
当前时间小时 -
NowMinute
当前时间分钟 -
NowSecond
当前时间秒 -
NowUnix
当前时间秒戳(s) -
NowUnixNano
当前时间秒戳(ns)
- infra-go(库依赖) https://github.com/xuzhuoxi/infra-go
- excelize(库依赖) https://github.com/360EntSecGroup-Skylar/excelize
- goxc(编译依赖) https://github.com/laher/goxc
xuzhuoxi
xuzhuoxi@gmail.com 或 mailxuzhuoxi@163.com
ExcelExporter 源代码基于MIT许可证进行开源。