1 Star 2 Fork 1

rebirth/excelize360-mapping-struct

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

excel映射解析Golang

excelize360-mapping-struct: gitee

golang 基于excelize360实现的excel解析工具,通过结构体字段tag实现映射数据到结构体,并加入了一些预期的错误格式,可根据实际运用情况加入更多错误模板,具体使用方式clone本仓库代码,可直接在本地运行调试。

支持的tag标签

tag属性 说明
mapping 将数据进行转义,一般数据表格中都是以明文输入输出数据,但在实际代码业务中只用0或1表示状态的场景。例:mapping(已完成:1,未完成:2)
unique 标识唯一性,在同列中唯一。例:unique(true)
date 时间格式化,该属性分两部分,第一个参数:该单元格的时间日期格式(注意该格式非在数据表格中明文显示的格式,要查看该单元格在excel中的时间格式设置);第二个参数:将转化到的格式。例:date(01-02-06,2006-01-02)
name 指定该属性所在字段绑定的excel列名称,一般情况下数据表格都会指定每一列代表的含义,该属性十分重要,也是映射数据的主要参考依据,需要保持excel列名跟name属性保持一致,例:name(*名称)

以上tag属性统一作用在 excel 标签下,如某个字段需要绑定多个属性,属性间用 “;” 分隔。 结构体定义示例:

type Project struct {
	Name       string      `json:"project_name" excel:"name(*名称);unique(true)"`
	StartTime  *string     `json:"start_time" excel:"name(开始时间);date(01-02-06,2006-01-02)"`
	Status     int         `json:"Status" excel:"name(状态);mapping(已完成:1,未完成:2)"`
	Statistics *Statistics `json:"statistics"`
	Result     struct {
		Count *int `json:"count" excel:"name(总数)"`
	} `json:"result"`
	Time time.Time `json:"time"`
}

type Statistics struct {
	Num int `json:"num" excel:"name(数量)"`
}

自定义验证接口

工具内置一个接口,可根据需求选择性实现该接口。

type MappingStruct interface {
	ExcelRowProcess(res *Result) error
}

通过已经绑定execl标签的结构体实现接口,可对每一行数据(其实就是可以把该结构体看作是每一行数据的模板,数据进行映射操作时每一行映射完都会调用一次该接口)进行自定义校验或进行数据改值(每一行数据都会自动创建新的指针指向并复制初始指针传入的内容)等操作,说明:如果在实现的接口中需要事务性的操作,可以将相关存储引擎通过初始指针进行传递。

接口实现示例:

func (p *Project) ExcelRowProcess(res *excel.Result) error {
	log.Println(p.Statistics.Num, *p.Result.Count)
	valid := validation.Validation{}
	valid.Match(p.Name, regexp.MustCompile("^[-_a-zA-Z一-龥]{1,64}$"), strconv.Itoa(excel.ParamUnqualified))
	for _, err := range valid.Errors {
		errType, _ := strconv.Atoi(err.Key)
		res.AddError(errType, "名称")
	}
	return nil
}
p := new(Project)
p.Time = time.Now() //每一行数据都可复用
processor, err := excel.NewProcessor(p, true)
if err != nil {
    log.Println(err.Error())
    return
}

NewProcessor: new一个处理器,第二个参数表示是否开启验证,为false的话,自定义的验证就不会被调用了。 接口提供返回error参数,注意如果返回参数不为空,解析会立马停止,并返回该错误,一般在致命错误下返回该错误,一般的验证错误可见下边数据行验证错误的说明。

Result——内置的错误处理工具与数据映射结果处理

result提供了四个方法,可在实现自定义验证接口中与映射解析返回的结果参数获取该对象进行方法调取。

方法名称 说明
AddError 主要用于自定义验证接口中,可结合下边介绍错误处理模板添加行错误,提供了一个错误码(错误格式的编码)参数与错误格式化值参数,类似golang中fmt.Sprintf 方法
HasError 用于数据解析后,判断excel解析结果是否存在错误,返回错误列表,错误列表由行号+错误信息集合组成,标识了哪一行数据产生了哪些错误
List 返回当前已经完成解析数据行的集合,注意返回类型是一个[]interface{}
Format 将已经完成解析数据行的集合通过json序列化反序列化方法在解析到指定的对象中

数据行验证错误

数据解析过程中会对每一行数据进行解析检验,发现不符合要求的数据单元,并不会立即结束解析,而是会将所有行的错误进行整合,最终将错误结果以 行号+错误信息集合 当作一项放入到错误集合中返回最终结果。

内部验证错误

内部验证错误主要与excel格式的错误或预期定义错误息息相关,错误集合介绍如下:

格式 组成 说明
%s[%s]不可重复 列名[列值] unique属性,在做列唯一性校验时提示的错误
%s单元格格式错误 列名 date属性,excel设置的单元格时间与结构体date属性第一个参数不一致时提示的错误
%s单元格存在非法输入 列名 mapping属性,当单元格输入的值不在mapping定义的转义列表中时提示的错误
%s单元格非法输入,参数非bool类型值 列名 单元格输入的值与结构体对应字段类型不一致输出的错误
%s单元格非法输入,参数非整形数值 列名 单元格输入的值与结构体对应字段类型不一致输出的错误
%s单元格非法输入,参数非浮点型数值 列名 单元格输入的值与结构体对应字段类型不一致输出的错误

自定义错误

自定义错误工具也定义了一些可直接使用的模板,也可根据实际需求自定义,在自定义的验证接口中使用,接口已有错误模板如下:

错误码 格式 组成 说明
ParamCannotBeEmpty %s参数不可为空 自定义(例:res.AddError(excel.ParamCannotBeEmpty, "名称")) 适用参数空值
ParamUnqualified %s参数格式不正确 自定义 适用正则校验
AlreadyExists %s已存在 自定义 适用判断已存在
NotExist %s不存在 自定义 适用判断不存在
NotInConfigurationItems %s不在配置项中 自定义 适用输入的数据不在指定的集合中
TimeFormatError %s时间格式错误 自定义 适用时间格式错误
DataOutsideExpectedLimits %s数据不在预期限制范围 自定义 适用数据在一定范围内的校验
ParamInvalid %s参数验证失败 自定义 适用没有具体定义的错误

自定义错误格式模板信息,直接在工具文件头部已列出的模板下进行添加即可。

const (
	ParamError = iota
	ParamInvalid
	ParamUnqualified
	AlreadyExists
	NotExist
	NotInConfigurationItems
	TimeFormatError
	DataOutsideExpectedLimits
	ParamCannotBeEmpty
)

var errFormatList = map[int]excelErr{
	ParamCannotBeEmpty:        {"%s参数不可为空"},
	ParamUnqualified:          {"%s参数格式不正确"},
	AlreadyExists:             {"%s已存在"},
	NotExist:                  {"%s不存在"},
	NotInConfigurationItems:   {"%s不在配置项中"},
	TimeFormatError:           {"%s时间格式错误"},
	DataOutsideExpectedLimits: {"%s数据不在预期限制范围"},
	ParamInvalid:              {"%s参数验证失败"},
}

其他具体实现以及更多详细使用方式 main 方法中已经实现

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

暂无描述 展开 收起
README
Apache-2.0
取消

发行版 (1)

全部

贡献者

全部

语言

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/chansirs/excelize360-mapping-struct.git
git@gitee.com:chansirs/excelize360-mapping-struct.git
chansirs
excelize360-mapping-struct
excelize360-mapping-struct
master

搜索帮助