From 69dd024ef7659c6a30bc69fb76d6b23a13853286 Mon Sep 17 00:00:00 2001
From: datagear
Date: Fri, 28 Aug 2020 19:10:53 +0800
Subject: [PATCH] =?UTF-8?q?[analysis]=E5=AE=8C=E5=96=84Excel=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E9=9B=86=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../analysis/support/AbstractDataSet.java | 11 +
.../support/AbstractExcelDataSet.java | 520 +++++++++++++++---
.../support/ExcelDirectoryFileDataSet.java | 64 +++
.../support/JsonDirectoryFileDataSet.java | 3 +-
.../analysis/support/RangeExpResolver.java | 13 +-
.../analysis/support/SimpleExcelDataSet.java | 48 ++
.../ExcelDirectoryFileDataSetTest.java | 250 +++++++++
.../ExcelDirectoryFileDataSetTest-0.xlsx | Bin 0 -> 8434 bytes
.../ExcelDirectoryFileDataSetTest-1.xls | Bin 0 -> 25600 bytes
9 files changed, 816 insertions(+), 93 deletions(-)
create mode 100644 datagear-analysis/src/main/java/org/datagear/analysis/support/ExcelDirectoryFileDataSet.java
create mode 100644 datagear-analysis/src/main/java/org/datagear/analysis/support/SimpleExcelDataSet.java
create mode 100644 datagear-analysis/src/test/java/org/datagear/analysis/support/ExcelDirectoryFileDataSetTest.java
create mode 100644 datagear-analysis/src/test/resources/org/datagear/analysis/support/ExcelDirectoryFileDataSetTest-0.xlsx
create mode 100644 datagear-analysis/src/test/resources/org/datagear/analysis/support/ExcelDirectoryFileDataSetTest-1.xls
diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractDataSet.java b/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractDataSet.java
index a29e6836..3ed973c1 100644
--- a/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractDataSet.java
+++ b/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractDataSet.java
@@ -111,6 +111,17 @@ public abstract class AbstractDataSet extends AbstractIdentifiable implements Da
return true;
}
+ /**
+ * 解析属性类型。
+ *
+ * @param value
+ * @return
+ */
+ protected String resolveDataType(Object value)
+ {
+ return DataSetProperty.DataType.resolveDataType(value);
+ }
+
/**
* 获取指定名称的{@linkplain DataNameType}对象,没找到则返回{@code null}。
*
diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractExcelDataSet.java b/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractExcelDataSet.java
index 4246e1b3..cec4f87a 100644
--- a/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractExcelDataSet.java
+++ b/datagear-analysis/src/main/java/org/datagear/analysis/support/AbstractExcelDataSet.java
@@ -8,33 +8,57 @@
package org.datagear.analysis.support;
import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.datagear.analysis.DataSetException;
import org.datagear.analysis.DataSetProperty;
import org.datagear.analysis.DataSetResult;
import org.datagear.analysis.ResolvableDataSet;
import org.datagear.analysis.ResolvedDataSetResult;
import org.datagear.analysis.support.RangeExpResolver.IndexRange;
+import org.datagear.analysis.support.RangeExpResolver.Range;
import org.datagear.util.FileUtil;
import org.datagear.util.IOUtil;
import org.datagear.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* 抽象Excel数据集。
+ *
+ * 此类仅支持从Excel的单个sheet读取数据,具体参考{@linkplain #setSheetIndex(int)}。
+ *
+ *
+ * 通过{@linkplain #setDataRowExp(String)}、{@linkplain #setDataColumnExp(String)}来设置读取行、列范围。
+ *
+ *
+ * 通过{@linkplain #setNameRow(int)}可设置名称行。
+ *
*
* @author datagear@163.com
*
*/
public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet implements ResolvableDataSet
{
+ protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractExcelDataSet.class);
+
public static final String EXTENSION_XLSX = "xlsx";
public static final String EXTENSION_XLS = "xls";
@@ -42,11 +66,11 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
protected static final RangeExpResolver RANGE_EXP_RESOLVER = RangeExpResolver
.valueOf(RangeExpResolver.RANGE_SPLITTER_CHAR, RangeExpResolver.RANGE_GROUP_SPLITTER_CHAR);
- /** 是否强制作为xls文件处理 */
- private boolean forceXls = false;
+ /** 此数据集所处的sheet索引号(以0计数) */
+ private int sheetIndex = 0;
- /** 作为标题行的行号 */
- private int titleRow = -1;
+ /** 作为名称行的行号 */
+ private int nameRow = -1;
/** 数据行范围表达式 */
private String dataRowExp = null;
@@ -54,7 +78,11 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
/** 数据列范围表达式 */
private String dataColumnExp = null;
+ /** 是否强制作为xls文件处理 */
+ private boolean forceXls = false;
+
private transient List _dataRowRanges = null;
+ private transient List _dataColumnRanges = null;
public AbstractExcelDataSet()
{
@@ -72,55 +100,51 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
super(id, name, properties);
}
+ public int getSheetIndex()
+ {
+ return sheetIndex;
+ }
+
/**
- * 是否强制作为xls文件处理。
+ * 设置此数据集所处的sheet索引号。
+ *
+ * @param sheetIndex
+ * 索引号(以{@code 0}计数)
+ */
+ public void setSheetIndex(int sheetIndex)
+ {
+ this.sheetIndex = sheetIndex;
+ }
+
+ /**
+ * 是否有名称行。
*
* @return
*/
- public boolean isForceXls()
+ public boolean hasNameRow()
{
- return forceXls;
+ return (this.nameRow > 0);
}
/**
- * 设置是否强制作为xls文件处理,如果为{@code false},则根据文件扩展名判断。
- *
- * @param forceXls
- */
- public void setForceXls(boolean forceXls)
- {
- this.forceXls = forceXls;
- }
-
- /**
- * 是否有标题行。
+ * 获取作为名称行的行号。
*
* @return
*/
- public boolean hasTitleRow()
+ public int getNameRow()
{
- return (this.titleRow > 0);
+ return nameRow;
}
/**
- * 获取作为标题行的行号。
- *
- * @return
- */
- public int getTitleRow()
- {
- return titleRow;
- }
-
- /**
- * 设置作为标题行的行号。
+ * 设置作为名称行的行号。
*
* @param titleRow
- * 行号,小于{@code 1}则表示无标题行。
+ * 行号,小于{@code 1}则表示无名称行。
*/
- public void setTitleRow(int titleRow)
+ public void setNameRow(int titleRow)
{
- this.titleRow = titleRow;
+ this.nameRow = titleRow;
}
public String getDataRowExp()
@@ -139,7 +163,7 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
* {@code "1,4,8-15"}:第1、4、8至15行
*
*
- * 标题行({@linkplain #getTitleRow()})将自动被排除。
+ * 标题行({@linkplain #getNameRow()})将自动被排除。
*
*
* 注意:行号以{@code 1}开始计数。
@@ -151,18 +175,7 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
public void setDataRowExp(String dataRowExp)
{
this.dataRowExp = dataRowExp;
-
- if (!StringUtil.isEmpty(dataRowExp))
- {
- try
- {
- this._dataRowRanges = getRangeExpResolver().resolveIndex(this.dataRowExp);
- }
- catch (NumberFormatException e)
- {
- throw new DataSetException(e);
- }
- }
+ this._dataRowRanges = getRangeExpResolver().resolveIndex(this.dataRowExp);
}
public String getDataColumnExp()
@@ -187,6 +200,27 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
public void setDataColumnExp(String dataColumnExp)
{
this.dataColumnExp = dataColumnExp;
+ this._dataColumnRanges = resolveDataColumnRanges(dataColumnExp);
+ }
+
+ /**
+ * 是否强制作为xls文件处理。
+ *
+ * @return
+ */
+ public boolean isForceXls()
+ {
+ return forceXls;
+ }
+
+ /**
+ * 设置是否强制作为xls文件处理,如果为{@code false},则根据文件扩展名判断。
+ *
+ * @param forceXls
+ */
+ public void setForceXls(boolean forceXls)
+ {
+ this.forceXls = forceXls;
}
@Override
@@ -244,9 +278,6 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
protected ResolvedDataSetResult resolveResultForXls(Map paramValues, File file,
List properties) throws DataSetException
{
- @SuppressWarnings("unchecked")
- List