Appium 自动化Excel 数据读写

创建新工程

打开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,"自动化测试");

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 使用首先需要了解他的工作原理 1.POI结构与常用类 (1)创建Workbook和Sheet (2)创建单元格 (...
    长城ol阅读 8,260评论 2 25
  • 转自链接 3.项目实践 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一张工资单 3....
    腿毛裤阅读 3,141评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,663评论 0 33
  • Simple Excel Export 简单的Excel导出推荐http://www.cnblogs.com/hy...
    地狱咆哮Zzzzz阅读 15,498评论 0 6
  • Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Ja...
    玩味Orz阅读 2,520评论 0 0