package zj.excel.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import zj.check.util.CheckUtil;
import zj.excel.bean.DatasKeySheets;
import zj.excel.bean.Excel;
import zj.excel.bean.ExcelI;
import zj.excel.bean.ExcelTemplate;
import zj.excel.bean.ReadExcelI;
import zj.excel.bean.SheetDatas;
import zj.java.util.JavaUtil;
import zj.type.TypeUtil;
/**
* 概況 :Excel/xls/xlsx<br>
*
* @version 1.00 (2011.12.02)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.shanghaijiadun.com">上海加盾信息科技有限公司</a> <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} <br>
* * <br>
* --------------------------讀取excel數據------------------------------<br>
*
* <pre>
* try {
* Excel readExcel = new Excel();
* readExcel.setFilePath("E:/document/zj-utils/excel/寫入excel" + "1" + ".xls");
* // readExcel.setSheetValue(new String[] { "Sheet1" });
* DatasKeySheets datasKeySheets = null;
* // RE re = new RE();
* // datasKeySheets = ExcelUtil.readExcel(readExcel,re);
* datasKeySheets = ExcelUtil.readExcel(readExcel);
* List<SheetDatas> sheetDatas = datasKeySheets.getSheetDatas();
* for (SheetDatas datas : sheetDatas) {
* // =======================
* System.out.println("sheet:" + datas.getSheetIndex() + "\t\t" + datas.getSheetName() + "\t\t" + datas.getSheet());
* // 循環sheet
* // 獲取某個sheet的行列數據
* List<List<SheetData>> datasLst = datas.getRowsDataLst();
* if (datasLst != null) {
* // 循環某個sheet的行數據
* for (List<SheetData> dataLst : datasLst) {
* // 循環某個sheet的列數據
* for (SheetData data : dataLst) {
* if (data != null) {
* System.out.print(data.getValue() + "\t\t");
* }
* }
* System.out.println();
* }
* }
* }
* } catch (Exception e) {
* e.printStackTrace();
* }
* </pre>
*
* <pre>
* <br>------------------------------導出excel數據------------------------------<br>
* try {
* // 設置數據
* for (int ii = 0; ii < 10; ii++) {
* List<SheetDatas> sheetDatas = new ArrayList<SheetDatas>();
* for (int k = 0; k < 10; k++) {
* // 所有行列數據對象
* SheetDatas sheetData = new SheetDatas();
* sheetData.setSheetName("sheet名." + k);
* sheetDatas.add(sheetData);
* // 所有行數據
* List<List<SheetData>> rowsDataLst = new ArrayList<List<SheetData>>();
* // 設置所有行數據
* sheetData.setRowsDataLst(rowsDataLst);
* // 所有列數據
* List<SheetData> columnsDataLst = null;
* // 所有單元格數據
* SheetData data = null;
* // 實例化所有行列數據
* for (int i = 0; i < 10000; i++) {
* // 設置第i行數據
* columnsDataLst = new ArrayList<SheetData>();
* rowsDataLst.add(columnsDataLst);
* // 添加第j行數據
* for (int j = 0; j < 10; j++) {
* data = new SheetData();
* if (j == 5) {
* data.setValue(i * j);
* } else {
* data.setValue("行" + i + "列" + j);
* }
* columnsDataLst.add(data);
* }
* }
* }
* // 導出excel設置
* Excel excel = new Excel();
* excel.setFilePath("E:/document/zj-utils/excel/寫入excel" + ii + ".xls");
* ExcelUtil.writeExcel(sheetDatas, excel);
* }
* } catch (Exception e) {
* e.printStackTrace();
* }
* </pre>
*/
public final class ExcelReadUtil implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(ExcelReadUtil.class.getName());
private ExcelReadUtil() {
}
/**
* 讀取excel
*
* @param excel
* excel對象
* @return 所有行列數據對象
* @throws Exception
*/
public static final List<String> readExcelSheetNames(final Excel excel) throws Exception {
List<String> sheetNames = new ArrayList<String>();
excel.initWorkbook();
Workbook wb = excel.getWb();
int sheetCount = wb.getNumberOfSheets();
// 循環所有sheet
for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) {
// 獲得sheet工作簿Sheet
Sheet sheet = wb.getSheetAt(sheetIndex);
sheetNames.add(sheet.getSheetName());
}
return sheetNames;
}
/**
* 根據標題獲取excel數據
*
* @param excel
* 數據對象
* @param rowsValues
* 數據
* @return
*/
public static final void readTitleRowValues(Excel excel, SheetDatas datas) {
Object objTitles = excel.getObjTitles();
String titleSplit = excel.getTitleSplit();
int titleRowIndex = excel.getTitleRow();
List<List<Object>> rowsValues = datas.getRowValues();
datas.setTitleRowValues(readTitleRowValues(objTitles, titleSplit, titleRowIndex, rowsValues));
}
/**
* 根據標題獲取excel數據
*
* @param objTitles
* 標題對象
* @param titleSplit
* 標題分割符
* @param titleRowIndex
* 標題行索引
* @param rowsValues
* 值
* @return
*/
@SuppressWarnings("unchecked")
public static final List<Map<String, Object>> readTitleRowValues(Object objTitles, String titleSplit, int titleRowIndex, List<List<Object>> rowsValues) {
// 行值->{標題:值}
List<Map<String, Object>> titleRowValues = new ArrayList<Map<String, Object>>();
if (rowsValues != null) {
// 標題對應的數據索引
Map<String, Integer> titlesIndex = new HashMap<String, Integer>();
if (objTitles instanceof String[]) {
String[] titleKeys = (String[]) objTitles;
for (String title : titleKeys) {
titlesIndex.put(title, -1);
}
} else if (objTitles instanceof Collection) {
Collection<String> titleKeys = (Collection<String>) objTitles;
for (String title : titleKeys) {
titlesIndex.put(title, -1);
}
} else {
return titleRowValues;
}
// System.out.println("總行數:" + datasLst.size());
if (rowsValues.size() > 0) {
// 設置標題項
List<Object> titleDatas = rowsValues.get(titleRowIndex);
for (int i = 0; i < titleDatas.size(); i++) {
String value = JavaUtil.objToStr(titleDatas.get(i));
for (String title : titlesIndex.keySet()) {
String[] titles = JavaUtil.split(title, titleSplit);
String thisTitle = titles[0];
if (thisTitle.equals(value)) {
// 如果標題相同,設置列索引
titlesIndex.put(title, i);
break;
}
}
// System.out.print(value + "\t\t");
}
// System.out.println();
// System.out.println(titlesIndex);
for (int i = 0; i < rowsValues.size(); i++) {
if (i == titleRowIndex) {
// 去除標題行
continue;
}
List<Object> rowDatas = rowsValues.get(i);
Map<String, Object> rowValue = new HashMap<String, Object>();
// 添加數據
titleRowValues.add(rowValue);
for (String title : titlesIndex.keySet()) {
// 獲取列索引
Integer colIndex = titlesIndex.get(title);
// 根據列索引獲取數據
Object value = null;
if (colIndex != -1) {
if (rowDatas.size()>colIndex){
value = rowDatas.get(colIndex);
}
}
String[] titles = JavaUtil.split(title, titleSplit);
String thisTitle = titles[0];
if (titles.length > 1) {
// 別名
thisTitle = titles[1];
}
// 設置行數據{title,value}
rowValue.put(thisTitle, value);
}
}
// System.out.println(rowValues);
}
}
return titleRowValues;
}
/**
* 讀取excel
*
* @param excel
* excel對象
* @return 所有行列數據對象
* @throws Exception
*/
public static final DatasKeySheets readExcel(final Excel excel) throws Exception {
return readExcel(excel, null);
}
/**
* 讀取excel
*
* @param excel
* excel對象
* @param excelI
* excelI接口
* @return 所有行列數據對象
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public static final DatasKeySheets readExcel(final Excel excel, final ExcelI excelI) throws Exception {
excel.initWorkbook();
Workbook wb = excel.getWb();
// key:index/sheet/sheetName
DatasKeySheets datasKeySheets = new DatasKeySheets();
List<SheetDatas> sheetDatas = new ArrayList<SheetDatas>();
Sheet sheet = null;
int sheetCount = wb.getNumberOfSheets();
// 獲得sheet工作簿Sheet
Object sheetValue = excel.getSheetValue();
boolean isUseTitleData = excel.getObjTitles() != null;
if (sheetValue == null) {
// 循環所有sheet
for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) {
// 獲得sheet工作簿Sheet
sheet = wb.getSheetAt(sheetIndex);
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(sheetIndex);
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
} else {
if (sheetValue instanceof String) {
String sheetName = String.valueOf(sheetValue);
sheet = wb.getSheet(sheetName);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(wb.getSheetIndex(sheet));
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
} else if (sheetValue instanceof Integer) {
Integer sheetIndex = Integer.parseInt(String.valueOf(sheetValue));
sheet = wb.getSheetAt(sheetIndex);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(sheetIndex);
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
} else if (sheetValue instanceof String[]) {
String[] sheetNames = (String[]) sheetValue;
for (String sheetName : sheetNames) {
sheet = wb.getSheet(sheetName);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(wb.getSheetIndex(sheet));
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
}
} else if (sheetValue instanceof int[]) {
int[] sheetIndexs = (int[]) sheetValue;
for (int a = 0; a < sheetIndexs.length; a++) {
sheet = wb.getSheetAt(a);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(a);
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
}
} else if (sheetValue instanceof Integer[]) {
Integer[] sheetIndexs = (Integer[]) sheetValue;
for (int a = 0; a < sheetIndexs.length; a++) {
sheet = wb.getSheetAt(a);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(a);
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
}
} else if (sheetValue instanceof Collection) {
Collection sheetCollection = (Collection) sheetValue;
Iterator it = sheetCollection.iterator();
while (it.hasNext()) {
Object ito = it.next();
if (ito instanceof Integer) {
int sheetIndex = Integer.parseInt(String.valueOf(ito));
sheet = wb.getSheetAt(sheetIndex);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(sheetIndex);
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
} else if (ito instanceof String) {
String sheetName = String.valueOf(ito);
sheet = wb.getSheet(sheetName);
if (sheet != null) {
SheetDatas datas = new SheetDatas();
datas.setSheetIndex(wb.getSheetIndex(sheet));
datas.setSheetName(sheet.getSheetName());
datas.setSheet(sheet);
sheetDatas.add(datas);
readRowValue(excel, sheet, datas, excelI);
if (isUseTitleData) {
readTitleRowValues(excel, datas);
}
}
}
}
} else {
throw new Exception("不支持類型:" + sheetValue);
}
}
datasKeySheets.setSheetDatas(sheetDatas);
datasKeySheets.setSheetCount(sheetCount);
return datasKeySheets;
}
/**
* 讀取sheet行列集合(正常)
*
* @param sheet
* @param datas
* @param excelI
* @throws Exception
*/
public static final void readRowValue(final Excel excel, final Sheet sheet, final SheetDatas datas, final ExcelI excelI) throws Exception {
ReadExcelI rexcelI = null;
if (excelI != null) {
rexcelI = (ReadExcelI) excelI;
}
// 行列數據
List<List<Object>> rowValues = new ArrayList<List<Object>>();
int endRowIndex = rexcelI == null ? ExcelI.END_ROW_INDEX : rexcelI.getEndRowIndex();
int endColumnIndex = rexcelI == null ? ExcelI.END_COLUMN_INDEX : rexcelI.getEndColumnIndex();
// 循環sheet中的所有行數據
for (int rowIndex = rexcelI == null ? ExcelI.START_ROW_INDEX : rexcelI.getStartRowIndex(); rowIndex <= sheet.getLastRowNum(); rowIndex++) {
// 是否結束
if (endRowIndex != -1 && rowIndex > endRowIndex)
break;
if (rexcelI != null && rexcelI.filterRow(sheet, rowIndex)) {
// ("sheetName:" + sheet.getSheetName() + ",第" + rowIndex + "行數據已被過慮");
continue;
}
// 獲得行對象
Row row = sheet.getRow(rowIndex);
// 判斷是否一行全部為""或null
boolean notNull = excel.isAddRowNull();
if (null != row) {
// 行數據
List<Object> rowValue = new ArrayList<Object>();
// // 添加標題索引值
// if (excel.getTitleKeys() != null && rowIndex == ExcelI.START_ROW_INDEX) {
// for (int ci = 0; ci < rowTitle.getLastCellNum(); ci++) {
// String titleKey = null;
// if (excel.getTitleKeys().size() > ci) {
// titleKey = excel.getTitleKeys().get(ci);
// } else {
// // 默認當前單元格式值
// Cell cell = row.getCell(ci);
// Object value = readCellString(cell);
// value = rexcelI == null ? value : rexcelI.readValue(sheet, rowIndex, ci, value);
// titleKey = JavaUtil.objToStr(value);
// }
// rowsDataMap.put(titleKey, new ArrayList<Map<String,SheetData>>());
// }
// }
// 獲得本行中單元格的個數
// 遍歷列cell
for (int columnIndex = rexcelI == null ? 0 : rexcelI.getStartColumnIndex(); columnIndex < row.getLastCellNum(); columnIndex++) {
// 是否結束
if (endColumnIndex != -1 && columnIndex > endColumnIndex)
break;
Cell cell = row.getCell(columnIndex);
// 獲得指定單元格中的數據
Object value = readCellString(cell);
value = rexcelI == null ? value : rexcelI.readValue(sheet, rowIndex, columnIndex, value);
if (!notNull && CheckUtil.isNotNull(JavaUtil.objToStr(value))) {
notNull = true;
}
rowValue.add(value);
}
if (notNull) {
rowValues.add(rowValue);
}
} else {
List<Object> rowValue = new ArrayList<Object>();
if (notNull) {
rowValues.add(rowValue);
}
}
}
// 刪除判斷最后行是否一行全部為""或null
List<List<Object>> addRowsNull = new ArrayList<List<Object>>();
boolean notNull = false;
for (int b = rowValues.size() - 1; b >= 0; b--) {
List<Object> datasNull = rowValues.get(b);
for (Object value : datasNull) {
if (!notNull && CheckUtil.isNotNull(JavaUtil.objToStr(value))) {
notNull = true;
break;
}
}
if (notNull) {
break;
}
addRowsNull.add(datasNull);
}
for (List<Object> datasNull : addRowsNull) {
rowValues.remove(datasNull);
}
datas.setRowValues(rowValues);
}
/**
* 獲取導出的excel的sheet,復制新模板sheet
*
* @param excel
* @return
* @throws Exception
*/
public static Set<Sheet> readSheets(final ExcelTemplate excel) throws Exception {
Set<Sheet> sheets = new HashSet<Sheet>();
excel.initWorkbook();
Workbook wb = excel.getWb();
// key:index/sheet/sheetName
Sheet sheet = null;
int sheetCount = wb.getNumberOfSheets();
// 獲得sheet工作簿Sheet
Object sheetValue = excel.getSheetValue();
// if (sheetValue == null) {
// // 循環所有sheet
// for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) {
// // 獲得sheet工作簿Sheet
// sheet = wb.getSheetAt(sheetIndex);
// sheets.add(sheet);
// }
// } else {
// if (sheetValue instanceof String) {
// String sheetName = String.valueOf(sheetValue);
// // 取得
// sheet = wb.getSheet(sheetName);
// sheets.add(sheet);
// } else if (sheetValue instanceof Integer) {
// Integer sheetIndex = Integer.parseInt(String.valueOf(sheetValue));
// sheet = wb.getSheetAt(sheetIndex);
// sheets.add(sheet);
// } else if (sheetValue instanceof String[]) {
// String[] sheetNames = (String[]) sheetValue;
// for (String sheetName : sheetNames) {
// sheet = wb.getSheet(sheetName);
// //wb.setSheetName(wb.getSheetIndex(sheet), sheetName + "--zhangjun");
// sheets.add(sheet);
// }
// } else if (sheetValue instanceof int[]) {
// int[] sheetIndexs = (int[]) sheetValue;
// for (int a = 0; a < sheetIndexs.length; a++) {
// sheet = wb.getSheetAt(a);
// sheets.add(sheet);
// }
// } else if (sheetValue instanceof Integer[]) {
// Integer[] sheetIndexs = (Integer[]) sheetValue;
// for (int a = 0; a < sheetIndexs.length; a++) {
// sheet = wb.getSheetAt(a);
// sheets.add(sheet);
// }
// } else if (sheetValue instanceof Collection) {
// Collection sheetCollection = (Collection) sheetValue;
// Iterator it = sheetCollection.iterator();
// while (it.hasNext()) {
// Object ito = it.next();
// if (ito instanceof Integer) {
// int sheetIndex = Integer.parseInt(String.valueOf(ito));
// sheet = wb.getSheetAt(sheetIndex);
// sheets.add(sheet);
// } else if (ito instanceof String) {
// String sheetName = String.valueOf(ito);
// sheet = wb.getSheet(sheetName);
// sheets.add(sheet);
// }
// }
// } else {
// throw new Exception("不支持類型:" + sheetValue);
// }
// }
if (sheetValue == null) {
// 循環所有sheet
for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) {
// 獲得sheet工作簿Sheet
sheet = wb.getSheetAt(sheetIndex);
addWriteSheetVariable(excel, sheets, sheet);
}
} else {
if (sheetValue instanceof String) {
String sheetNames = String.valueOf(sheetValue);
sheet = readCloneSheet(wb, excel, sheetNames);
addWriteSheetVariable(excel, sheets, sheet);
} else if (sheetValue instanceof Integer) {
Integer sheetIndex = Integer.parseInt(String.valueOf(sheetValue));
sheet = wb.getSheetAt(sheetIndex);
addWriteSheetVariable(excel, sheets, sheet);
} else if (sheetValue instanceof String[]) {
String[] sheetNameAry = (String[]) sheetValue;
for (String sheetNames : sheetNameAry) {
sheet = readCloneSheet(wb, excel, sheetNames);
addWriteSheetVariable(excel, sheets, sheet);
}
} else if (sheetValue instanceof int[]) {
int[] sheetIndexs = (int[]) sheetValue;
for (int a = 0; a < sheetIndexs.length; a++) {
sheet = wb.getSheetAt(a);
addWriteSheetVariable(excel, sheets, sheet);
}
} else if (sheetValue instanceof Integer[]) {
Integer[] sheetIndexs = (Integer[]) sheetValue;
for (int a = 0; a < sheetIndexs.length; a++) {
sheet = wb.getSheetAt(a);
addWriteSheetVariable(excel, sheets, sheet);
}
} else if (sheetValue instanceof Collection) {
Collection<?> sheetCollection = (Collection<?>) sheetValue;
Iterator<?> it = sheetCollection.iterator();
while (it.hasNext()) {
Object ito = it.next();
if (ito instanceof Integer) {
int sheetIndex = Integer.parseInt(String.valueOf(ito));
sheet = wb.getSheetAt(sheetIndex);
addWriteSheetVariable(excel, sheets, sheet);
} else if (ito instanceof String) {
String sheetNames = String.valueOf(ito);
sheet = readCloneSheet(wb, excel, sheetNames);
addWriteSheetVariable(excel, sheets, sheet);
}
}
} else {
throw new Exception("不支持類型:" + sheetValue);
}
}
return sheets;
}
private static void addWriteSheetVariable(final ExcelTemplate excel, Set<Sheet> sheets, Sheet sheet) {
if (sheet != null) {
sheets.add(sheet);
excel.addedSheets.add(sheet.getSheetName());
}
}
/**
* 獲取sheet對象
*
* @param wb
* @param sheetNames
* @return
*/
private static Sheet readCloneSheet(final Workbook wb, final ExcelTemplate excel, final String sheetNames) {
String sheetNamesAry[] = JavaUtil.split(sheetNames, "*");
String sheetName = "";
String newSheetName = "";
if (sheetNamesAry.length > 0) {
sheetName = sheetNamesAry[0];
}
if (sheetNamesAry.length > 1) {
newSheetName = sheetNamesAry[1];
}
Sheet sheet = wb.getSheet(sheetName);
if (sheet != null) {
// 重點:針對輸出多個模板sheet時,模板sheet名稱取值一定要唯一,由于使用過sheet之后會重新重命名原來的模板名,否則添加多個sheet無法進行判斷
if (CheckUtil.isNull(newSheetName)) {
// 沒有重命名,克隆后,此時無法進行一個sheet模板輸出多個sheet,因為在輸出時已經把模板sheet重寫了
} else {
if (sheetName.equals(newSheetName)) {
} else {
// 重命名
int index = wb.getSheetIndex(sheet);
// 被克隆對象
Sheet cloneSheet = wb.cloneSheet(index);
// 重命名(克隆后,還原以前的模板名)
wb.setSheetName(index, newSheetName);
// 重命名復制模板sheet的名字
int cloneIndex = wb.getSheetIndex(cloneSheet);
wb.setSheetName(cloneIndex, sheetName);
excel.templateSheets.add(cloneSheet.getSheetName());
}
}
}
return sheet;
}
/**
* 讀取excel某個單元格值的索引號
*
* @param excel
* excel對象
* @param params
* 參數
* @return 單元格值
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
* @throws Exception
*/
public static final Map<ConstantForEnum.CellValueKey, Integer> readCellValueIndex(final Excel excel, Map<ConstantForEnum.CellValueKey, Object> params) throws Exception {
Map<ConstantForEnum.CellValueKey, Integer> returnMap = new HashMap<ConstantForEnum.CellValueKey, Integer>();
returnMap.put(ConstantForEnum.CellValueKey.ROW_INDEX, -1);
returnMap.put(ConstantForEnum.CellValueKey.COLUMN_INDEX, -1);
String value = JavaUtil.trim(JavaUtil.objToStr(params.get(ConstantForEnum.CellValueKey.VALUE)));
Object valueCountObj = params.get(ConstantForEnum.CellValueKey.VALUE_COUNT);
boolean valueCountMatch = TypeUtil.Primitive.booleanValue(params.get(ConstantForEnum.CellValueKey.VALUE_COUNT_MATCH));
Object valueRowObj = params.get(ConstantForEnum.CellValueKey.VALUE_ROW);
Object valueColumnObj = params.get(ConstantForEnum.CellValueKey.VALUE_COLUMN);
int valueRow = -1;
int valueColumn = -1;
if (valueRowObj != null) {
valueRow = TypeUtil.Primitive.intValue(valueRowObj);
}
if (valueColumnObj != null) {
valueColumn = TypeUtil.Primitive.intValue(valueColumnObj);
}
int valueCount = 1;
if (valueCountObj != null) {
valueCount = TypeUtil.Primitive.intValue(valueCountObj);
}
if (CheckUtil.isNull(value)) {
// logger.debug("查詢值不能為空");
return returnMap;
}
int valueCountDefault = 0;
int tempRowCount = -1;
int tempColumnCount = -1;
Sheet sheet = readSheet(excel);
// 如果未指定查詢行,則查詢所有行,否則只查詢一行,從valueRow開始到valueRow+1結束
int startRows = -1;
int rows = -1;
if (valueRow == -1) {
startRows = 0;
rows = sheet.getLastRowNum();
} else {
startRows = valueRow;
rows = valueRow + 1;
}
for (int i = startRows; i < rows; i++) {
Row row = sheet.getRow(i);
if (row == null) {
// logger.debug("第[" + i + "]行對象為null,繼續下個行對象查詢");
continue;
}
int startColumns = -1;
int columns = -1;
if (valueColumn == -1) {
startColumns = 0;
columns = row.getLastCellNum();
} else {
startColumns = valueColumn;
columns = valueColumn + 1;
}
breakFor: for (int j = startColumns; j < columns; j++) {
Cell cell = row.getCell(j);
if (cell == null) {
// logger.debug("第[" + i + "]行第[" + j + "]列單元格對象為null,繼續下個單元格查詢");
continue;
}
Object obj = readCellString(cell);
String cellValue = JavaUtil.trim(JavaUtil.objToStr(obj));
if (valueCountDefault != valueCount) {
// 如果未找到指定的匹配索引,則繼續查找
if (value.equals(cellValue)) {
tempRowCount = i;
tempColumnCount = j;
valueCountDefault++;
}
}
if (tempRowCount != -1 && tempColumnCount != -1) {
// 獲取行列索引,判斷行列第幾個
if (valueCountDefault == valueCount) {
// logger.debug("找到位置了行[" + tempRowCount + "]列[" + tempColumnCount + "]第[" + valueCount + "]個值");
break breakFor;
}
}
}
}
if (tempRowCount == -1 || tempColumnCount == -1) {
// logger.debug("沒有找到位置了行[" + tempRowCount + "]列[" + tempColumnCount + "]第[" + valueCount + "]個值");
return returnMap;
} else {
if (valueCountMatch && valueCountDefault != valueCount) {
// logger.debug("行必須匹配,沒有找到位置了行[" + tempRowCount + "]列[" + tempColumnCount + "][最多第(" + valueCountDefault + ")個與配置第(" + valueCount + ")個值不同]");
return returnMap;
}
returnMap.put(ConstantForEnum.CellValueKey.ROW_INDEX, tempRowCount);
returnMap.put(ConstantForEnum.CellValueKey.COLUMN_INDEX, tempColumnCount);
}
return returnMap;
}
/**
* 讀取excel某個單元格值
*
* @param excel
* excel對象
* @param params
* 參數
* @return 單元格值
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
* @throws Exception
*/
public static final Object readCellValue(final Excel excel, Map<ConstantForEnum.CellValueKey, Object> params) throws Exception {
Object rowIndexObj = params.get(ConstantForEnum.CellValueKey.ROW_INDEX);
Object columnIndexObj = params.get(ConstantForEnum.CellValueKey.COLUMN_INDEX);
if (rowIndexObj == null || columnIndexObj == null) {
Sheet sheet = readSheet(excel);
Map<ConstantForEnum.CellValueKey, Object> paramsRow = new HashMap<ConstantForEnum.CellValueKey, Object>();
paramsRow.put(ConstantForEnum.CellValueKey.VALUE, params.get(ConstantForEnum.CellValueKey.ROW_VALUE));
paramsRow.put(ConstantForEnum.CellValueKey.VALUE_COUNT, params.get(ConstantForEnum.CellValueKey.ROW_COUNT));
paramsRow.put(ConstantForEnum.CellValueKey.VALUE_COUNT_MATCH, params.get(ConstantForEnum.CellValueKey.ROW_COUNT_MATCH));
Map<ConstantForEnum.CellValueKey, Integer> returnRowIndex = ExcelReadUtil.readCellValueIndex(excel, paramsRow);
int tempRowCount = returnRowIndex.get(ConstantForEnum.CellValueKey.ROW_INDEX);
if (tempRowCount == -1) {
return null;
}
Map<ConstantForEnum.CellValueKey, Object> paramsColumn = new HashMap<ConstantForEnum.CellValueKey, Object>();
paramsColumn.put(ConstantForEnum.CellValueKey.VALUE, params.get(ConstantForEnum.CellValueKey.COLUMN_VALUE));
paramsColumn.put(ConstantForEnum.CellValueKey.VALUE_COUNT, params.get(ConstantForEnum.CellValueKey.COLUMN_COUNT));
paramsColumn.put(ConstantForEnum.CellValueKey.VALUE_COUNT_MATCH, params.get(ConstantForEnum.CellValueKey.COLUMN_COUNT_MATCH));
Map<ConstantForEnum.CellValueKey, Integer> returnColumnIndex = ExcelReadUtil.readCellValueIndex(excel, paramsColumn);
int tempColumnCount = returnColumnIndex.get(ConstantForEnum.CellValueKey.COLUMN_INDEX);
if (tempColumnCount == -1) {
return null;
}
return readCellString(sheet.getRow(tempRowCount).getCell(tempColumnCount));
// String rowValue = JavaUtil.trim(JavaUtil.objToStr(params.get(ConstantForEnum.CellValueKey.ROW_VALUE)));
// String columnValue = JavaUtil.trim(JavaUtil.objToStr(params.get(ConstantForEnum.CellValueKey.COLUMN_VALUE)));
// Object rowCountObj = params.get(ConstantForEnum.CellValueKey.ROW_COUNT);
// Object columnCountObj = params.get(ConstantForEnum.CellValueKey.COLUMN_COUNT);
// boolean rowCountMatch = TypeUtil.Primitive.booleanValue(params.get(ConstantForEnum.CellValueKey.ROW_COUNT_MATCH));
// boolean columnCountMatch = TypeUtil.Primitive.booleanValue(params.get(ConstantForEnum.CellValueKey.COLUMN_COUNT_MATCH));
// int rowCount = 1;
// int columnCount = 1;
// if (rowCountObj != null) {
// rowCount = TypeUtil.Primitive.intValue(rowCountObj);
// }
// if (columnCountObj != null) {
// columnCount = TypeUtil.Primitive.intValue(columnCountObj);
// }
// if (CheckUtil.isNull(rowValue) || CheckUtil.isNull(columnValue)) {
// logger.debug("行[" + rowValue + "]或列[" + columnValue + "]值不能為空");
// return null;
// }
// int rowCountDefault = 0;
// int columnCountDefault = 0;
// int tempRowCount = -1;
// int tempColumnCount = -1;
// Sheet sheet = getSheet(excel);
// for (int i = 0; i < sheet.getLastRowNum(); i++) {
// Row row = sheet.getRow(i);
// if (row == null) {
// logger.debug("第[" + i + "]行對象為null,繼續下個行對象查詢");
// continue;
// }
// breakFor: for (int j = 0; j < row.getLastCellNum(); j++) {
// Cell cell = row.getCell(j);
// if (cell == null) {
// logger.debug("第[" + i + "]行第[" + j + "]列單元格對象為null,繼續下個單元格查詢");
// continue;
// }
// Object obj = readCellString(cell);
// String value = JavaUtil.trim(JavaUtil.objToStr(obj));
// if (rowCountDefault != rowCount) {
// // 如果未找到指定的匹配行索引,則繼續查找
// if (rowValue.equals(value)) {
// tempRowCount = i;
// rowCountDefault++;
// }
// }
// if (columnCountDefault != columnCount) {
// // 如果未找到指定的匹配列索引,則繼續查找
// if (columnValue.equals(value)) {
// tempColumnCount = j;
// columnCountDefault++;
// }
// }
// if (tempRowCount != -1 && tempColumnCount != -1) {
// // 獲取行列索引,判斷行列第幾個
// if (rowCountDefault == rowCount && columnCountDefault == columnCount) {
// logger.debug("找到位置了行[" + tempRowCount + "]第[" + rowCount + "]個值,列[" + tempColumnCount + "]第[" + columnCount + "]個值");
// break breakFor;
// }
// }
// }
// }
// if (tempRowCount == -1 || tempColumnCount == -1) {
// logger.debug("沒有找到位置了行[" + tempRowCount + "]第[" + rowCount + "]個值,列[" + tempColumnCount + "]第[" + columnCount + "]個值");
// return null;
// } else {
// if (rowCountMatch && rowCountDefault != rowCount) {
// logger.debug("行必須匹配,沒有找到位置了行[" + tempRowCount + "][最多第(" + rowCountDefault + ")個與配置第(" + rowCount + ")個值不同],列[" + tempColumnCount + "]第[" + columnCount + "]個值");
// return null;
// }
// if (columnCountMatch && columnCountDefault != columnCount) {
// logger.debug("列必須匹配,沒有找到位置了行[" + tempRowCount + "]第[" + rowCount + "]個值,列[" + tempColumnCount + "][最多第(" + columnCountDefault + ")個與配置第(" + columnCount + ")個值不同]");
// return null;
// }
// return readCellString(sheet.getRow(tempRowCount).getCell(tempColumnCount));
// }
} else {
int rowIndex = TypeUtil.Primitive.intValue(rowIndexObj);
int columnIndex = TypeUtil.Primitive.intValue(columnIndexObj);
if (rowIndex == -1 || columnIndex == -1) {
// logger.debug("行[" + rowIndex + "]或列[" + columnIndex + "]索引值不能小于0");
return null;
}
Sheet sheet = readSheet(excel);
Row row = sheet.getRow(TypeUtil.Primitive.intValue(rowIndexObj));
if (row == null) {
// logger.debug("第[" + rowIndex + "]行對象為null");
return null;
}
Cell cell = row.getCell(columnIndex);
if (cell == null) {
// logger.debug("第[" + rowIndex + "]行第[" + columnIndex + "]列單元格對象為null");
return null;
}
return readCellString(cell);
}
}
/**
* 獲取sheet對象
*
* @return sheet對象
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
* @throws Exception
*/
public static Sheet readSheet(final Excel excel) throws Exception {
excel.initWorkbook();
Workbook wb = excel.getWb();
// key:index/sheet/sheetName
Sheet sheet = null;
// 獲得sheet工作簿Sheet
Object sheetValue = excel.getSheetValue();
if (sheetValue == null) {
sheet = wb.getSheetAt(0);
} else {
if (sheetValue instanceof String) {
String sheetName = String.valueOf(sheetValue);
sheet = wb.getSheet(sheetName);
} else if (sheetValue instanceof Integer) {
Integer sheetCount = Integer.parseInt(String.valueOf(sheetValue));
sheet = wb.getSheetAt(sheetCount);
}
}
return sheet;
}
/**
* 判斷指定的單元格是否是合并單元格
*
* @param sheet
* @param row
* 行下標
* @param column
* 列下標
* @return null:沒有合并,非null,有合并
*/
public static final CellRangeAddress readMergedRegion(final Sheet sheet, final int row, final int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return range;
}
}
}
return null;
}
/**
* 獲取一個cell的數據類型
*
* @param cell
* @return
*/
public static final Object readCell(final Cell cell) {
Object result = null;
try {
result = cell.getRichStringCellValue();
} catch (Exception e) {
try {
result = cell.getNumericCellValue();
} catch (Exception e2) {
try {
result = cell.getDateCellValue();
} catch (Exception e3) {
try {
result = cell.getBooleanCellValue();
} catch (Exception e4) {
logger.error("獲取excel公式結果出錯:[" + cell.getRowIndex() + "][" + cell.getColumnIndex() + "]", e4);
// 返回公式
result = "=" + cell.getCellFormula();
}
}
}
}
return result;
}
/**
* 獲取一個cell的數據類型
*
* @param cell
* @return
*/
public static final Object readCellString(final Cell cell) {
Object result = null;
if (cell != null) {
// 單元格類型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5
int cellType = cell.getCellType();
try {
switch (cellType) {
case Cell.CELL_TYPE_STRING:
result = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
result = cell.getDateCellValue();
} else {
result = cell.getNumericCellValue();
}
break;
case Cell.CELL_TYPE_FORMULA:
result = readCell(cell);
break;
case Cell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
result = null;
break;
case Cell.CELL_TYPE_ERROR:
result = null;
break;
default:
break;
}
} catch (Exception e) {
// 讀取文本
logger.error("讀取格式行列[" + cell.getRowIndex() + "," + cell.getColumnIndex() + "]出錯,改成讀取文本:" + e.getMessage());
try {
result = cell.getRichStringCellValue().getString();
} catch (Exception e1) {
logger.error("改成讀取文本出錯,返回null:" + e1.getMessage());
return null;
}
}
}
return JavaUtil.getIsNumValue(result);
}
}
本文為張軍原創文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://www.dlhighland.cn
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

