我正在运行Visual Studio 2015社区,visual basic。我正在引用Microsoft.Office.Interop.Word
。
下面的代码通过使用Doc.SaveAs2
方法转换简单的Word文件和格式的PDF参数来创建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
答案 0 :(得分:0)
Word因维护文件锁而臭名昭着,所以有时最好的办法是搜索上一个会话中生成的文件并在下一个会话开始时将其删除,但是......
由于这不是VBA - 不是在进程中运行 - 而不是COM,因此正确释放COM资源非常重要。如果不这样做,则在您预期时不会从内存中释放对象,也不会对其进行垃圾回收。
对于在COM区域中实例化的每个对象,您需要专门释放它。您还应该触发垃圾收集以确保对象完全释放。多年前,Andrew Whitechapel写了一本关于使用.NET与Office合作的好书,MSDN上提供了解决这个问题的章节:https://msdn.microsoft.com/en-us/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实例。我不确定你为什么使用第二个实例,但同样适用于此。