Pergunta

Eu estou tendo um problema com algum código de mala direta que é suposto para produzir letras dentro de nossa aplicação. Estou ciente de que este código é um pouco rústica no momento, mas estamos no "Obter algo trabalhar" fase antes de arrumá-lo.

Agora, a forma como este é suposto trabalho, ea forma como ele funciona quando fazê-lo manualmente, é que temos um arquivo (a variável fileOut + ".template"), que é um modelo para a carta. Nós abrir esse modelo, fundi-lo, e depois salvá-lo como o nome do arquivo na variável fileOut.

No entanto, o que está fazendo está salvando uma cópia do arquivo de modelo para o nome do arquivo fileout, em vez da saída da fusão.

Eu procurei, e eu parecem estar batendo a cabeça contra uma parede de tijolos.

arquivo de dados é o arquivo de dados que contém os dados de mesclagem.

Usando os mesmos arquivos, tudo funciona se você fazê-lo manualmente.

Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String
    Dim ans As String = String.Empty

    errorLog = "C:\Temp\Template_error.log"

    If (File.Exists(datafile)) Then

        Try

            ' Create an instance of Word  and make it invisible.'

            wrdApp = CreateObject("Word.Application")
            wrdApp.Visible = False

            ' Add a new document.'

            wrdDoc = wrdApp.Documents.Add(fileOut & ".template")
            wrdDoc.Select()

            Dim wrdSelection As Word.Selection
            Dim wrdMailMerge As Word.MailMerge


            wrdDoc.MailMerge.OpenDataSource(datafile)

            wrdSelection = wrdApp.Selection()
            wrdMailMerge = wrdDoc.MailMerge()
            With wrdMailMerge
                .Execute()
            End With

            wrdDoc.SaveAs(fileOut)

            wrdApp.Quit(False)

            ' Release References.'
            wrdSelection = Nothing
            wrdMailMerge = Nothing
            wrdDoc = Nothing
            wrdApp = Nothing


            ans = "Merged OK"

            Call writeToLogFile(errorLog, "This worked, written to  " & fileOut)

        Catch ex As Exception
            ans = "error : exception thrown " & ex.ToString
            Call writeToLogFile(errorLog, ans)
        End Try

    Else
        ans = "error ; unable to open Date File : " & datafile
        If (logErrors) Then
            Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _
               "to process it. Filename provided: " & datafile)
        End If
    End If

    Return ans

End Function
Foi útil?

Solução

Eu encontrei a solução. Quando você mesclar um documento, ele cria um novo documento com os resultados de intercalação no-lo. fragmento de código abaixo explica.

wrdDoc = wrdApp.Documents.Add(TemplateFileName)
wrdDoc.Select()
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge


wrdDoc.MailMerge.OpenDataSource(DataFileName)

wrdSelection = wrdApp.Selection()
wrdMailMerge = wrdDoc.MailMerge()
With wrdMailMerge
    .Execute()
End With

' This is the wrong thing to do. It just re-saves the template file you opened. '
'wrdDoc.SaveAs(OutputFileName) '

' The resulting merged document is actually stored '
' in the MailMerge object, so you have to save that '
wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName)

wrdApp.Quit(False)

Outras dicas

Eu acho que o problema é o seguinte linha:

wrdDoc.MailMerge.OpenDataSource(templateName)

Assim, templateName é algo como 'C: \ My Template.doc'?, Certo

Parece que você está fornecendo o caminho de um documento do Word em si, em vez de uma fonte de dados (o arquivo Excel ou CSV, Tabela Access, etc.) ligados ao documento ".template".

arquivo

Tentar :

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)

Uma forma de fraude é gravar uma macro ao fazer manualmente todos os passos que você menciona. Assim que estiver pronto, ajustar a macro para ser mais flexível.

Isso é o que eu fiz na última vez que eu não poderia descobrir isso ao escrever minha própria macro:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top