diff --git a/pom.xml b/pom.xml
index de9f7fe..6d4a7b2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,8 @@
2.0.0-SNAPSHOT
2.0.0-SNAPSHOT
2.0.0-SNAPSHOT
+ 5.2.2
+ 3.3.3
@@ -113,6 +115,18 @@
org.redisson
redisson-spring-boot-starter
+
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
+
+
+
+
+ com.alibaba
+ easyexcel
+ ${easyexcel.version}
+
diff --git a/src/main/java/cn/axzo/pokonyan/client/DataSheetClient.java b/src/main/java/cn/axzo/pokonyan/client/DataSheetClient.java
new file mode 100644
index 0000000..16a2c07
--- /dev/null
+++ b/src/main/java/cn/axzo/pokonyan/client/DataSheetClient.java
@@ -0,0 +1,608 @@
+package cn.axzo.pokonyan.client;
+
+import cn.axzo.pokonyan.exception.BizResultCode;
+import cn.axzo.pokonyan.exception.BusinessException;
+import cn.axzo.pokonyan.exception.VarParamFormatter;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSONPath;
+import com.alibaba.fastjson.util.TypeUtils;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static cn.axzo.pokonyan.client.DataSheetClient.CellMeta.EXT_KEY_DATETIME_FORMAT;
+import static cn.axzo.pokonyan.client.DataSheetClient.CellMeta.EXT_KEY_RANGE_LOWER_TYPE;
+import static cn.axzo.pokonyan.client.DataSheetClient.CellMeta.EXT_KEY_RANGE_UPPER_TYPE;
+
+/**
+ * 用于发送sms & email验证码, 或者获取图片验证码. 并提供校验验证码是否正确的能力
+ */
+public interface DataSheetClient {
+
+ /**
+ * 数据导入的builder
+ *
+ * @return
+ */
+ ImporterBuilder importBuilder();
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(fluent = true)
+ abstract class ImporterBuilder {
+ /**
+ * 导入的场景名称, 必填
+ */
+ @NonNull
+ private String scene;
+
+ /**
+ * 导入格式
+ */
+ @NonNull
+ private ImportFormat format;
+
+ /**
+ * EXCEL格式的sheetName
+ */
+ private String tableName;
+
+ private Meta meta;
+
+ private boolean debugEnabled;
+
+ /**
+ * 解析结果ImportResp中的lines是否包含解析失败的行
+ * true: 解析失败的时候,不会抛异常,会在每行的JSONObject中添加
+ * "errors":[{"columnIndex":1,"columnKey":"","columnName":"","rawValue":"","errorCode":"","errorMsg":""}]
+ * false: 解析失败的时候,抛第一个异常
+ */
+ private boolean includeLineErrors;
+ /**
+ * 允许最大的导入行数
+ */
+ private Integer allowMaxLineCount;
+
+ public abstract Importer build();
+ }
+
+ interface Importer {
+ /**
+ * 所有字段读取为String类型
+ *
+ * @param inputStream
+ * @return
+ */
+ ImportResp readAll(InputStream inputStream);
+ }
+
+ @Builder
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class ImportResp {
+ /**
+ * 导入的场景名称
+ */
+ private String scene;
+
+ /**
+ * 模版对应的code以及版本
+ */
+ private String templateCode;
+ private String version;
+
+ /**
+ * headers
+ */
+ private List headers;
+ /**
+ * 每一行的数据
+ */
+ private List lines;
+
+ /**
+ * header的行数
+ */
+ private Integer headerRowCount;
+ /**
+ * 导入数据总行数, 不包含header
+ */
+ private Integer rowCount;
+ /**
+ * 导入数据列数
+ */
+ private Integer columnCount;
+
+ /**
+ * Meta数据
+ */
+ private Meta meta;
+
+ /**
+ * 消耗的时间
+ */
+ private Long elapsedMillis;
+ }
+
+ @AllArgsConstructor
+ @Getter
+ enum ImportFormat {
+ EXCEL("xlsx"),
+ // TODO: 支持其他类型
+ // CSV("csv")
+ ;
+
+ private String suffix;
+ }
+
+ @Data
+ class ExportField {
+ private String column;
+ private String header;
+ private CellMeta.Type type;
+ private Boolean mandatory;
+
+ private String lowerType;
+ private String upperType;
+ private String dateTimeFormat;
+ private List