多个大型文件

时间:2016-03-04 01:07:23

标签: .net vb.net ms-word office-interop

我正在尝试使用InterOp创建41个大型Word文档(标题)。

总共大约有700章。 41中的每一个都有一些章节。

章节中共有大约31,000段。

在Visual Basic .Net I中:

  1. 创建标题
  2. 创建章节并为其添加适当的段落。
  3. 然后我将章节添加到标题中。
  4. 如果标题GoTo 2
  5. 有更多章节
  6. 其他保存标题
  7. 如果还有更多标题GoTo 1
  8. 应用程序按预期运行,但...在标题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个部分之后抛出异常。以后处理的部分没有问题。

    我在本地运行并使用网络驱动器,同样的问题。

0 个答案:

没有答案