别说VB.net过时,我从VB3.0开始就在用,一直到最新的VS2015,从来也没有放弃过VB.net,喜欢就是喜欢,之所以这篇日志写的是2010,是因为家里windows 7的机器装的就是2010,这些年也就一直用下来,并没有装高版本。单位windows 8的机器,手上还有台Surface Pro 4,装的VS2015~
言归正传~
【症状】
最近要写一个小应用,其中要改写excel模版文件中的数据,excel模版比较复杂,通过修改其中的数据,直接在excel中生成饼图、甘特图等等。在win7,VB2010环境下写的第一版,没有任何问题。其中excel操作部分是这样的:
===================
Dim Ex As Microsoft.Office.Interop.Excel.Application
Dim ExSheet As Microsoft.Office.Interop.Excel.Worksheet
Ex = New Microsoft.Office.Interop.Excel.Application
ExSheet = Ex.Workbooks.Open(AppPath & "data\" & Filename2).Sheets("导出数据")
ExSheet.Activate()
Ex.Visible = False
……
中间略
……
Ex.DisplayAlerts = False
Ex.Save()
Ex.Quit()
If Not Ex Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex)
Ex = Nothing
GC.Collect()
End If
=====================
其中open的是事先在excel中做好的模版文件,运行时先制作一个副本然后再修改。以上代码在windows7,vb2010中一切正常。编译生成后拷贝到windows 8的机器上,运行,在最后保存时出现崩溃错误:
无法将类型为Microsoft.office.interop.Excel.ApplicationClass的COM对象强制软件为Microsoft.office.interop.Excel._Application巴拉巴拉巴拉
【找问题】
搜索后发现大多是认为引用的com对象问题或者excel版本问题,还有什么wps问题乱七八糟的一大堆,也有一些所谓的解决方法,试了以后无效。崩溃依旧。
以为自己的电脑有问题,又拷贝到windows 10的surface pro 4上运行。这次崩溃的晚一点,出来的也不是什么类型问题,不过总之还是崩溃。
打开VS把保存文件的语句EX.Save()注释掉,重新生成运行,没有出错,太TND奇怪了不是。
【解决】
由于赶时间交货,在研究了两天后,只是了解到问题出在保存文件时文件是只读状态,也无心多研究,用捷径解决吧。
===================
Dim Ex As Microsoft.Office.Interop.Excel.Application
Dim ExSheet As Microsoft.Office.Interop.Excel.Worksheet
Ex = New Microsoft.Office.Interop.Excel.Application
ExSheet = Ex.Workbooks.Open(AppPath & "data\" & Filename2).Sheets("导出数据")
ExSheet.Activate()
Ex.Visible = False
……
中间略
……
Ex.DisplayAlerts = False
Ex.ActiveWorkbook.SaveAs(AppPath & "data\" & Filename3, 1)
Ex.Quit()
If Not Ex Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex)
Ex = Nothing
GC.Collect()
End If
If IO.File.Exists(AppPath & "data\" & Filename2) Then
IO.File.Delete(AppPath & "data\" & Filename2)
End If
=====================