
## 导出命令
1. 安装python，推荐3.8.10
2. 安装easyxl，命令行运行：python -m pip install easyxl
3. 按照后述格式填写好excel表格后，命令行运行：python -m easyxl /path/to/your/excel/file/
4. 输出结果在excel文件同级目录下与excel文件同名的文件夹里

## 填表说明
### cmd表单
* cmd是管理导出任务的默认表单
* 保证第一行和第一列没有被空单元格间断（合并单元格里的所有单元格都是非空）
    * 第一列：h标明表头的范围
    * *标明要输出的内容
    * #注释掉不需要输出的内容
* 表头说明：
    * Task：任务标记
    * SheetName：任务所对应的表单名称
    * Export：是否执行导出
    * OneFilePerId：是否按照第一层的Id，按照Id导出单独的数据文件

### 待导出表单
* **分隔符与信息记号：**
    * "-"是默认的分隔符
    * 名称、第一行/列的h/id标记、强制转换数值类型、数据结构、null记号等信息记号，都需要用"-"分隔
        * 名称：
            * 用分隔符分割单元格的数据后，第一个会被作为单元格的名称。如果是"-AB-EF"的结构，第一个值是""，单元格名称会被设置为None
        * h/id标记：
            * h，在第一列标记所有表头所在的行
            * id，在第一行标记所有ID所在的列
        * 强制转换数值类型：支持的类型包括int、float、str、bool
        * 数据结构：dict、list
        * null记号：
            * none或null都可以，不区分大小写
            * 放置了null记号的单元格，会被当做空单元格处理
* **Id与Header**
  
    * 支持多列的Id嵌套，支持多行的Header嵌套
    * 支持定义数据结构：dict与list。实现方式：在对应的单元格添加分隔符与对应类型（dict、list）
    * 支持注释：如果在某个单元格前添加#，则该单元格对应的行或列不会被导出
    * **合并多行多列数据**
        * 方法1：合并涉及的单元格
        * 方法2：第一个单元格正常书写，剩余单元格留空
        * 方法3：所有单元格都填写内容
            * 需保证拆分后的name都一样。添加#不影响对name的判断。
            * 只有第一个单元格的#能够起到注释的作用。
        * 合并多行或多列的一个注意项：
            * 如果是Id的末列或者Header的末行，一个Id对应多行，或者一个Header对应多列，则对应的行列数据都会被放到一个list里，无论定义的这个Id或Header的数据结构是list还是dict。之所以这么做，是因为没有下一列或下一行提供字典的key。
* **Content区：**
  
    * Header末行以下、Id末列以右的区域
    * 支持单元格内填写**Json5**格式数据


### 其他
* 重复Id处理：后边覆盖前边
* 空表头处理：
    * 如果数据向上追溯碰到的第一个非空表头是list，则该数据会被放到对应的list里
    * 如果数据向上追溯碰到的第一个非空表头是dict，则该数据会被放到{None:}里。注意：多个空表头会导致只有最后一个表头对应的数据被放到{None:}里
* 把数据按第一个Id列表输出（只适用于不是OneFilePerId的情形）：
    * 方法1：在(1, 1)输入{abcd:[]}（abcd可以用其他字母替换），脚本会以该格式作为包裹，将id列的值放到列表里；id列的键会被略去，因为外层是一个list。
    * :方法2：在Id列左侧再插入一个辅助列，作为一个包裹结构。比如data-list，具体格式参见**合并多行多列数据**的3个方法之一
* 对于字母和数字拼接的Id，使用"_"拼接，会默认把Id拆分后进行排序
* 将json转换为C#的数据结构：https://json2csharp.com/ 


## TODO
- [x] 添加：根据cmd表单，形成任务列表的功能
- [x] 添加：获取Sheet信息
- [x] 添加：#注释掉列的功能
- [x] 添加：#注释掉行的功能
- [x] 添加：忽略空单元格的功能
- [x] 添加：将Id列转化为列表头，增加差异化列表头功能
- [x] 增强：Header垂直到尾的判断能力
- [x] 添加：parse单元格内Json字符串的功能
- [x] 添加：根据表头的类型标注转换单元格value的功能
- [x] 添加：将多个相同ID表头的行合并伪一个list的功能
- [x] 添加：OneFilePerId的功能
- [x] 添加：命令行读取参数，处理Excel文件的功能
- [x] 打包发布到Pypi
- [x] 增加不同层级的remove_empty的功能：RmEmptyDictItem、RmEmptyListItem
- [x] 将单元格里的json结构化为UnifiedData，减少递归判断的复杂程度，也方便做remove_empty
- [ ] 增加数据校验的功能
- [ ] 增加数据导出为类的功能
