您的位置:首页 > 编程语言 > VB

VB 2010中Excel文件处理的一个奇怪问题

2016-04-03 22:31 501 查看
别说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

=====================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel vb.net visual studio