import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.testng.Assert;
import jxl.*;
/**
* Excel放在Data文件夾下 Excel命名方式:測試類名.xls Excel的sheet命名方式:測試方法名 Excel第一行為Map的key
*
* @ClassName: ExcelDataProvider
* @Description: TODO(讀取Excel數據)
* 設計思想:一個Excel文本代表一個測試類,一個sheet代表一個測試方法,一個Excel文本中擁有多個sheet(
* 即一個類中多個測試方法)
*/
public class ExcelData implements Iterator<Object[]> {
private Workbook book = null;
private Sheet sheet = null;
private int rowNum = 0;
private int currentRowNo = 0;
private int columnNum = 0;
private String[] columnnName;
/* 構造方法:初始化一個Excel文本對象,並獲取key值 */
public ExcelData(String classname, String methodname) {
try {
int dotNum = classname.indexOf(".");
if (dotNum > 0) {
classname = classname.substring(classname.lastIndexOf(".") + 1, classname.length());
}
// 從/data文件夾下讀取以類名命名的excel文件
String path = "C:/Users/Administrator/Desktop/" + classname + ".xls";
InputStream inputStream = new FileInputStream(path);
book = Workbook.getWorkbook(inputStream);
// 獲取單個sheet
sheet = book.getSheet(methodname);
// 獲取sheet里的所有行
rowNum = sheet.getRows();
// 獲取第一行(即key)所有的單元格
Cell[] cell = sheet.getRow(0);
// 第一行所有單元格的長度
columnNum = cell.length;
// 創建一個以第一行所有單元格長度為長度的String類型的數組:columnnName
columnnName = new String[cell.length];
// 將第一行所有單元格里的內容(即key)存放到數組:columnnName中
for (int i = 0; i < cell.length; i++) {
columnnName[i] = cell[i].getContents().toString();
}
// 每一行存放完畢后,自動指向下一行
this.currentRowNo++;
} catch (Exception e) {
e.printStackTrace();
Assert.fail("unable to read Excel data");
}
}
/* 重寫hasNext()方法,用於判斷是否存在下一行 */
public boolean hasNext() {
// 若當前sheet中沒有任何內容,或者當前行號指向的行超出了當前sheet中的最大的行,結束讀取數據
if (this.rowNum == 0 || this.currentRowNo >= this.rowNum) {
try {
book.close();
} catch (Exception e) {
e.printStackTrace();
}
return false;
} else {
// sheet下一行內容為空判定結束
if ((sheet.getRow(currentRowNo))[0].getContents().equals(""))
return false;
return true;
}
}
/* 重寫next()方法,用於獲取當前行所有單元格里面的內容 */
public Object[] next() {
// 獲取當前行所有單元格對象
Cell[] c = sheet.getRow(this.currentRowNo);
Map<String, String> data = new HashMap<String, String>();
// 將單元格中的所有內容存放到map中,並指定key與value的對應關系
for (int i = 0; i < this.columnNum; i++) {
String temp = "";
try {
temp = c[i].getContents().toString();
} catch (ArrayIndexOutOfBoundsException ex) {
temp = "";
}
data.put(this.columnnName[i], temp);
}
// 創建一個只有一個元素的Object類型的數組,用於存放單次獲取的key與value值
Object object[] = new Object[1];
object[0] = data;
this.currentRowNo++;
return object;
}
public void remove() {
throw new UnsupportedOperationException("remove unsupported.");
}
}