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

别说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

=====================



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值