学习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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。