利用java反射機制實現讀取excel表格中的數據


如果直接把excel表格中的數據導入數據庫,首先應該將excel中的數據讀取出來。

為了實現代碼重用,所以使用了Object,而最終的結果是要獲取一個list如List<User>、List<Book>等,所以需要使用泛型機制去實現。下面會給出代碼,可能會稍微復雜一點,但注釋很清晰,希望大家耐心閱讀。

在上代碼之前簡單說一下思路:

        1.excel表格必須有表頭,且表頭中各列的值要與實體類的屬性相同;

        2.先讀取表頭信息,然后獲取表頭列數,接着確定需要使用的set方法的名稱,並存到數組中;

        3.利用反射機制,獲取object對象的屬性,通過與excel表格表頭對比,確定各個屬性的類型,存到數組中(以excel表格中屬性的順序);

        4.遍歷除表頭行的數據,利用反射機制實例化對象,調用對應的set方法,方法參數通過3獲取;

上代碼:(需要使用poi包,請自行下載)

實體類User:

public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}
處理類:

package module.system.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
* 從excel讀取數據/往excel中寫入 excel有表頭,表頭每列的內容對應實體類的屬性
*
* @author nagsh
*
*/
public class ExcelManage {
private HSSFWorkbook workbook;

public ExcelManage(String fileDir) {
File file = new File(fileDir);
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 讀取excel表中的數據.
*
* @param sheetName
* 表格索引(EXCEL 是多表文檔,所以需要輸入表索引號,如sheet1)
*/
public List readFromExcel(String sheetName, Object object) {

List result = new ArrayList();
// 獲取該對象的class對象
Class class_ = object.getClass();
// 獲得該類的所有屬性
Field[] fields = class_.getDeclaredFields();

// 讀取excel數據
// 獲得指定的excel表
HSSFSheet sheet = workbook.getSheet(sheetName);
// 獲取表格的總行數
int rowCount = sheet.getLastRowNum() + 1; // 需要加一
if (rowCount < 1) {
return result;
}
// 獲取表頭的列數
int columnCount = sheet.getRow(0).getLastCellNum();
// 讀取表頭信息,確定需要用的方法名---set方法
// 用於存儲方法名
String[] methodNames = new String[columnCount]; // 表頭列數即為需要的set方法個數
// 用於存儲屬性類型
String[] fieldTypes = new String[columnCount];
// 獲得表頭行對象
HSSFRow titleRow = sheet.getRow(0);
// 遍歷
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { // 遍歷表頭列
String data = titleRow.getCell(columnIndex).toString(); // 某一列的內容
String Udata = Character.toUpperCase(data.charAt(0))
+ data.substring(1, data.length()); // 使其首字母大寫
methodNames[columnIndex] = "set" + Udata;
for (int i = 0; i < fields.length; i++) { // 遍歷屬性數組
if (data.equals(fields[i].getName())) { // 屬性與表頭相等
fieldTypes[columnIndex] = fields[i].getType().getName(); // 將屬性類型放到數組中
}
}
}
// 逐行讀取數據 從1開始 忽略表頭
for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {
// 獲得行對象
HSSFRow row = sheet.getRow(rowIndex);
if (row != null) {
Object obj = null;
// 實例化該泛型類的對象一個對象
try {
obj = class_.newInstance();
} catch (Exception e1) {
e1.printStackTrace();
}

// 獲得本行中各單元格中的數據
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
String data = row.getCell(columnIndex).toString();
// 獲取要調用方法的方法名
String methodName = methodNames[columnIndex];
Method method = null;
try {
// 這部分可自己擴展
if (fieldTypes[columnIndex].equals("java.lang.String")) {
method = class_.getDeclaredMethod(methodName,
String.class); // 設置要執行的方法--set方法參數為String
method.invoke(obj, data); // 執行該方法
} else if (fieldTypes[columnIndex].equals("int")) {
method = class_.getDeclaredMethod(methodName,
int.class); // 設置要執行的方法--set方法參數為int
double data_double = Double.parseDouble(data);
int data_int = (int) data_double;
method.invoke(obj, data_int); // 執行該方法
}
} catch (Exception e) {
e.printStackTrace();
}
}
result.add(obj);
}
}
return result;
}

public static void main(String[] args) {
ExcelManage em = new ExcelManage("E:/test.xls");
User user = new User();
List list = em.readFromExcel("sheet1", user);
for (int i = 0; i < list.size(); i++) {
User newUser = (User) list.get(i);
System.out.println(newUser.getId() + " " + newUser.getName() + " "
+ newUser.getPassword());
}

}

}
excel表格:



運行結果:

1 aa qqqq
2 bb wwwww
3 cc eeee
4 dd rrrr
5 ee tttt





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com