|
@@ -1,46 +1,6 @@
|
|
package com.boman.common.core.utils.poi;
|
|
package com.boman.common.core.utils.poi;
|
|
|
|
|
|
-import java.io.IOException;
|
|
|
|
-import java.io.InputStream;
|
|
|
|
-import java.io.OutputStream;
|
|
|
|
-import java.lang.reflect.Field;
|
|
|
|
-import java.math.BigDecimal;
|
|
|
|
-import java.text.DecimalFormat;
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Arrays;
|
|
|
|
-import java.util.Comparator;
|
|
|
|
-import java.util.Date;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.Set;
|
|
|
|
-import java.util.stream.Collectors;
|
|
|
|
-import javax.servlet.http.HttpServletResponse;
|
|
|
|
-import org.apache.poi.ss.usermodel.BorderStyle;
|
|
|
|
-import org.apache.poi.ss.usermodel.Cell;
|
|
|
|
-import org.apache.poi.ss.usermodel.CellStyle;
|
|
|
|
-import org.apache.poi.ss.usermodel.CellType;
|
|
|
|
-import org.apache.poi.ss.usermodel.ClientAnchor;
|
|
|
|
-import org.apache.poi.ss.usermodel.DataValidation;
|
|
|
|
-import org.apache.poi.ss.usermodel.DataValidationConstraint;
|
|
|
|
-import org.apache.poi.ss.usermodel.DataValidationHelper;
|
|
|
|
-import org.apache.poi.ss.usermodel.DateUtil;
|
|
|
|
-import org.apache.poi.ss.usermodel.Drawing;
|
|
|
|
-import org.apache.poi.ss.usermodel.FillPatternType;
|
|
|
|
-import org.apache.poi.ss.usermodel.Font;
|
|
|
|
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
|
|
-import org.apache.poi.ss.usermodel.IndexedColors;
|
|
|
|
-import org.apache.poi.ss.usermodel.Row;
|
|
|
|
-import org.apache.poi.ss.usermodel.Sheet;
|
|
|
|
-import org.apache.poi.ss.usermodel.VerticalAlignment;
|
|
|
|
-import org.apache.poi.ss.usermodel.Workbook;
|
|
|
|
-import org.apache.poi.ss.usermodel.WorkbookFactory;
|
|
|
|
-import org.apache.poi.ss.util.CellRangeAddressList;
|
|
|
|
-import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
|
|
-import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
|
|
|
-import org.apache.poi.xssf.usermodel.XSSFDataValidation;
|
|
|
|
-import org.slf4j.Logger;
|
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
import com.boman.common.core.annotation.Excel;
|
|
import com.boman.common.core.annotation.Excel;
|
|
import com.boman.common.core.annotation.Excel.ColumnType;
|
|
import com.boman.common.core.annotation.Excel.ColumnType;
|
|
import com.boman.common.core.annotation.Excel.Type;
|
|
import com.boman.common.core.annotation.Excel.Type;
|
|
@@ -50,11 +10,32 @@ import com.boman.common.core.utils.DateUtils;
|
|
import com.boman.common.core.utils.StringUtils;
|
|
import com.boman.common.core.utils.StringUtils;
|
|
import com.boman.common.core.utils.file.FileTypeUtils;
|
|
import com.boman.common.core.utils.file.FileTypeUtils;
|
|
import com.boman.common.core.utils.file.ImageUtils;
|
|
import com.boman.common.core.utils.file.ImageUtils;
|
|
|
|
+import com.boman.common.core.utils.obj.ObjectUtils;
|
|
import com.boman.common.core.utils.reflect.ReflectUtils;
|
|
import com.boman.common.core.utils.reflect.ReflectUtils;
|
|
|
|
+import com.boman.domain.GenTableColumn;
|
|
|
|
+import com.boman.domain.SysDictData;
|
|
|
|
+import com.boman.domain.SysUser;
|
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
|
+import org.apache.poi.ss.util.CellRangeAddressList;
|
|
|
|
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.InputStream;
|
|
|
|
+import java.io.OutputStream;
|
|
|
|
+import java.lang.reflect.Field;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.text.DecimalFormat;
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Excel相关处理
|
|
* Excel相关处理
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @author ruoyi
|
|
* @author ruoyi
|
|
*/
|
|
*/
|
|
public class ExcelUtil<T>
|
|
public class ExcelUtil<T>
|
|
@@ -141,7 +122,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 对excel表单默认第一个索引名转换成list
|
|
* 对excel表单默认第一个索引名转换成list
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param is 输入流
|
|
* @param is 输入流
|
|
* @return 转换后集合
|
|
* @return 转换后集合
|
|
*/
|
|
*/
|
|
@@ -152,7 +133,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 对excel表单指定表格索引名转换成list
|
|
* 对excel表单指定表格索引名转换成list
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param sheetName 表格索引名
|
|
* @param sheetName 表格索引名
|
|
* @param is 输入流
|
|
* @param is 输入流
|
|
* @return 转换后集合
|
|
* @return 转换后集合
|
|
@@ -184,22 +165,7 @@ public class ExcelUtil<T>
|
|
if (rows > 0)
|
|
if (rows > 0)
|
|
{
|
|
{
|
|
// 定义一个map用于存放excel列的序号和field.
|
|
// 定义一个map用于存放excel列的序号和field.
|
|
- Map<String, Integer> cellMap = new HashMap<String, Integer>();
|
|
|
|
- // 获取表头
|
|
|
|
- Row heard = sheet.getRow(0);
|
|
|
|
- for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
|
|
|
|
- {
|
|
|
|
- Cell cell = heard.getCell(i);
|
|
|
|
- if (StringUtils.isNotNull(cell))
|
|
|
|
- {
|
|
|
|
- String value = this.getCellValue(heard, i).toString();
|
|
|
|
- cellMap.put(value, i);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- cellMap.put(null, i);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ Map<String, Integer> cellMap = getHead(sheet);
|
|
// 有数据时才处理 得到类的所有field.
|
|
// 有数据时才处理 得到类的所有field.
|
|
Field[] allFields = clazz.getDeclaredFields();
|
|
Field[] allFields = clazz.getDeclaredFields();
|
|
// 定义一个map用于存放列的序号和field.
|
|
// 定义一个map用于存放列的序号和field.
|
|
@@ -310,9 +276,150 @@ public class ExcelUtil<T>
|
|
return list;
|
|
return list;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 对excel表单指定表格索引名转换成list
|
|
|
|
+ *
|
|
|
|
+ * @param sheetName 表格索引名
|
|
|
|
+ * @param is 输入流
|
|
|
|
+ * @return 转换后集合
|
|
|
|
+ */
|
|
|
|
+ public List<JSONObject> importCommonExcel(String sheetName, InputStream is, List<GenTableColumn> columns) throws Exception {
|
|
|
|
+ List<JSONObject> dataList = new ArrayList<>(16);
|
|
|
|
+ this.type = Type.IMPORT;
|
|
|
|
+ this.wb = WorkbookFactory.create(is);
|
|
|
|
+ Sheet sheet = getSheet(sheetName);
|
|
|
|
+ int rows = sheet.getPhysicalNumberOfRows();
|
|
|
|
+ if (rows < 0) {
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Map<String, Integer> cellMap = getHead(sheet);
|
|
|
|
+ Map<Integer, GenTableColumn> fieldsMap = new HashMap<>(16);
|
|
|
|
+ for (GenTableColumn column : columns) {
|
|
|
|
+ for (Map.Entry<String, Integer> entry : cellMap.entrySet()) {
|
|
|
|
+ if (entry.getKey().equals(column.getColumnComment())) {
|
|
|
|
+ Integer sort = cellMap.get(entry.getKey());
|
|
|
|
+ fieldsMap.put(sort, column);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 往data中赋值
|
|
|
|
+ for (int i = 1; i < rows; i++) {
|
|
|
|
+ Row row = sheet.getRow(i);
|
|
|
|
+ JSONObject data = new JSONObject();
|
|
|
|
+ for (Map.Entry<Integer, GenTableColumn> entry : fieldsMap.entrySet()) {
|
|
|
|
+ GenTableColumn column = entry.getValue();
|
|
|
|
+ String columnName = column.getColumnName();
|
|
|
|
+ Object value = this.getCellValue(row, entry.getKey());
|
|
|
|
+ value = handleFK(column.getColumnName(), value, columns);
|
|
|
|
+ data.put(columnName, value);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dataList.add(data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return dataList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Sheet getSheet(String sheetName) throws IOException {
|
|
|
|
+ Sheet sheet;
|
|
|
|
+ if (StringUtils.isNotEmpty(sheetName)) {
|
|
|
|
+ // 如果指定sheet名,则取指定sheet中的内容.
|
|
|
|
+ sheet = wb.getSheet(sheetName);
|
|
|
|
+ } else {
|
|
|
|
+ // 如果传入的sheet名不存在则默认指向第1个sheet.
|
|
|
|
+ sheet = wb.getSheetAt(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sheet == null) {
|
|
|
|
+ throw new IOException("文件sheet不存在");
|
|
|
|
+ }
|
|
|
|
+ return sheet;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Map<String, Integer> getHead(Sheet sheet) {
|
|
|
|
+ // 定义一个map用于存放excel列的序号和field.
|
|
|
|
+ Map<String, Integer> cellMap = new HashMap<>();
|
|
|
|
+ // 获取表头
|
|
|
|
+ Row heard = sheet.getRow(0);
|
|
|
|
+ for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
|
|
|
|
+ Cell cell = heard.getCell(i);
|
|
|
|
+ if (StringUtils.isNotNull(cell)) {
|
|
|
|
+ String value = this.getCellValue(heard, i).toString();
|
|
|
|
+ cellMap.put(value, i);
|
|
|
|
+ } else {
|
|
|
|
+ cellMap.put(null, i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return cellMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Object getValueByFieldType(Object val, Field field, Class<?> fieldType) {
|
|
|
|
+ if (String.class == fieldType) {
|
|
|
|
+ String s = Convert.toStr(val);
|
|
|
|
+ if (StringUtils.endsWith(s, ".0")) {
|
|
|
|
+ val = StringUtils.substringBefore(s, ".0");
|
|
|
|
+ } else {
|
|
|
|
+ String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
|
|
|
+ if (StringUtils.isNotEmpty(dateFormat)) {
|
|
|
|
+ val = DateUtils.parseDateToStr(dateFormat, (Date) val);
|
|
|
|
+ } else {
|
|
|
|
+ val = Convert.toStr(val);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
|
|
|
|
+ val = Convert.toInt(val);
|
|
|
|
+ } else if (Long.TYPE == fieldType || Long.class == fieldType) {
|
|
|
|
+ val = Convert.toLong(val);
|
|
|
|
+ } else if (Double.TYPE == fieldType || Double.class == fieldType) {
|
|
|
|
+ val = Convert.toDouble(val);
|
|
|
|
+ } else if (Float.TYPE == fieldType || Float.class == fieldType) {
|
|
|
|
+ val = Convert.toFloat(val);
|
|
|
|
+ } else if (BigDecimal.class == fieldType) {
|
|
|
|
+ val = Convert.toBigDecimal(val);
|
|
|
|
+ } else if (Date.class == fieldType) {
|
|
|
|
+ if (val instanceof String) {
|
|
|
|
+ val = DateUtils.parseDate(val);
|
|
|
|
+ } else if (val instanceof Double) {
|
|
|
|
+ val = DateUtil.getJavaDate((Double) val);
|
|
|
|
+ }
|
|
|
|
+ } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
|
|
|
|
+ val = Convert.toBool(val, false);
|
|
|
|
+ }
|
|
|
|
+ return val;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getColumnNameByFieldName(String columnComment, Object value, List<GenTableColumn> columns) {
|
|
|
|
+ for (GenTableColumn column : columns) {
|
|
|
|
+ if (columnComment.equals(column.getColumnComment())) {
|
|
|
|
+ return column.getColumnName();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ throw new IllegalArgumentException(String.format("表格中的 [%s] 列, 不在数据库表中, 检查是否出现错误", columnComment));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private Object handleFK(String columnName, Object value, List<GenTableColumn> columns) {
|
|
|
|
+ for (GenTableColumn column : columns) {
|
|
|
|
+ if (columnName.equals(column.getColumnName())) {
|
|
|
|
+ if (ObjectUtils.isEmpty(column.getDictType())) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<SysDictData> dictDataList = column.getSysDictData();
|
|
|
|
+ SysDictData sysDictData = ObjectUtils.filterOne(dictDataList, dict -> dict.getDictLabel().equals(String.valueOf(value)));
|
|
|
|
+ return sysDictData.getDictValue();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return value;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param response 返回数据
|
|
* @param response 返回数据
|
|
* @param list 导出数据集合
|
|
* @param list 导出数据集合
|
|
* @param sheetName 工作表的名称
|
|
* @param sheetName 工作表的名称
|
|
@@ -329,7 +436,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param sheetName 工作表的名称
|
|
* @param sheetName 工作表的名称
|
|
* @return 结果
|
|
* @return 结果
|
|
*/
|
|
*/
|
|
@@ -343,7 +450,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @return 结果
|
|
* @return 结果
|
|
*/
|
|
*/
|
|
public void exportExcel(OutputStream outputStream)
|
|
public void exportExcel(OutputStream outputStream)
|
|
@@ -406,7 +513,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 填充excel数据
|
|
* 填充excel数据
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param index 序号
|
|
* @param index 序号
|
|
* @param row 单元格行
|
|
* @param row 单元格行
|
|
*/
|
|
*/
|
|
@@ -433,7 +540,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 创建表格样式
|
|
* 创建表格样式
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param wb 工作薄对象
|
|
* @param wb 工作薄对象
|
|
* @return 样式列表
|
|
* @return 样式列表
|
|
*/
|
|
*/
|
|
@@ -471,7 +578,7 @@ public class ExcelUtil<T>
|
|
headerFont.setColor(IndexedColors.WHITE.getIndex());
|
|
headerFont.setColor(IndexedColors.WHITE.getIndex());
|
|
style.setFont(headerFont);
|
|
style.setFont(headerFont);
|
|
styles.put("header", style);
|
|
styles.put("header", style);
|
|
-
|
|
|
|
|
|
+
|
|
style = wb.createCellStyle();
|
|
style = wb.createCellStyle();
|
|
style.setAlignment(HorizontalAlignment.CENTER);
|
|
style.setAlignment(HorizontalAlignment.CENTER);
|
|
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
@@ -515,7 +622,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 设置单元格信息
|
|
* 设置单元格信息
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param value 单元格值
|
|
* @param value 单元格值
|
|
* @param attr 注解相关
|
|
* @param attr 注解相关
|
|
* @param cell 单元格信息
|
|
* @param cell 单元格信息
|
|
@@ -543,7 +650,7 @@ public class ExcelUtil<T>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 获取画布
|
|
* 获取画布
|
|
*/
|
|
*/
|
|
@@ -653,7 +760,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 设置 POI XSSFSheet 单元格提示
|
|
* 设置 POI XSSFSheet 单元格提示
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param sheet 表单
|
|
* @param sheet 表单
|
|
* @param promptTitle 提示标题
|
|
* @param promptTitle 提示标题
|
|
* @param promptContent 提示内容
|
|
* @param promptContent 提示内容
|
|
@@ -676,7 +783,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 设置某些列的值只能输入预制的数据,显示下拉框.
|
|
* 设置某些列的值只能输入预制的数据,显示下拉框.
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param sheet 要设置的sheet.
|
|
* @param sheet 要设置的sheet.
|
|
* @param textlist 下拉框显示的内容
|
|
* @param textlist 下拉框显示的内容
|
|
* @param firstRow 开始行
|
|
* @param firstRow 开始行
|
|
@@ -710,7 +817,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 解析导出值 0=男,1=女,2=未知
|
|
* 解析导出值 0=男,1=女,2=未知
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param propertyValue 参数值
|
|
* @param propertyValue 参数值
|
|
* @param converterExp 翻译注解
|
|
* @param converterExp 翻译注解
|
|
* @param separator 分隔符
|
|
* @param separator 分隔符
|
|
@@ -747,7 +854,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 反向解析值 男=0,女=1,未知=2
|
|
* 反向解析值 男=0,女=1,未知=2
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param propertyValue 参数值
|
|
* @param propertyValue 参数值
|
|
* @param converterExp 翻译注解
|
|
* @param converterExp 翻译注解
|
|
* @param separator 分隔符
|
|
* @param separator 分隔符
|
|
@@ -831,7 +938,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取bean中的属性值
|
|
* 获取bean中的属性值
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param vo 实体对象
|
|
* @param vo 实体对象
|
|
* @param field 字段
|
|
* @param field 字段
|
|
* @param excel 注解
|
|
* @param excel 注解
|
|
@@ -862,7 +969,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 以类的属性的get方法方法形式获取值
|
|
* 以类的属性的get方法方法形式获取值
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param o
|
|
* @param o
|
|
* @param name
|
|
* @param name
|
|
* @return value
|
|
* @return value
|
|
@@ -911,7 +1018,7 @@ public class ExcelUtil<T>
|
|
this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
|
|
this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
|
|
this.maxHeight = getRowHeight();
|
|
this.maxHeight = getRowHeight();
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 根据注解获取最大行高
|
|
* 根据注解获取最大行高
|
|
*/
|
|
*/
|
|
@@ -947,7 +1054,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 创建工作表
|
|
* 创建工作表
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param sheetNo sheet数量
|
|
* @param sheetNo sheet数量
|
|
* @param index 序号
|
|
* @param index 序号
|
|
*/
|
|
*/
|
|
@@ -968,7 +1075,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取单元格值
|
|
* 获取单元格值
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param row 获取的行
|
|
* @param row 获取的行
|
|
* @param column 获取单元格列号
|
|
* @param column 获取单元格列号
|
|
* @return 单元格值
|
|
* @return 单元格值
|