- Map<Integer,String> titles = new HashMap<>();
- XSSFRow titleRow = caseSheet.getRow(0);//得到列头
- //对列头下标进行循环,获取列头的值
- for (int i = 0; i < titleRow.getLastCellNum(); i++) {
- //i=0
- XSSFCell cell = titleRow.getCell(i);//得到列头单元格
- String value = getCellValue(cell).toString();//得到单元格的值
- titles.put(i,value);//i=0,得到数组{0,id};i=1,得到数组{1,isValid...}
- System.out.println("列头内容"+ value);
这段Java代码主要是用于从Excel的一个工作表(假设这个工作表叫做
caseSheet
)中获取第一行(标题行)的单元格内容,并将这些内容与它们在行中的位置索引(从0开始)作为键值对存储在一个HashMap
中。下面是代码的逐行解释:
Map
titles = new HashMap<>();
- 这行代码创建了一个新的
HashMap
对象,其键的类型是Integer
(代表列的索引),值的类型是String
(代表从Excel单元格中获取的文本值)。
XSSFRow titleRow = caseSheet.getRow(0);
- 这行代码从
caseSheet
工作表中获取第一行(索引为0),并将其存储在titleRow
变量中。XSSFRow
是Apache POI库中用于表示Excel行的一个类。
for (int i = 0; i < titleRow.getLastCellNum(); i++) {
- 这是一个for循环,用于遍历
titleRow
中的所有单元格。getLastCellNum()
方法返回行中最后一个单元格的索引(加1,因为索引是从0开始的),因此循环将从0开始,直到最后一个单元格的索引。
XSSFCell cell = titleRow.getCell(i);
- 这行代码获取
titleRow
中索引为i
的单元格,并将其存储在cell
变量中。XSSFCell
是Apache POI库中用于表示Excel单元格的一个类。
String value = getCellValue(cell).toString();
- 这行代码调用
getCellValue()
方法(该方法没有在提供的代码段中定义,但我们可以假设它用于获取单元格的值)来获取cell
的值,并将其转换为String
类型。
titles.put(i,value);
- 这行代码将单元格的值(作为字符串)和它在行中的索引(作为整数)作为键值对添加到
titles
的HashMap
中。
System.out.println("列头内容: " + value);
- 这行代码打印出“列头内容: ”(字面意思为“Header content: ”),后面跟着从当前单元格获取的文本值。这可以用于在控制台上查看从Excel单元格中提取的数据。
综上所述,该代码的主要目的是从Excel工作表的第一行中提取单元格内容,并将这些内容与它们在行中的位置索引作为键值对存储在一个
HashMap
中。同时,它还打印出每个单元格的内容,以便在控制台上查看。
- for (int i = 1; i <= caseSheet.getLastRowNum(); i++) {
- XSSFRow row = caseSheet.getRow(i);
- CaseInfo caseInfo = new CaseInfo();
- //基于行遍历每个单元格,因单元格类型有多种需进行判断
- for (int j = 0; j < row.getLastCellNum(); j++) {
- XSSFCell cell = row.getCell(j);
- //返回结果是22个单元格的值,二维数组{0=id,1=isValid...10=isDbCheck}
- Object value = getCellValue(cell);
-
- String title = titles.get(j);
- Field field= caseInfo.getClass().getDeclaredField(title);//找到类的属性,
- field.setAccessible(true);//给私有属性开通权限
- field.set(caseInfo,value);//强制给属性赋值,得到{0=id,1=isValid...10=isDbCheck}
- //第1个员工: caseInfo{id=1,isValid=YES...}
- //第2个员工: caseInfo{id=2,isValid=YES...}
- }
- System.out.println("每行员工,每个用例的内容" + caseInfo );
这段代码继续了之前的逻辑,现在它遍历Excel工作表中的每一行(从第二行开始,因为第一行被认为是标题行),并为每一行创建一个
CaseInfo
对象,然后将该行中的单元格值赋给CaseInfo
对象的相应属性。以下是代码的逐行解释:
for (int i = 1; i <= caseSheet.getLastRowNum(); i++) {
- 这行代码开始了一个循环,从第二行(索引为1)开始,遍历到工作表中的最后一行。
getLastRowNum()
方法返回工作表中的最后一行的索引(也是加1的)。
XSSFRow row = caseSheet.getRow(i);
- 获取当前循环中的行(第
i
行),并将其存储在row
变量中。
CaseInfo caseInfo = new CaseInfo();
- 为当前行创建一个新的
CaseInfo
对象。我们可以假设CaseInfo
是一个自定义的Java类,用于存储单个“用例”或“员工”的信息。
for (int j = 0; j < row.getLastCellNum(); j++) {
- 开始一个内部循环,遍历当前行中的所有单元格。
XSSFCell cell = row.getCell(j);
- 获取当前行中索引为
j
的单元格,并将其存储在cell
变量中。
Object value = getCellValue(cell);
- 调用
getCellValue()
方法(同样,这个方法在提供的代码段中没有定义)来获取单元格的值,并将其存储在value
变量中。这里返回的是一个Object
类型,因为单元格可能包含不同类型的数据(如字符串、数字、布尔值等)。
String title = titles.get(j);
- 从之前创建的标题映射
titles
中获取当前单元格对应的标题(列名),并将其存储在title
变量中。
Field field = caseInfo.getClass().getDeclaredField(title);
- 使用Java的反射API来获取
CaseInfo
类中名为title
的属性字段。getDeclaredField()
方法用于获取类中声明的指定名称的字段,包括私有字段。
field.setAccessible(true);
- 设置字段的访问权限为可访问,这样即使该字段是私有的,我们也可以在后续代码中对其进行读写操作。
field.set(caseInfo, value);
- 使用反射API将获取到的单元格值(
value
)设置到caseInfo
对象的相应属性字段中。这里使用了set()
方法,该方法接受两个参数:要设置值的对象实例和要设置的新值。
System.out.println("每行员工,每个用例的内容" + caseInfo);
- 在内部循环结束后(即处理完当前行的所有单元格后),打印出当前行的
CaseInfo
对象的内容。这可以帮助我们验证数据是否正确地被读取和设置到对象中。整体而言,这段代码的目的是从Excel工作表中读取数据,并将这些数据映射到Java对象(
CaseInfo
)中。通过使用反射API,代码能够动态地设置对象的属性,而不需要提前知道这些属性的具体类型和名称。这种方法在处理具有不固定结构的数据(如来自Excel的电子表格数据)时非常有用。