Ir para conteúdo
Fórum Script Brasil
  • 0

Como Manipular Arquivos .doc Ou .rtf No C#?


Boavida

Pergunta

Uso o Visual Studio 2005

Pessoal, eu estou querendo criar um relatório e exportá-lo pra .doc ou .rtf.

A minha idéia é criar antes, pelo Word mesmo, um relatório padrão, deixando umas variáveis nele ($nome, por exemplo) para posterior substituição.

Então, eu gostaria que alguém me ajudasse e me dissesse como faz pra localizar uma determinada palavra no documento do Word e substituí-la por outra.

Desde já agradeço pela atenção e disposição em ajudar-me.

Valeu!

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Opa beleza cara? É o seguinte eu programo em C# mas nunca acertei fazer esse código nesta linguagem então vou mostrar como eu sei em vb.net dai se conseguir passar para C# você divide a proeza conosco.

Importe essa biblioteca

Imports Microsoft.VisualBasic
Nem sempre é necessario tente fazer sem ela caso aprensente algum erro você importa. Aqui eu faço sem importar no entanto na minha faculdade só funciona importanto. Adicione esses atributos ou então use como variaveis locais do metodo
Private objWord As Object
Private achar As String
Private subistituir As String
Código
'Instancia a Aplicação Word.
        objWord = CreateObject("Word.Application")
        'Abre o documento aviso.doc do Microsoft Word.
        objWord.Documents.Open("e:\teste\teste.doc")
        'procura a variável e substitui o valor
        achar = "@valor"
        subistituir = "teste"
        With objWord.Selection.Find
            .Text = achar.ToString
            .Replacement.Text = subistituir.ToString
            .Forward = True
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False

            While .Execute = True
                objWord.Selection.Select()
                System.Windows.Forms.Clipboard.SetDataObject(subistituir)
                objWord.Selection.Paste()
            End While
        End With
        'torna o Word visivel
        objWord.visible = True
        'Fecha o Word
        objWord.Quit()
        objWord = Nothing

Bom é isso espero ter ajudado e qualquer coisa to aí.

falows boa sorte!!!

Link para o comentário
Compartilhar em outros sites

  • 0

É o seguinte eu programo em C# mas nunca acertei fazer esse código nesta linguagem então vou mostrar como eu sei em vb.net dai se conseguir passar para C# você divide a proeza conosco.

Dê uma olhada neste tutorial que escrevi: http://www.onmasters.com.br/?area=ler_arti...os&artid=61

Acredito que ele vá te ajudar a fazer isso.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Então Graymalkin, pelo que pude ver no código passado é que eu estava fazendo certo em C# alias não tem segredo transformar meu código vb.net em C#, mas o problema que eu encontrava era na hora de instanciar o atributo objWord por que eu colocava

private Objetc objWord então tentava private object objWord e também dava erro.

No entanto o artigo do site que você passou diz que é Object. Vou fazer mais um teste e tentar entender o que esta acontecendo.

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

Em C# tanto faz você usar object ou Object (sendo System.Object o nome real deste último), já que eles são a mesma coisa. A diferença na utilização é em como chamar os métodos e propriedades deste, e é justamente isso que o artigo mostra. Enquanto em VB.NET você pode fazer...

objWord.Documents.Open("e:\teste\teste.doc")
... em C# a mesma linha seria algo como (baseada nos objetos do artigo):
tipoDocuments.InvokeMember("Open", BindingFlags.InvokeMethod, null, Documents, new Object[[]] {"e:/teste/teste.doc"});

Isso porque C# não tem o recurso de late-binding.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin,

Excelente sua ajuda!

Estretanto, percebo que preciso conhecer quais os métodos utilizados neste tipo objeto, os quais desconheço. Conheço apenas estes que você me passou agora (Add, Open,...) e "deduzo" outros como, por exemplo, Find; só que já tentei aqui, mas não consegui utilizá-lo da maneira correta para localizar uma palavra no documento.

você poderia me passar essa parte do código pra localizar e substituir a palavra, ou então me explicar como se faz pra utilizar qualquer dos métodos deste objeto? E também, onde posso saber quais os métodos suportados por este objeto do Word? Quais são eles?

E, o que se precisa entender pra utilização e escrita correta destes métodos?

Espero não estar pedindo muito.

Desde já agradeço.

Valeu!

Link para o comentário
Compartilhar em outros sites

  • 0

A descrição e utilização destes métodos você encontra no help do VBA do Word, sendo que o jeito mais prático de utilizá-los é, no próprio Word, gravando uma macro fazendo exatamente o que você quer e depois indo no Editor do VBA (ALT+F11) e vendo o código gerado. Daí, é só adaptar.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Rapaz, Graymalkin, está ralado.

É porque eu sou novo em C# e em programação OO.

Tentei um bocado de coisa aqui, mas ainda não consegui resolver meu problema.

Olha o que eu fiz:

Pesquisei a ajuda do VBA do Word pra conhecer algumas coisas e, depois, simulei a localização de uma palavra pra gerar a macro. A macro ficou assim:

Sub TesteLocalizar()
'
' TesteLocalizar Macro
' Macro gravada 9/11/2006 por Andre
'
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "$nome$"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
End Sub
Tentei colocar isso no C# e escrevi assim (a alteração que fiz foi apenas na 3ª linha com relação ao código que li no seu artigo):
Selection = tipoWord.InvokeMember("Selection", BindingFlags.GetProperty, null, winword, new Object[] { });
tipoSelection = Selection.GetType();
tipoSelection.InvokeMember("Find", BindingFlags.InvokeMethod, null, Selection, new Object[] { "$nome$" });
Só que não funcionou. Tentei também colocar alguns outros parâmetros ao lado de "$nome$", mas também não deu. (Não sei nem se é ali mesmo onde se colocam parâmetros) Aí, achei que esta linha pudesse retornar a string da palavra, aí coloquei assim:
resultado = tipoSelection.InvokeMember("Find", BindingFlags.InvokeMethod, null, Selection, new Object[] { "$nome$" }).ToString();

sendo resultado uma string, mas também não funcionou.

você pode me dar uma ajuda aí?

Em que que eu estou errando?

Com relação a parâmetros, como faz?

Desde já, agradeço muito.

Valeu!

Link para o comentário
Compartilhar em outros sites

  • 0

O problema é que Find *não* é um método, e sim uma propriedade. Para executar mesmo é o método Execute() desta propriedade. Veja um código de exemplo:

Type tipoWord = Type.GetTypeFromProgID("Word.Application");
Type tipoDocuments, tipoSelection, tipoFind;

object winword = Activator.CreateInstance(tipoWord);
object Documents, Selection, Find;

Documents = tipoWord.InvokeMember("Documents", BindingFlags.GetProperty, null, winword, new Object[] {});
tipoDocuments = Documents.GetType();
tipoDocuments.InvokeMember("Add", BindingFlags.InvokeMethod, null, Documents, new Object[] {});

Selection = tipoWord.InvokeMember("Selection", BindingFlags.GetProperty, null, winword, new Object[] {});
tipoSelection = Selection.GetType();
tipoSelection.InvokeMember("TypeText", BindingFlags.InvokeMethod, null, Selection, new Object[] {"um $nome$ e outro teste"});
tipoSelection.InvokeMember("HomeKey", BindingFlags.InvokeMethod, null, Selection, new Object[] { 6 });

Find = tipoSelection.InvokeMember("Find", BindingFlags.GetProperty, null, Selection, new Object[] {});
tipoFind = Find.GetType();
tipoFind.InvokeMember("Text", BindingFlags.SetProperty, null, Find, new object[] { "$nome$" });
tipoFind.InvokeMember("Execute", BindingFlags.InvokeMethod, null, Find, new Object[] {});

tipoWord.InvokeMember("Visible", BindingFlags.SetProperty, null, winword, new object[] {true});

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Povo que programa.

Eis que estou em seria dificuldade.

Estou gerando relatórios que veem do MySql em PrintDocument eexibindo o relatório em PrintPrewiewDialog.

Agora preciso pegar o que esta sendo mostrado (conteudo) no relatório e exportar para um documento do word e depois envia-lo por e-mail.

Isso em windows application!

Acontece que estou ralando nas pesquisas e não consigo achar nada que resolva.

Caso alguém possa ajudar segue o link onde esta o projeto que estou fazendo.

Ob.: O botão "EXPORTAR .DOC" la no PrintPreviewDialog já criei e já esta adicionado la.

Só esta sem o código para exportação.

http://www.carcleo.com/Pedidos.zip

Link para o comentário
Compartilhar em outros sites

  • 0

Oh turma, dessa forma deu certo mas, e agora?

Como faço para pegar o que esta no formulario e jogar para o word?

Lembrando que desse jeito já exta criando o documento word com os dados que estão dentro do whit:

Private Sub MeuClickExportar(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs)
        If e.ClickedItem.Text = "EXPORTAR .DOC" Then
            Dim word As Microsoft.Office.Interop.Word.Application
            word = CreateObject("Word.Application")
            word.Documents.Add()
            word.Visible = True

            With word
                .Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter
                .Selection.Font.Size = 20
                .Selection.Font.Bold = True
                .Selection.TypeText(Text:="VISUAL BASIC - JCMSOFT")
                .Selection.TypeParagraph()
                .Selection.Font.Size = 15
                .Selection.TypeText(Text:="www.geocities.com/macoratti")
                .Selection.TypeParagraph()
                .Selection.TypeParagraph()
                .Selection.Font.Size = 10
                .Selection.Font.Italic = True
                .Selection.TypeText(Text:="Tudo para Visual Basic e Banco de dados")
            End With
        End If
    End Sub

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...