VB.NET读取Excel调用LBound/UBound引发InvalidCastException求助
解决VB.NET读取Excel Range时LBound/UBound触发的InvalidCastException异常
嘿,这个问题我帮不少人捋清楚过!你碰到的System.InvalidCastException,根源其实很简单:你用objWorkSheet.Range("a7", "a8")拿到的是Excel的Range COM对象(也就是报错里的System.__ComObject),但LBound和UBound是专门用来操作.NET原生数组的函数,直接把COM对象塞进去,类型当然不匹配,自然就触发转换异常了。
给你两种靠谱的解决办法,按需选就行:
方法一:把Range内容转成.NET数组(推荐)
直接读取Range的Value属性,它会自动把单元格内容转换成二维数组,这样就能正常用LBound/UBound了:
Dim objApp As New Excel.Application Dim objWorkbook As Excel.Workbook Dim objWorksheet As Excel.Worksheet objWorkbook = objApp.Workbooks.Open(path & FileName) objWorksheet = objWorkbook.Sheets(2) ' 关键:把Range的Value转成二维数组 Dim areaValues As Object(,) = objWorksheet.Range("a7", "a8").Value ' 现在可以正常调用LBound/UBound了,注意Excel数组下界是1 Debug.Print(LBound(areaValues, 1)) ' 行的下界 Debug.Print(UBound(areaValues, 1)) ' 行的上界 Debug.Print(LBound(areaValues, 2)) ' 列的下界
⚠️ 注意:Excel返回的数组默认是二维结构,哪怕你只选了一列/一行也是如此,而且它的数组下界是1(不是.NET默认的0),别搞混了哦。
方法二:直接遍历Range的Cells(适合小数据量)
如果你的数据范围很小,也可以跳过转数组这一步,直接遍历每个单元格:
Dim objApp As New Excel.Application Dim objWorkbook As Excel.Workbook Dim objWorksheet As Excel.Worksheet objWorkbook = objApp.Workbooks.Open(path & FileName) objWorksheet = objWorkbook.Sheets(2) Dim area As Excel.Range = objWorksheet.Range("a7", "a8") ' 遍历每个单元格 For Each cell As Excel.Range In area.Cells Debug.Print(cell.Value.ToString()) Next
额外提醒:记得释放Excel资源
用完Excel对象后一定要手动释放,不然容易残留Excel进程在后台:
' 关闭工作簿和Excel程序 objWorkbook.Close(SaveChanges:=False) objApp.Quit() ' 释放COM对象 System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorksheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook) System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp) ' 置空并触发垃圾回收 objWorksheet = Nothing objWorkbook = Nothing objApp = Nothing GC.Collect()
内容的提问来源于stack exchange,提问作者Fisher
相关产品推荐
相关产品推荐

