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

本文讨论了一位开发者使用VB.net在不同Windows系统下遇到的问题,特别是从Windows7迁移到Windows8时遇到的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

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



大家好,2009年9月份注册以来,在论坛上学到了许多东西,得得许多会员和版主及管理的帮助和关爱,真的很感谢大家,正是因为,正是因为大家都是无私且乐于助人,分享自己的宝贵的技术和心得,且使我对EXCEL充满着激情,在我的脑海里总是浮现: 1. 我是ExcelHome论坛的会员,我很荣幸 2. 工作空余时间我会情不自禁来到ExcelHome之家,看看家,学习一些别人的的心得与帮助一些新会员 3. 那里有太多太多的宝贝,有意外的收获和惊喜(众里寻“她”千百度;踏破铁鞋无觅处,在EH得来全不费功夫) 4. 遇到问题我会在论坛和百度找,再找不到我就会发贴提问。呵呵,这里一定会得到帮助的 正是因为这些,因为大家的无私,所以我也不能自私,呵呵,分享一下打造“自己2010选项卡”,2010选项卡的修改比2003版的菜单修改复杂了,希望能帮到一些对这方面感兴趣的朋友,由于水平够,里面有许多不足,欢迎大家指正 ,呵呵,我八婆了一大堆,进入主题 对于Excel2007和2010,你注意到的第一件事可能就是它新外观,沿用多年的菜单与工具栏的用户界面已被抛弃了,取而代之的是选项卡和功能区的新界面,现在我们一步步来制作一个自己的选项卡(首先申明,有些代码和方法来自ExcelHome论坛和网络,在这里谢谢这些提供代码的朋友 ,俗话说的好“前人载树,后人乘凉”,并非个人所写) 第一步:在桌面上创建一个名为customUI的文件夹 第二步:步骤2 打开记事本,在其中复制下面的XML代码:文件名为CustomUI.xml,编码为UTF-8 保存到桌面customUI文件夹中 <customUI <button id="a1" imageMso="DatabasePermissions" size="large" label="工作表加密" <button id="a2" imageMso="AdpDiagramKeys" size="large" label="工作表解密" <button id="E1" imageMso="DataSourceCatalogServerScript" size="large" label="ExcelHome论坛" <button id="E2" imageMso="AccountMenu" size="large" label="完美论坛" <button id="E3" imageMso="FilePackageForCD" size="large" label="VBA入门视频"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值