以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教,今天excel打印应用中出现“xxx.xls文件已打开,请先关闭之”的提示。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=44569)

--  作者:ericsky
--  发布时间:2014/1/3 20:44:00
--  请教,今天excel打印应用中出现“xxx.xls文件已打开,请先关闭之”的提示。
用的是论坛中sunsenfeng老师很好用的代码:

Dim Book As New XLS.Book(ProjectPath & "Attachments\\订单.xls")
Dim file As String = ProjectPath & "Reports\\订单.xls"
Book.Build() \'生成细节区
Book.Save(file) \'保存工作簿


Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(file)
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
With Ws.PageSetup
    .PaperSize = MSExcel.XlPaperSize.xlPaperA4   \'纸张大小
    .CenterHorizontally = True   \'页面水平居中
    .CenterVertically = True \'页面垂直居中
    .Zoom = False \'以下设置将缩印在一页内
    .FitToPagesWide = 1  \'按照1页的宽度打印
    .FitToPagesTall = 1  \'按照1页的高度打印
End With
\'App.Visible = True
Ws.PrintOut
wb.save
wb.close
App.Quit

--------------

出错的原因是:上一次打印时,由于网络打印机的延迟,而中途取消了打印,造成打开的excel文件未能关闭,而停留在进程中。
造成后面生成的excel报表未能更新到reports目录下的excel。
后来,进程强行关闭excel进程才恢复正常。

请教:有没有代码可以判断excel是否已经打开,如果已打开,则关闭之。
请老师指教,谢谢!

[此贴子已经被作者于2014-1-3 20:45:06编辑过]

--  作者:有点甜
--  发布时间:2014/1/3 21:11:00
--  
  用下面的代码,以后就不会出现不关闭的情况了。但无法做到你说的关闭特定excel文件的功能,最多是关闭所有的excel文档。

Dim Book As New XLS.Book(ProjectPath & "Attachments\\订单.xls")
Dim file As String = ProjectPath & "Reports\\订单.xls"
Book.Build() \'生成细节区
Book.Save(file) \'保存工作簿

Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook
try
    wb = App.WorkBooks.Open(file)
    Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
    With Ws.PageSetup
        .PaperSize = MSExcel.XlPaperSize.xlPaperA4   \'纸张大小
        .CenterHorizontally = True   \'页面水平居中
        .CenterVertically = True \'页面垂直居中
        .Zoom = False \'以下设置将缩印在一页内
        .FitToPagesWide = 1  \'按照1页的宽度打印
        .FitToPagesTall = 1  \'按照1页的高度打印
    End With
    \'App.Visible = True
    Ws.PrintOut
catch ex As exception
    msgbox("出错了")
finally
    wb.save
    wb.close
    App.Quit
End try

--  作者:ericsky
--  发布时间:2014/1/3 21:45:00
--  
多谢甜老师,这个预防性的代码刚才简单测试了,可行,谢谢!
--  作者:ericsky
--  发布时间:2014/1/4 0:08:00
--  
另一个更满意的方法

Dim Book As New XLS.Book(ProjectPath & "Attachments\\订单.xls")
Dim file As String = ProjectPath & "Reports\\订单.xls"

 If FileIsOpened(file)= True Then \'如果excel文件已打开
      Shell("cmd.exe /c taskkill /f /im excel.exe") \'强行关闭excel进程
      MessageBox.Show("同名excel文件已打开,请按确认先关闭之,再重新打印!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
      Return \'返回
 End If


Book.Build() \'生成细节区
Book.Save(file) \'保存工作簿

Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook
    wb = App.WorkBooks.Open(file)
    Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
    With Ws.PageSetup
        .PaperSize = MSExcel.XlPaperSize.xlPaperA4   \'纸张大小
        .CenterHorizontally = True   \'页面水平居中
        .CenterVertically = True \'页面垂直居中
        .Zoom = False \'以下设置将缩印在一页内
        .FitToPagesWide = 1  \'按照1页的宽度打印
        .FitToPagesTall = 1  \'按照1页的高度打印
    End With
    \'App.Visible = True
    Ws.PrintOut
    wb.save
    wb.close
    App.Quit
[此贴子已经被作者于2014-1-4 0:08:18编辑过]