我正在尝试使用InterOp创建41个大型Word文档(标题)。
总共大约有700章。 41中的每一个都有一些章节。
章节中共有大约31,000段。
在Visual Basic .Net I中:
应用程序按预期运行,但...在标题21之后,文档不会出现在我保存它们的文件夹中。
今天我看了这个过程。当我注意到我在标题23但文件夹只有标题21时,我在保存标题的行上放置了一个断点,以检查路径或文件名是否已损坏。他们不是。我用保存执行该行并转到该文件夹并刷新它。不在那里。
接下来的运行我开始时第一个标题丢失,再一次运行了一段时间没有任何问题,但后来又做了同样的事情。
我不知道接下来该做什么。
编辑:
辛迪 - 我现在可以回答的一些事情。 VS2012,Office 2010.目标文件夹位于网络驱动器上。代码在Try-Catch中,但正如我在帖子中指出的那样,Save执行。我怀疑这是一个清理问题。我修改了代码以在每个标题后退出单词以查看是否有帮助。最大的问题是在发生故障之前需要数小时的处理时间。我在离开工作之前就开始了新版本,并且不知道这些变化是否有所帮助,直到星期一。如果我在周一仍然遇到问题,那么我将发布裸骨代码。编辑: 我正在取得进展,但有时仍然有错误。调用超过30,000次的代码看起来像这样
Private Sub CreateWordDoc(fileToOpen As String, savePath As String)
' Exit Sub 'test '
If MSWord Is Nothing Then
MSWord = New Word.Application
MSWord.Visible = False
End If
'
Dim doc As Word.Document = MSWord.Documents.Open(FileName:=fileToOpen.ToString, Visible:=False, Format:=Word.WdOpenFormat.wdOpenFormatWebPages, AddToRecentFiles:=False)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'speed up word
With doc.Application
.Options.Pagination = False
.ScreenUpdating = False
End With
'set up find
Dim fnd As Word.Find = doc.Content.Find
fnd.Format = True
fnd.Forward = True
fnd.Wrap = Word.WdFindWrap.wdFindContinue
showStatus("Formatting tabs")
fnd.Text = XStructFormatFor.tabCHinDoc
fnd.Replacement.Text = ControlChars.Tab
Dim found As Boolean = fnd.Execute(Replace:=Word.WdReplace.wdReplaceAll)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting spaces")
fnd.Text = XStructFormatFor.wordNBSPch
fnd.Replacement.Text = " "
found = fnd.Execute(Replace:=Word.WdReplace.wdReplaceAll)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
fnd = Nothing
doc.SelectAllEditableRanges()
doc.Range.Copy()
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
doc.Close(SaveChanges:=Word.WdSaveOptions.wdDoNotSaveChanges)
'
doc = Nothing
'template with macros
Dim ofile As String = IO.Path.Combine(IO.Path.GetDirectoryName(pthExec), "DocTempl.dotm")
docTmpl = MSWord.Documents.Open(ofile.ToString, AddToRecentFiles:=False)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'speed up word
With docTmpl.Application
.Options.Pagination = False
.ScreenUpdating = False
End With
docTmpl.SelectAllEditableRanges()
showStatus("Macros")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
docTmpl.Range.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting)
MSWord.Visible = True
'macros run when visible
Try
docTmpl.Windows(1).WindowState = Word.WdWindowState.wdWindowStateNormal
'this code and the associaed macro are
'to make lines in table be 1/4 pt.
showStatus("Formatting Table - check Word status bar")
docTmpl.Application.Run("TableLines")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting Paragraphs")
docTmpl.Application.Run("SetParaNorm")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting Paragraphs Common")
docTmpl.Application.Run("SetParaCommon")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'
MSWord.Visible = False
docTmpl.SaveAs2(FileName:=savePath.ToString, FileFormat:=Word.WdSaveFormat.wdFormatDocumentDefault, AddToRecentFiles:=False)
docTmpl.Close(Word.WdSaveOptions.wdDoNotSaveChanges)
docTmpl = Nothing
If tempFilesL.Count > 500 Then
CloseMSWord(True)
TempFileLimit()
End If
showStatus("")
Catch ex As Exception
AddActivity("ERROR ---> " & ex.Message)
thisApp.GALog.WriteException(ex, TraceEventType.Error, "Macro error")
End Try
End Sub
线程睡眠来自我发现的一篇文章,它们确实似乎有所帮助。这里有一些参考。
'Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).
'happens occasionally
'see - http://stackoverflow.com/questions/20638978/call-was-rejected-by-callee-exception-from-hresult-0x80010001-rpc-e-call-rej
'and
'http://blogs.artinsoft.net/Mrojas/archive/2012/09/28/Office-Interop-and-Call-was-rejected-by-callee.aspx
今天我在遇到任何错误之前已经完成了大约10,000个部分。
如果您按照所有链接,对于此处的所有标题和章节, Revised Statutes你会明白我在做什么。 FWIW - 两周前我几乎无法拼写Interop,现在我正在努力制作文件,这些文件将完全填满20部斯蒂芬·金大小的小说。
外面有一个循环可以提供您看到的代码。它负责发布Word应用程序。两周前,我发现和修复的第一个问题是拥有Word应用程序的多个实例。今天只有一个Word实例在运行。
如果您注意到开头有一个注释的Exit Sub。今天早上我用Exit Sub对它进行了几个小时的评论,以确保我发布的代码导致了问题。它几次没有问题地遍历列表。就在我评论它的时候,它在大约10,000个部分之后抛出异常。以后处理的部分没有问题。
我在本地运行并使用网络驱动器,同样的问题。