VB.NET中Excel另存为功能失效:空引用异常问题求助
解决VB.NET中Excel导入文本后保存时的NullReferenceException问题
嘿,我一眼就瞅出你这问题的根源了——你用xlApp.Workbooks.OpenText()导入文本文件的逻辑没问题,但这个方法有个容易踩的小坑:它不会返回刚创建的工作簿对象,而你一开始把xlWorkBook初始化成了Nothing,后续调用保存操作时自然就触发空引用异常了。
问题细节拆解
OpenText方法的作用是在Excel应用里直接打开并解析文本文件,自动生成一个新的工作簿,但它的返回类型是Void,不会把这个新工作簿赋值给你的xlWorkBook变量。所以你的xlWorkBook从头到尾都是空的,调用SaveAs的时候不报错才怪呢。
修正后的完整代码
下面是调整后的代码,核心是获取到OpenText创建的活动工作簿:
FileName = "C:\Temp\BOM of " & AssyName & ".txt" Dim xlApp As New Excel.Application Dim xlWorkBook As Excel.Workbook Dim xlWorkSheet As Excel.Worksheet ' 导入文本文件,Excel会自动创建一个新工作簿 xlApp.Workbooks.OpenText(FileName, _ StartRow:=1, _ DataType:=Excel.XlTextParsingType.xlDelimited, _ TextQualifier:=Excel.XlTextQualifier.xlTextQualifierNone) ' 这里补全你需要的分隔符参数,比如Comma:=True ' 关键:获取刚创建的活动工作簿 xlWorkBook = xlApp.ActiveWorkbook xlWorkSheet = xlWorkBook.ActiveSheet ' 或者按索引获取:xlWorkBook.Worksheets(1) ' 正常执行保存操作 xlWorkBook.SaveAs("C:\Temp\BOM of " & AssyName & ".xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook) ' 别忘了清理Excel资源,避免进程残留 xlWorkBook.Close() xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
额外注意事项
- 确保你的项目已经正确添加了Excel的COM引用(一般是
Microsoft Excel XX.X Object Library) - 如果文本文件用的是特定分隔符(比如制表符、逗号),记得在
OpenText里加上对应的参数(比如Tab:=True或Comma:=True),保证解析出来的表格格式正确 - 处理完Excel对象后一定要手动释放资源,不然Excel进程会在后台残留,占用系统资源
内容的提问来源于stack exchange,提问作者CodeWriter
相关产品推荐
相关产品推荐

