您好,登錄后才能下訂單哦!
學習excl操作
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 本類主要實現后綴為xlsx的 excel文件操作
*/
public class ExcelUtil {
private XSSFSheet ExcelWSheet; //excl單元格sheet頁面
private XSSFWorkbook ExcelWBook; //整個excl對象
private XSSFCell Cell; // 列對象
private XSSFRow Row;// 行對象
private String filePath; // 文件路徑
/** 構造方法 */
// 設定要操作的 Excel 的文件路徑和 Excel 文件中的 sheet 名稱
// 在讀寫excel的時候,均需要先調用此方法,設定要操作的 excel 文件路徑和要操作的 sheet 名稱
public ExcelUtil(String Path, String SheetName) throws Exception {
FileInputStream ExcelFile;
try {
// 實例化 excel 文件的 FileInputStream 對象
ExcelFile = new FileInputStream(Path);
// 實例化 excel 文件的 XSSFWorkbook 對象
ExcelWBook = new XSSFWorkbook(ExcelFile); //整個文件
// 實例化 XSSFSheet 對象,指定 excel 文件中的 sheet 名稱,后續用于 sheet 中行、列和單元格的操作
ExcelWSheet = ExcelWBook.getSheet(SheetName);
} catch (Exception e) {
throw (e);
}
this.filePath = Path;
}
// 讀取 excel 文件指定單元格的函數,此函數只支持后綴為xlsx的 excel 文件
public String getCellData(int RowNum, int ColNum) throws Exception {
try {
// 通過函數參數指定單元格的行號和列號,獲取指定的單元格對象
Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
// 如果單元格的內容為字符串類型,則使用 getStringCellValue 方法獲取單元格的內容
// 如果單元格的內容為數字類型,則使用 getNumericCellValue() 方法獲取單元格的內容
String CellData = "";
/** 獲取單元格類型 */
if (Cell.getCellType() == XSSFCell.CELL_TYPE_STRING) { // 如果是字符串
CellData = Cell.getStringCellValue();
} else if (Cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) { // 如果是數字
DecimalFormat df = new DecimalFormat("0");
CellData = df.format(Cell.getNumericCellValue());
}
return CellData;
} catch (Exception e) {
e.printStackTrace();
return ""; //如果異常返回空
}
}
/**在Excel文件的執行單元格中寫輸入數據,此函數只支持后綴為xlsx的文件寫入
* @param result 結果
* @param rowNum 行數
* @param cellNum 列數
* */
public void setCellData(int RowNum, int ColNum, String result) throws Exception {
try {
// 獲取 excel文件中的行對象
Row = ExcelWSheet.getRow(RowNum);
// 如果單元格為空,則返回 Null
Cell = Row.getCell(ColNum, Row.RETURN_BLANK_AS_NULL);
if (Cell == null ) {
// 當單元格對象是 null 的時候,則創建單元格
// 如果單元格為空,無法直接調用單元格對象的 setCellValue 方法設定單元格的值
Cell = Row.createCell(ColNum);
// 創建單元格后可以調用單元格對象的 setCellValue 方法設定單元格的值
Cell.setCellValue(result);
} else {
// 單元格中有內容,則可以直接調用單元格對象的 setCellValue 方法設定單元格的值
Cell.setCellValue(result);
System.out.println("執行完成");
}
// 實例化寫入 excel 文件的文件輸出流對象
FileOutputStream fileOut = new FileOutputStream(filePath);
// 將內容寫入 excel 文件中
ExcelWBook.write(fileOut);
// 調用flush 方法強制刷新寫入文件
fileOut.flush();
// 關閉文件輸出流對象
fileOut.close();
} catch (Exception e) {
e.printStackTrace();
throw (e);
}
}
/**從 excel 文件獲取測試數據的靜態方法*/
public static Object[][] getTestData(String excelFilePath, String sheetName) throws IOException {
// 根據參數傳入的數據文件路徑和文件名稱,組合出 excel 數據文件的絕對路徑
// 聲明一個 file 文件對象
File file = new File(excelFilePath);
// 創建 FileInputStream 對象用于讀取 excel 文件
FileInputStream inputStream = new FileInputStream(file);
// 聲明 Workbook 對象
Workbook Workbook = null;
// 獲取文件名參數的后綴名,判斷是xlsx文件還是xls文件
String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf("."));
// 判斷文件類型如果是xlsx,則使用 XSSFWorkbook 對象進行實例化 2007
// 判斷文件類型如果是xls,則使用 SSFWorkbook 對象進行實例化 2003
if (fileExtensionName.equals(".xlsx")) {
Workbook = new XSSFWorkbook(inputStream);
} else if (fileExtensionName.equals(".xls")) {
Workbook = new HSSFWorkbook(inputStream);
}
// 通過 sheetName 參數,生成 sheet 對象
Sheet Sheet = Workbook.getSheet(sheetName);
// 獲取 excel 數據文件中 sheet1中數據的行數,getLastRowNum 方法獲取數據的最后行號
// getFirstRowNum 方法獲取數據的第一行行號,相減之后算出數據的行數
// 注意:excel 文件的行號和列號都是從 0 開始
int rowCount = Sheet.getLastRowNum() - Sheet.getFirstRowNum();
System.out.println(rowCount);
// 創建名為 records 的 list 對象來存儲從 excel數據文件讀取的數據
//
List<Object[]> records = new ArrayList<Object[]>();
// 使用 2 個 for 循環遍歷 excel 數據文件的所有數據(除了第一行,第一行是數據列名稱)
// 所以 i 從1開始,而不是從 0; 0表示表頭
for (int i = 1; i <= rowCount; i++) {
// 使用 getRow 方法獲取行對象
Row row = Sheet.getRow(i);
/*
* 聲明一個數組,來存儲 excel 數據文件每行中的測試用例和數據,數組的大小用 getLastCellNum-1
* 來進行動態聲明,實現測試數據個數和數組大小相一致因為 excel 數據文件中
* 的測試數據行的最后一個單元格為測試執行結果,倒數第二個單元格為此測試數據行
* 是否運行的狀態位,所最后兩列的單元格數據并不需要傳入到測試方法中,所以使用 getLastCellNum-2
* 的方式去掉每行中的最后兩個單元格數據,計算出需要存儲的測試數據個數,并 作為測試數據數組的初始化大小
*/
String fields[] = new String[row.getLastCellNum() - 2];//最后兩行不是要的所以去掉2 fielcls存放結果
/*
* if 用于判斷數據行是否要參與測試的執行,excel 文件的倒數第二列為數據行的狀態位,標記為 *
* "y"表示此數據行要被測試腳本執行,標記為非"y"的數據行均被認為不會參與測試腳本的執行,會 被跳過
*/
System.out.println(row.getCell(row.getLastCellNum() - 2).getStringCellValue());
if (row.getCell(row.getLastCellNum() - 2).getStringCellValue().equals("y")) { //y判斷是否之執行。 equalsIgnoreCase
for (int j = 0; j < row.getLastCellNum() - 2; j++) {
// 判斷excel 的單元格字段是數字還是字符,字符串格式調用 getStringCellValue 方法獲取
// 數字格式調用 getNumericCellValue 方法獲取
if (row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_STRING) { //字符串
fields[j] = row.getCell(j).getStringCellValue();
} else if (row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
DecimalFormat df = new DecimalFormat("0");
fields[j] = df.format(row.getCell(j).getNumericCellValue());
} else {
System.out.println("格式錯誤");
}
}
// fields 的數據對象存儲到 records的 list 中
records.add(fields);
}
}
// 定義函數返回值,即 Object[][]
// 將存儲測試數據的 list 轉換為一個 Object 的二維數組
Object[][] results = new Object[records.size()][];
// 設置二維數組每行的值,每行是個object對象
for (int i = 0; i < records.size(); i++) {
results[i] = records.get(i);
}
// 關閉 excel 文件
return results;
}
public int getLastColumnNum() {
// 返回數據文件的最后一列的列號,如果有12列,則結果返回 11
return ExcelWSheet.getRow(0).getLastCellNum() - 1;
}
public static void main(String[] args) throws Exception
{
// ExcelUtil eu=new ExcelUtil("configs/test.xlsx", "Sheet1");
// eu.setCellData(2, 7, "執行失敗"); // 寫入ok
// System.out.println(eu.getCellData(1, 2)); //讀取ok
//
System.out.println("讀取:");
Object[][] obd = getTestData("D:\\TOOL\\sysbj\\BjToon\\configs\\test.xlsx", "Sheet3");
for(int i =0 ; i < obd.length; i++)
{
Object[] obl = obd[i];
System.out.println("=============");
for(int j = 0; j < obl.length; j++)
{
System.out.println(obl[j]);
}
}
System.out.println("excle讀取成功:");
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。