Question

Continuing my quest to convert .NET to Progress, I faced another challenge yesterday.

Our company bought time ago a .NET DLL to manage Excel document without the need to install Microsoft Excel. There is several functions that return a series of cells depending of the need.

The returned value is a class that implement IEnumerator interface in .NET.

The problem is that I cannot find a way to iterate trough the cells without getting the error:

System.ArgumentException: Row or column index is invalid or out of required range

Is there a way to in Progress to validate if X is inside of the extent range? OR Is there a way to iterate trough the array without knowing the upper limit of the array?

Thank you! Sebastien

--- temporary solution ---

/* declaration */
DEFINE VARIABLE oCell AS CLASS GemBox.Spreadsheet.ExcelCell NO-UNDO.
DEFINE VARIABLE oRange AS CLASS GemBox.Spreadsheet.CellRange NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.

/* load excel file */
...

/* retrieve a series of cells */
ASSIGN oRange = oWorksheet:Cells:GetSubrangeAbsolute(1,1, 2,2).

/* first cell */
ASSIGN i = 0.
ASSIGN oCell = ?.
ASSIGN oCell = oRange:Item[i] NO-ERROR.

/* validate cell is in the range */
DO WHILE NOT oCell EQ ?:

    MESSAGE oCell:Value VIEW-AS ALERT-BOX.

    /* next cell */
    ASSIGN i = i + 1.
    ASSIGN oCell = ?.
    ASSIGN oCell = oRange:Item[i] NO-ERROR.
END. 
Was it helpful?

Solution

I don't have access nor I can test this solution, but if it implements correctly the interface some solution like this one should work:

/* declaration */
DEFINE VARIABLE oCell AS CLASS GemBox.Spreadsheet.ExcelCell NO-UNDO.
DEFINE VARIABLE oRange AS CLASS GemBox.Spreadsheet.CellRange NO-UNDO.
DEFINE VARIABLE oEnumerator AS CLASS System.Collections.IEnumerator NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.

/* load excel file */
...

/* retrieve a series of cells */
ASSIGN oRange = oWorksheet:Cells:GetSubrangeAbsolute(1,1, 2,2).

oEnumerator = oRange:getEnumerator().
DO WHILE oEnumerator:MoveNext():
   oCell = CAST(oEnumerator:current,"GemBox.Spreadsheet.ExcelCell").
END.

If it doesn't work exactly like this, at least it should point you in the correct direction to use it.

OTHER TIPS

From the web page I'd infer that the # of cols =

oRange:LastColumnIndex - oRange:FirstColumnIndex 

and the # of rows is

oRange:LastRowIndex - oRange:FirstRowIndex 

I'd think using

 oCell = oRange:Item[Int32, Int32]

to get the item at the row, col position would work better instead of using a single element array element.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top