# rish-excel **Repository Path**: uidoer/rish-excel ## Basic Information - **Project Name**: rish-excel - **Description**: 介绍 这是一个依赖 apache poi实现的 excel 导入工具 优点 1.可以实现转换器接口ExcelDataConvertTo,读取单元格任何格式的数据 2.可以使用注解@ExcelRegex校验数据格式是否正确,可以严格校验,也可以宽松校验 3.可以读取为List数据,也可以读取Bean数据 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: http://rish.top - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2021-08-21 - **Last Updated**: 2022-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 介绍 这是一个依赖 apache poi实现的 excel 导入工具 ### 优点 1) 可以实现转换器接口`ExcelDataConvertTo`,读取单元格任何格式的数据 2) 可以使用注解`@ExcelRegex`校验数据格式是否正确,可以严格校验,也可以宽松校验 3) 可以读取为List数据,也可以读取Bean数据 #### 使用 ##### 拉取项目 ``` git clone https://gitee.com/uidoer/rish-excel.git ``` ##### 使用maven 安装 ``` mvn install ``` 或者: 使用idea安装 Maven ==> Lifecycle ==> install ##### 在pom中引入工具 ```xml top.rish get-excel-data 1.0-SNAPSHOT ``` ##### 创建bean / list的bean ```java /** * 回单明细 bean */ public class HdmxBean { /** * 开始日期 */ @ExcelCell(descript = "开始日期",required = true, row = 1, col = 1, convert = ConvertToDate.class, regex = { @ExcelRegex(value = "\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}",strict = true,message = "开始日期格式错误!") }) Date ksrq; /** * 结束日期 */ @ExcelCell(descript = "结束日期",required = true, row = 1, col = 3, convert = ConvertToDate.class) Date jsrq; /** * 银行类别编码 */ @ExcelCell(descript = "银行类别编码",required = true, row = 1, col = 5) String yhlbbm; // setter/getter ... toString } ``` ##### 获取bean数据 ```java // HDMX EXCEL文件绝对路径 RishExcel rishExcel = new RishExcel(HDMX); HdmxBean bean = rishExcel.read(HdmxBean.class,0,3); ``` ##### 获取List数据 ```java // HDMX EXCEL文件绝对路径 RishExcel rishExcel = new RishExcel(HDMX); List list = rishExcel.read(HdmxList.class,"BODY",3); ``` ##### 说明 关于`@ExcelCell` ```java /** * rish.top * 从excel的单元格或列,获取数据 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelCell { /** * 行 * row,col为单元格坐标, * 如果row为-1,那按列获取[*,col] * 如果row>=0,那么按单元格坐标[row,col]获取 * @return */ int row() default -1; /** * 列 从0开始 * @return */ int col() default 0; /** * 转换器 默认转为String,对应字段类型需要为String * @return */ Class convert() default ConvertToString.class; /** * 描述 * @return */ String descript() default ""; /** * 是否必须 * 如果是必须,那么没有值的时候,直接报错 * 如果不是必须,没有值的时候就不报错 * @return */ boolean required() default false; /** * 正则校验 * @return */ ExcelRegex[] regex() default {}; } ``` 关于`@ExcelRegex`(对单元格的数据或列的数据,进行正则校验,支持严格校验和宽松校验) ```java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelRegex { /** * 正则表达式 * @return */ String value(); /** * 校验模式 * true: 严格校验 , 如果不满足表达式就会直接报异常,中断 * false: 宽松校验 ,只是会跳过本条记录的读取 * @return */ boolean strict() default true; /** * 不满足正则表达式时的报错信息 * @return */ String message() default "数据格式错误!"; } ``` 关于转换器接口`ExcelDataConvertTo`只要实现一个转换器,并且放到`@ExcelCell`注解上,即可 ```java /** * rish.top * @param 转换成何种类型数据 */ public interface ExcelDataConvertTo { /** * 是否必填 * @return */ boolean required(); /** * 转换 * @param data * @return * @throws Exception */ T convert(String data ) throws Exception; } ``` ##### 已经实现的转换器 ```java /** * 转为十进制小数 */ public class ConvertToBigDecimal implements ExcelDataConvertTo { @Override public boolean required() { return false; } @Override public BigDecimal convert(String data ) throws Exception { return new BigDecimal(data); } } ``` ```java /** * 转为日期 */ public class ConvertToDate implements ExcelDataConvertTo { /** * 日期正则和日期格式 */ private static final Map REG_MAP = new ConcurrentHashMap(){ { put("\\d{1,2}\\/\\d{1,2}\\/\\d{2} \\d{1,2}:\\d{1,2}", "MM/DD/yy HH:mm"); put("\\d{1,2}-\\d{1,2}-\\d{2} \\d{1,2}:\\d{1,2}", "MM-DD-yy HH:mm"); put("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd HH:mm:ss"); put("\\d{4}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy/MM/dd HH:mm:ss"); put("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}", "yyyy-MM-dd HH:mm"); put("\\d{4}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2}", "yyyy/MM/dd HH:mm"); put("\\d{4}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2} [^\\x00-\\xff|a-zA-Z]{2}", "yyyy/MM/dd HH:mm aa"); put("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2} [^\\x00-\\xff|a-zA-Z]{2}", "yyyy-MM-dd HH:mm aa"); } }; @Override public boolean required() { return true; } @Override public Date convert(String data ) throws Exception { for(Map.Entry entry:REG_MAP.entrySet()){ String pattern = entry.getKey(); String format = entry.getValue(); if(Pattern.matches(pattern, data)){ return new SimpleDateFormat(format, Locale.CHINA).parse(data); } } throw new Exception("暂无此日期格式 "+data); } } ``` #### 使用截图 ![](https://gitee.com/uidoer/rish-excel/raw/master/img/wechat_20210821182208.png?width=890)