如何在groovy中使用scriptom将数据写入excel?

时间:2014-02-21 13:04:32

标签: excel groovy soapui scriptom

我正在从soapUI读取属性及其值,并将它们写入excel。

我可以将唯一的属性名称写入excel

def oExcel = new ActiveXObject('Excel.Application')
Thread.sleep(1000)
assert oExcel != null, "Excel object not initalized"

def openWb = oExcel.Workbooks.Open(excelPath) //excelPath complete path to the excel
def dtUsedRange = openWb.Sheets(dataSheetName).UsedRange //dataSheetName is the name of teh sheet which will ultimately hold the data

//add property names to xlMapSheet under col d or col# 4
for(int r = 1;r<=uniqPropName.size().toInteger();r++){ //uniqPropName is a list that holds all the unique property names in a test suite
    openWb.Sheets(xlMapSheet).Cells(r,4).Value = uniqPropName[r-1]
}

oExcel.DisplayAlerts = false
openWb.Save
oExcel.DisplayAlerts = true

openWb.Close(false,null,false)
oExcel.Quit()
Scriptom.releaseApartment()

但是现在我必须将所有属性写入同一个excel。我已经创建了一个excel列名和soapUI属性的映射,所以现在我只需从地图中找到匹配的excel col名称,并在该excel下写入属性值。

我正在使用一个函数来完成这些工作。从for循环中调用此函数,该循环遍历测试用例中的所有属性。我通过这个功能

sheetName //sheet where data has to be written
sheet //path of the excel file
pName //property name
pValue //property value
xMap //excel col name/heading map
tName //test case name
tsNum //step number

此功能的相关代码如下。

def write2Excel(sheetName,sheet,pName,pValue,xMap,tName,tsNum){

    //find the xl Col Name from the map


    def xl = new ActiveXObject('Excel.Application')
    assert xl != null, "Excel object not initalized"

    //open excel
    def wb = xl.Workbooks.Open(sheet)

    def rng = wb.Sheets(sheetName).UsedRange

    //get row count
    int iColumn = rng.Columns.Count.toInteger()
    int iRow = rng.Rows.Count.toInteger()

    //find column number using the col name

    //find the row with matching testcase name and step#

    //write data to excel
    if(rFound){ //if a row matching test case name and step number is found
          rng.Cells(r,colId).Value = pValue
    }else{
          rng = rng.Resize(r+1,iColumn) //if the testcase and step# row doesn't exist then the current range has to be extended to add one more row of data.
          rng.Cells(r+1,colId).Value = pValue
    }

    //save and close
    xl.DisplayAlerts = false
    wb.Save
    xl.DisplayAlerts = true

    wb.Close(false,null,false)
    xl.Quit()
    Scriptom.releaseApartment()
}

代码目前正在运行。它从昨天晚上(美国东部时间下午2点)开始运行,所以即使代码工作也不是最佳选择。我不能等待这么长时间来写数据。

奇怪的是,excel的大小不断增加,这意味着数据被写入excel,但我已经检查了excel并且没有新数据......没什么。

文件大小增加的证据。

20/02/2014  04:23 PM           466,432 my_excel_file.xls
20/02/2014  04:23 PM           466,944 my_excel_file.xls
20/02/2014  04:38 PM           470,016 my_excel_file.xls
20/02/2014  04:45 PM           471,552 my_excel_file.xls
20/02/2014  04:47 PM           472,064 my_excel_file.xls
20/02/2014  05:01 PM           474,112 my_excel_file.xls
20/02/2014  05:01 PM           474,112 my_excel_file.xls
21/02/2014  07:23 AM           607,232 my_excel_file.xls
21/02/2014  07:32 AM           608,768 my_excel_file.xls
21/02/2014  07:50 AM           611,328 my_excel_file.xls

我的问题是:
1.当我从for循环中调用函数时,为什么数据没有被写入,但是当我将其称为线性时,会写入数据? 2.在第一段代码中,excel过程在完成写入时消失,但是当函数运行时,即使内存利用率上下变化,excel过程仍然存在。

我要杀死excel进程而不是循环我将尝试使用该函数只编写一组或两组数据,并相应地更新这个问题。

1 个答案:

答案 0 :(得分:0)

打开excel,写入单元格,保存excel,关闭excel的过程是一项耗时的任务,当你将其与300个测试用例和每个测试约15个属性相乘时,可能需要很长时间。这就是我的情况,因此这个过程需要永远完成。

我不是百分之百地说为什么excel的大小正在增加并且没有写入任何内容但是我猜想数据被保存在内存中并且一旦最后一个单元被写入就会写入,工作簿保存并且优秀关闭。这种情况从未发生过,因为当我意识到它已经运行了相当长的时间时,我没有让它完成并会杀死它。

为了使这项工作,我改变了我的方法。

  1. 生成列名和道具名称
  2. 的地图
  3. 为每个测试用例生成prop名称和prop值的映射。由于一个测试用例可以有多个属性测试步骤,我创建一个这样的多图... ... 的 [步骤#:[PROPNAME:propvalue,.... PROPNAME:propvalue]]
  4. 使用col name和col id创建另一个映射。
  5. 使用col id和prop值创建一个新地图。我使用上面创建的地图制作了这个。
  6. 将数据写入excel。因为我已经拥有了col id,以及进入它的值。我不做任何检查,只是将数据写入excel。
  7. 对测试套件中的所有测试用例重复这些步骤。使用这个过程,我能够在几分钟内完成我的任务。

    我知道我使用了不少地图,但这是我能提出的方法。如果有人有更好的方法,我也想尝试一下。