继续寻求将.NET转换为Progress,我昨天面临另一项挑战。
我们公司之前购买了一个.NET DLL来管理Excel文档,而无需安装Microsoft Excel。根据需要,有几个函数可以返回一系列单元格。
返回的值是一个在.NET中实现IEnumerator接口的类。
问题是我无法找到一种方法来迭代细胞而不会出现错误:
System.ArgumentException: Row or column index is invalid or out of required range
有没有办法进行验证X是否在范围范围内? 要么 有没有办法在不知道数组上限的情况下迭代数组?
谢谢! 的Sebastien
---临时解决方案---
/* 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.
答案 0 :(得分:1)
我没有访问权限,也没有测试此解决方案,但是如果它正确实现了界面,那么像这样的解决方案应该可以工作:
/* 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.
如果它不能完全像这样,至少它应该指向正确的方向来使用它。
答案 1 :(得分:0)
从网页上我推断出cols =
oRange:LastColumnIndex - oRange:FirstColumnIndex
和#行是
oRange:LastRowIndex - oRange:FirstRowIndex
我认为使用
oCell = oRange:Item[Int32, Int32]
要获取行的项目,col位置将更好地工作,而不是使用单个元素数组元素。