繁体   English   中英

如何关闭使用Word.SaveAs2方法创建的文件?

[英]How can I close a file created with Word.SaveAs2 method?

我正在运行Visual Studio 2015社区,Visual Basic。 我正在引用Microsoft.Office.Interop.Word

下面的代码通过使用带有PDF参数的Doc.SaveAs2方法转换简单的Word文件来创建PDF文件。

我的问题是,当我稍后尝试在应用程序中删除PDF文件时,它告诉我它仍在使用中。

看来我应该要做的就是关闭文件,但是我不确定该怎么做。 下面的代码关闭Word文档,而不关闭PDF。 我尝试使用FileClose()方法,但它仅接受整数作为参数。

我已经尝试了没有值的1和2,但是我仍然得到了

“文件正在使用中”

我尝试删除它时出错。

我是VB编码的新手,希望能对您有所帮助。

    Private Sub CreateTitlePage()

    Dim wdApp As Microsoft.Office.Interop.Word.Application = New Microsoft.Office.Interop.Word.Application
    Dim wdDoc As Microsoft.Office.Interop.Word.Document = New Microsoft.Office.Interop.Word.Document
    Dim wdPara1 As Microsoft.Office.Interop.Word.Paragraph
    'Dim wdPage1 As Microsoft.Office.Interop.Word.Page

    wdDoc.Application.Visible = False
    wdDoc.PageSetup.VerticalAlignment = WdVerticalAlignment.wdAlignVerticalCenter

    wdPara1 = wdDoc.Content.Paragraphs.Add
    wdPara1.Range.InsertParagraphAfter()
    wdPara1.Range.Text = "BINDER DOCUMENT" + vbVerticalTab + vbVerticalTab + "Created on:  " + formattedDate2
    wdPara1.Range.Font.Bold = True
    wdPara1.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter

    ' The following statements save the document and close the Word application
    wdDoc.SaveAs(binderNameDoc)
    wdDoc.Close()
    wdApp.Quit()

    ConvertWordToPDF(tbProject.Text + "\", "Binder" + formattedDate, docLit)

End Sub

    Public Sub ConvertWordToPDF(myPathName As String, myFileName As String, myFileExt As String)

    Dim myWordName As String = myPathName + myFileName + myFileExt
    Dim myPDFName As String = myPathName + myFileName + pdfLit
    Dim word As Microsoft.Office.Interop.Word.Application = New Microsoft.Office.Interop.Word.Application()
    Dim doc As Microsoft.Office.Interop.Word.Document = word.Documents.Open(myWordName)
    Dim doc2 As PdfDocument = New PdfDocument
    doc.Activate()
    doc.SaveAs2(myPDFName, WdSaveFormat.wdFormatPDF)
    doc.Close()

    ReDim Preserve pdfArray(pdfArray.Length)
    pdfArray(countConversions) = myPDFName
    countConversions = countConversions + 1

End Sub

Word因维护文件锁而臭名昭著,因此有时最好的选择是搜索上一个会话中生成的文件,然后在下一个会话开始时将其删除。

由于这不是VBA,也不是在进程内运行,也不是COM,因此正确释放COM资源非常重要。 如果不这样做,对象将不会在您期望的时候从内存中释放出来,也不会被垃圾回收。

对于在COM区域中实例化的每个对象,都需要专门释放它。 并且您还应该触发垃圾回收以确保对象被完全释放。 几年前,安德鲁·怀特查佩尔(Andrew Whitechapel)写了一本很棒的书,介绍了如何使用.NET与Office一起工作,有关此问题的章节可在MSDN上找到: https : //msdn.microsoft.com/zh-cn/library/office/aa679807%28v=office .11%29.aspx?f = 255&MSPPError = -2147217396

简而言之,您需要在完成对对象的声明后,以相反的顺序将每个声明的对象显式设置为Nothing。 所以:

wdDoc.Close()
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
'Now garbage collection

除此之外,我还注意到在您发布的代码中,您在第二个过程ConvertWordToPDF中调用了Word.Application的完全独立的实例。 我不确定为什么要使用第二个实例,但是同样适用于此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM