创建新工程
打开Eclipse新建一个工程
点下一步
输入名称
点完成
新建一个目录用来存在第三方库文件
选择目录
点下一步
输入目录名称,这里我输入的是lib
>
点完成
我这里用的POI的jar包读写Excel,你也可以用jxl的jar包读写Excel
如果是poi的就需要以下这些jar文件
现在将jar类加载到工程中,后面编写代码才能正确调用
现在新建一个包,开始编写代码
点完成
现在再在刚才的包中新建一个类,用来编写测试代码
按下图框中填写
点完成
这时看到如下画面
这个是正式编写代码的画面了
编写读写方法
现在我们在src目录下新建一个excel文件,等会用java代码来读写该文件
现在新建一个如下的Sheet
在编写代码之前我们先来整理下平常我们要读取任意一个单元格的顺序
1:启动Excel进程
2:打开指定的Excel
3:切换到指定的Sheet页
4:找到对应的行号
5:找到对应的列号
6:读取具体数据
在了解了上面的流程后,我们按这流程用代码来实现
现在我们编写如下类
publicstaticvoidread()throwsIOException {
//设置Excel文件路径
String FileName_TestData=System.getProperty("user.dir")+"\\src\\AutoExcel.xlsx";
FileInputStream ExcelFile;
//实例化文件流,相当于打开Excel进程
try{
ExcelFile =newFileInputStream(FileName_TestData);
//实例化ExcelWBook
XSSFWorkbookExcelWBook =newXSSFWorkbook(ExcelFile);
//获取指定的Sheet页
XSSFSheet Sheet=ExcelWBook.getSheet("Test");
//如果当前Excel文件中没有Test的Sheet页此时Sheet对象中将是空值,为了避免运行时因为异常中止
//所以有必要在执行下一步操作之前先判断Sheet是否为空,为空时就打印错误信息
if(Sheet!=null) {
//因为我们需要遍历整个Sheet所有行,所以这里需要先计算整个Sheet有多少行, 之后用循环遍历的方法
intlastrow=Sheet.getLastRowNum();
for(inti=1;i<=lastrow;i++) {
//读取每行的第一列值当做TS_ID
//toString()是将取到的值统一转换成字符
//trim()去掉首尾的空格符
StringTS_ID=Sheet.getRow(i).getCell(0).getStringCellValue().toString().trim();
//读取每行的第二列值当做CaseName
StringCaseName=Sheet.getRow(i).getCell(1).getStringCellValue().toString().trim();
//读取每行的第三列值当做操作方法
StringOpertion=Sheet.getRow(i).getCell(2).getStringCellValue().toString().trim();
//读取每行的第四列值当做测试数据
StringData=Sheet.getRow(i).getCell(3).getStringCellValue().toString().trim();
System.out.println("测试用例ID==="+TS_ID+"测试名称是===="+CaseName+"操作方法是=="+Opertion
+"测试数据是=="+Data);
}
}
else{
System.out.println
("在"+FileName_TestData+"没有找到Sheet名称为Test");
}
}catch(FileNotFoundException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
最后我们在Main方法中调用
publicstaticvoidmain(String[] args)throwsIOException {
//TODOAuto-generated method stub
read() ;
}
执行之后可以看到控制台将所有数据全打印出来了
上面是读,那如果是写要如何操作呢
还是先来理清平素是如何往Excel文件中写数据的
1:启动Excel进程
2:打开指定的Excel
3:切换到指定的Sheet页
4:找到对应的行号
5:找到对应的列号
6:在指定的单元格中填写数据
7:保存退出
这里就是第6步不同,另外为了让数据生效多了第七步
现在编写一个方法专门来往Excel写入数据
publicstaticvoidTestWrite()throwsIOException{
//设置Excel文件路径
StringFileName_TestData=System.getProperty("user.dir")+"\\src\\AutoExcel.xlsx";
FileInputStream ExcelFile;
//实例化文件流,相当于打开Excel进程
try{
ExcelFile =newFileInputStream(FileName_TestData);
//实例化ExcelWBook
XSSFWorkbookExcelWBook =newXSSFWorkbook(ExcelFile);
//获取指定的Sheet页
XSSFSheet Sheet=ExcelWBook.getSheet("TestWrite");
//如果当前Excel文件中没有Test的Sheet页此时Sheet对象中将是空值,为了避免运行时因为异常中止
//所以有必要在执行下一步操作之前先判断Sheet是否为空,为空时就打印错误信息
//这里需要考量一个问题,如果Sheet名称还没有创建时就需要先创建对应Sheet ,所以代码将要分
//成两部分,一部分是Sheet存在,一部分是Sheet不存在的情况
if(Sheet!=null) {
//此区块代表Sheet存在的情况
//获取最后一行行号,以下代码功能是在最后一行增加记录
intlastrow=Sheet.getLastRowNum();
for(inti=0;i<=lastrow;i++) {
XSSFRow Row=Sheet.getRow(i);
//注意如果指定的行号还没有数据是空白的,Row拿到的值就是null,
if(Row!=null) {
//找到指定的单元格
XSSFCellcell=Row.getCell(0);
//先检验单元格的是否存在
if(cell!=null) {
//如果单元格存在,此时cell就不为空
cell.setCellValue("测试用例ID");
}
else{
//运行到此区块代码该单元格还不存在,需要新建一个单元格
Row.createCell(0).setCellValue("测试用例ID");
}
}
else{
XSSFRowRow1=Sheet.createRow(i);
XSSFCellcell=Row1.getCell(0);
//先检验单元格的是否存在
if(cell!=null) {
//如果单元格存在,此时cell就不为空
cell.setCellValue("测试用例ID");
}
else{
//运行到此区块代码该单元格还不存在,需要新建一个单元格
Row1.createCell(0).setCellValue("测试用例ID");
}
}
}
}
else{
//运行此区块时代表对应Sheet不存在
XSSFSheetSheet1=ExcelWBook.createSheet("TestWrite");
intlastrow=Sheet1.getLastRowNum();
for(inti=0;i<=lastrow;i++) {
XSSFRow Row=Sheet1.getRow(i);
//注意如果指定的行号还没有数据是空白的,Row拿到的值就是null,
if(Row!=null) {
//找到指定的单元格
XSSFCellcell=Row.getCell(0);
//先检验单元格的是否存在
if(cell!=null) {
//如果单元格存在,此时cell就不为空
cell.setCellValue("测试用例ID");
}
else{
//运行到此区块代码该单元格还不存在,需要新建一个单元格
Row.createCell(0).setCellValue("测试用例ID");
}
}
else{
XSSFRowRow1=Sheet1.createRow(i);
XSSFCellcell=Row1.getCell(0);
//先检验单元格的是否存在
if(cell!=null) {
//如果单元格存在,此时cell就不为空
cell.setCellValue("测试用例ID");
}
else{
//运行到此区块代码该单元格还不存在,需要新建一个单元格
Row1.createCell(0).setCellValue("测试用例ID");
}
}
}
}
//将数据以文件流的形式写入Excel中
FileOutputStream fileOut =newFileOutputStream(FileName_TestData);
ExcelWBook.write(fileOut);
fileOut.close();
//关闭进程
ExcelFile.close();
}catch(FileNotFoundException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
之后在Main方法中调用该方法
publicstaticvoidmain(String[] args)throwsIOException {
TestWrite();
}
执行之后打开Excel文件
此时已成功将数据写入到单元格中了
拆解封装Excel操作方法
接下来我们要想另一个问题,我们每读/写一个数据就需要写这么多代码吗,有没有办法将部分代码抽取出来呢
现在我们学着如何将提取部分代码封装成个别的方法
比如我们可以之么分
一个方法专门来打开Excel
一个方法专门来读取数据
一个方法专门来写入数据
一个方法专门来用关闭Excel进程
现在来写第一个方法
为了便于管理,我们再新增一个类
输入类名
ExcelUtil
点完成
packagecom.test.excel;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importorg.apache.poi.xssf.usermodel.XSSFCell;
importorg.apache.poi.xssf.usermodel.XSSFRow;
importorg.apache.poi.xssf.usermodel.XSSFSheet;
importorg.apache.poi.xssf.usermodel.XSSFWorkbook;
publicclassExcelUtil {
/**
*@paramargs
*/
publicstaticvoidmain(String[]
args) {
//TODOAuto-generated
method stub
StringPath=System.getProperty("user.dir")+"\\src\\AutoExcel.xlsx";
StringSheetName="Test";
intRowNum=1;
intColNum=2;
String text=getCellData(Path,SheetName,RowNum,ColNum);
System.out.println("读取的数据是"+text);
WriteData(Path,"TestWrite",3,5,"自动化测试");
}
/**
*
*@paramPath
*@paramSheetName
*@return
*@throwsIOException
*/
publicstaticintgetLastrow(StringPath,StringSheetName)throwsIOException {
intlastrow=0;
//打开Excel
FileInputStreamOpenExcel=OpenExcel(Path);
XSSFWorkbookExcelWBook=ExcelWBook( OpenExcel);
//获取Sheet
XSSFSheetExcelWSheet=WriteSheet(ExcelWBook,SheetName);
lastrow=ExcelWSheet.getLastRowNum();
OpenExcel.close();
returnlastrow;
}
/**
*打开Excel文件
*@paramPath文件路径
*@return
*/
publicstaticFileInputStream
OpenExcel(String Path){
//打开Excel进程
FileInputStreamExcelFile=null;
try{
ExcelFile=newFileInputStream(Path);
}catch(FileNotFoundException e) {
//TODOAuto-generated
catch block
e.printStackTrace();
}
returnExcelFile;
}
/**
*
*@paramExcelFile
*@return
*/
publicstaticXSSFWorkbook ExcelWBook(FileInputStreamExcelFile){
XSSFWorkbookExcelWBook=null;
try{
ExcelWBook=newXSSFWorkbook(ExcelFile);
}catch(IOException e) {
//TODOAuto-generated
catch block
e.printStackTrace();
}
returnExcelWBook;
}
publicstaticXSSFSheetGetSheet(XSSFWorkbook ExcelWBook,StringSheetName) {
XSSFSheetExcelWSheet=null;
try{
ExcelWSheet= ExcelWBook.getSheet(SheetName);
if(ExcelWSheet==null) {
System.out.println("没有获取到对应的Sheet名称"+SheetName+"请检查Sheet名称是否正确");
}
}catch(Exception e) {
//TODOAuto-generated
catch block
e.printStackTrace();
}
returnExcelWSheet;
}
/**
*
*@paramExcelWBook
*@paramSheetName
*@return
*/
publicstaticXSSFSheet
WriteSheet(XSSFWorkbook ExcelWBook,String SheetName) {
XSSFSheetExcelWSheet=null;
try{
ExcelWSheet= ExcelWBook.getSheet(SheetName);
if(ExcelWSheet==null) {
ExcelWSheet=ExcelWBook.createSheet(SheetName);
}
}catch(Exception e) {
//TODOAuto-generated
catch block
e.printStackTrace();
}
returnExcelWSheet;
}
/**
*返回指定单元格的数据
*@paramPath
*@paramSheetName
*@paramRowNum
*@paramColNum
*@return
*/
publicstaticString
getCellData(String Path,String SheetName,intRowNum,intColNum) {
//打开Excel
FileInputStreamOpenExcel=OpenExcel(Path);
XSSFWorkbookExcelWBook=ExcelWBook( OpenExcel);
//获取Sheet
XSSFSheetExcelWSheet=WriteSheet(ExcelWBook,SheetName);
//获取行号
XSSFRow Row=WriteRow(ExcelWSheet,RowNum);
XSSFCellCell;
StringCellData;
try{
//获取单元格的对象
Cell = Row.getCell(ColNum);
if(Cell!=null) {
//取出单元格的值
CellData= Cell.getStringCellValue();
}
else{
//如果 单元格为空返回"";
CellData="";
}
}catch(Exception e){
return"";
}
returnCellData;
}
publicstaticvoidWriteData(String Path,String SheetName,intRowNum,intColNum,String
Data) {
//先获取行对象
try{
//打开Excel
FileInputStreamOpenExcel=OpenExcel(Path);
XSSFWorkbookExcelWBook=ExcelWBook( OpenExcel);
//获取Sheet
XSSFSheetExcelWSheet=WriteSheet(ExcelWBook,SheetName);
//获取行号
XSSFRowRow=WriteRow(ExcelWSheet, RowNum);
//获取列号
XSSFCellCell=WriteCell(Row,ColNum);
//写入数据
Cell.setCellValue(Data);
//保存数据到Excel
FileOutputStream fileOut =newFileOutputStream(Path);
ExcelWBook.write(fileOut);
fileOut.flush();
fileOut.close();
}catch(Exception e) {
System.out.println ("写入操作异常信息是"+e.getMessage());
}
}
/**
*返回Row对象
*@paramExcelWSheet
*@paramRowNum
*@return
*/
publicstaticXSSFRow WriteRow(XSSFSheet ExcelWSheet,intRowNum) {
XSSFRow Row=null;
Row= ExcelWSheet.getRow(RowNum);
if(Row==null){
Row=ExcelWSheet.createRow(RowNum);
}
returnRow;
}
/**
*返回Cell对象
*@paramRow
*@paramColNum
*@return
*/
publicstaticXSSFCell WriteCell(XSSFRow Row,intColNum) {
XSSFCellCell =null;
Cell= Row.getCell(ColNum);
if(Cell==null){
Cell=Row.createCell(ColNum);
}
returnCell;
}
}
再打开TestWrite Sheet确认 是否有写入自动化测试
成功写入
如果我们想遍历整个Sheet的所有数据行该如何操作呢
继续加入如下方法
publicstaticvoidreadall() {
String Path=System.getProperty("user.dir")+"\\src\\AutoExcel.xlsx";
String SheetName="Test";
try{
introws=getLastrow(Path,SheetName);
for(inti=0;i<=rows;i++) {
String text=getCellData(Path,SheetName,i,3);
String text1=getCellData(Path,SheetName,i,3);
System.out.println("text=="+text+"text1=="+text1);
}
}catch(IOException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
之后在Main中调用该方法
如果想在当前行号后新增一条记录要如何操作呢
这里也是要先读取最后一行记录
写入如下代码即可实现每运行一次就在最后一行增加一条记录,此操作可以应用于测试报告的记录
publicstaticvoidWriteNext()throwsIOException {
String Path=System.getProperty("user.dir")+"\\src\\AutoExcel.xlsx";
introws=getLastrow(Path,"TestWrite");
WriteData(Path,"TestWrite",rows+1,5,"自动化测试");
}