Variator Posted February 1, 2012 Report Share Posted February 1, 2012 holas otra vez bueno pense que tenia el programa terminado.. pero me agregaron una nueva opcion, les explico tengo que buscar una foto en el computador.. para eso uso openFileDialog, una vez que se selecciona y pulsa aceptar esta se pega en un PictureBox.. hasta aqui todo bien. el problema esta en que al momento de pasar esta imagen del picturebox a word no me resulta, ya que es diferente pasar un string a una imagen. buscando me he encontrado que una forma de hacerlo es pasar la imagen del picturebox al portapapeles y despues recuperarla del portapapeles para pegarla en el word, la encuentro valida, pero el codigo que me indica el marcador de word donde debe ir es el que no encuentro. por ejemplo, para pegar un string cualquiera en una parte de un word, primero en este se agrega un marcador, y por medio de VB se indica el marcador donde se va pegar el string. asi: oDoc.Bookmarks.Item("observacion1").Range.Text = txtobservacion.Text donde lo que esta entre comillas es el marcador y el que esta despues del sigo igual es el string a insertar. pero con la imagen no resulta... para pasar a portapapeles es asi: Clipboard.SetDataObject(Me.picturebox.Image) y para recuperarla asi: Clipboard.GetDataObject() la otra forma que encontre es pasar la imagen a un array de bytes, pero esta ultima forma no la entendi :S ¿ustedes saben de alguna forma para poder copiar una imagen desde vb a word? es lo unico que me falta y termino el programa u.u les agradesco desde ya... :D Link to comment Share on other sites More sharing options...
susodicho Posted February 1, 2012 Report Share Posted February 1, 2012 (edited) :mmm: Creo que deberías aprovechar que la imagen la abres a través de OpenFileDialog, así te evitas tener que abrir el archivo, guardarlo en memoria e insertarlo en Word como lo has tratado de resolver hasta ahora. Entonces simplemente tendrías que usar el nombre completo del archivo que te devuelve OpenFileDialog y usarlo para insertar directamente la imagen (sin guardar el archivo en memoria).Así que podrías intentar hacerlo así: oDoc.Selection.InlineShapes.AddPicture("C:\Windows\Web\Wallpaper\Windows\img0.jpg") el código inserta una imagen en la posición actual del cursor. échale una mirada al método AddPicture.También puedes probar sin Selection y/o poniendo los parámetros opcionales: oDoc.InlineShapes.AddPicture(FileName:="C:\Logotipo.png", LinkToFile:=False, SaveWithDocument:=True) Sobre lo de intentar pegar la imagen a través del portapapeles, creo que podría tener un problema: ¿qué pasa si el usuario u otro programa copia algo al portapapeles mientras tú lo estás usando? Edited February 2, 2012 by susodicho Link to comment Share on other sites More sharing options...
Variator Posted February 2, 2012 Author Report Share Posted February 2, 2012 (edited) si eso es lo que tengo hasta ahora, lo que me sucede es que tengo una carta por defecto que se debe modificar según la informacion que seleccione el usuario en el programa, para esto uso marcadores en el word. el programa lo que hace es tomar la informacion que el usuario desea y este reemplaza el marcador que corresponda. en este caso la carta lleva una foto del signo de la empresa en la parte superior, y a esta foto le agrege un marcador, lo que necesito es reemplazar esta foto de la carta por medio del programa, el usuario seleccione una foto con openfiledialog, esta llevarla al comando addpicture y me reemplace el marcador de word (imagen por defecto que esta en la carta). se que el codigo es el que me mostraste: oDoc.InlineShapes.AddPicture(FileName:="C:Logotipo.png", LinkToFile:=False, SaveWithDocument:=True) pero esto asi tal cual lo que hace es agregarme una nueva imagen, osea me quedan ambas imagenes en la carta, se que en esa linea va una cuarta opcion, que es Range y se que el bookmark es donde se indica el marcador para que reemplace. y eso es lo que no puedo hacer, porque mientras intento colocar la opcion del range, al ejecutarlo me dice que hay datos inconsistentes o que no es publico. se que estas son las opciones que tiene el agregar la imagen: oDoc.InlineShapes.AddPicture(FileName:=, LinkToFile:=, SaveWithDocument:=,Range:=) pero no he podido completar esta linea con la sintaxis correcta u.u Edited February 2, 2012 by Variator Link to comment Share on other sites More sharing options...
susodicho Posted February 5, 2012 Report Share Posted February 5, 2012 (edited) En esta página encontré este código: using System.Collections.Generic; using Word = Microsoft.Office.Interop.Word; namespace WordExample { class WordExample { public WordExample() { WordApp = new Microsoft.Office.Interop.Word.Application(); } private Word.Application WordApp; private object missing = System.Reflection.Missing.Value; private object yes = true; private object no = false; private Word.Document d; private object filename = @"C:\FullPathToFile\example.doc"; public void UpdateDoc() { d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing); List<word.range> ranges = new List<microsoft.office.interop.word.range>(); foreach (Word.InlineShape s in d.InlineShapes) { if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture && s.Title == "LogoEmpresa") { ranges.Add(s.Range); s.Delete(); } } foreach (Word.Range r in ranges) { r.InlineShapes.AddPicture(@"C:\PathToNewImage\Image.jpg", ref missing, ref missing, ref missing); } WordApp.Quit(ref yes, ref missing, ref missing); } } } sí, está en C#, pero supongo que no deberías tener problemas para pasarlo a VB.NET ;) (yo no lo pasé a VB.NET porque no tengo instalado ni el Visual Studio ni el Office 2010 y no me manejo tanto en VB :tonto: ). Por si acaso, la interoperabilidad COM en C# no es tan cómoda como en VB.NET y hay que poner todos esos ref missing, pero en VB.NET simplemente los omites. Otra cosa, yo le agregué la condición && s.Title == "LogoEmpresa", que se supone es lo que a ti te serviría. O sea, el código recorre la lista de todos los objetos incrustados en el documento (InlineShapes) y revisa si es una imagen (wdInlineShapePicture) y si tiene el marcador que buscas (en este caso, "LogoEmpresa"); si encuentra una coincidencia, la agrega a la lista ranges; después, en el segundo ciclo foreach, reemplaza todas las coincidencias que encontró en la búsqueda anterior con la imagen correspondiente (en este caso, "C:\PathToNewImage\Image.jpg"). Obviamente, tú reemplazas el título de la imagen por el que corresponda (yo le puse "LogoEmpresa") y eso vendría siendo el "marcador" de la imagen. Porsiaca, la línea List<word.range> ranges = new List<microsoft.office.interop.word.range>(); en VB.NET creo que sería: Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range) EDITADO: Aquí dejo el código en VB.NET...obviamente no tengo idea si compila Imports System.Collections.Generic Imports Microsoft.Office.Interop.Word '...etc... Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range) For Each s As Microsoft.Office.Interop.Word.InlineShape In oDoc.InlineShapes If (s.Type = Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture) And (s.Title = "LogoEmpresa") Then ranges.Add(s.Range) s.Delete() End If Next For Each r As Microsoft.Office.Interop.Word.Range In ranges r.InlineShapes.AddPicture(FileName:=openFileDialog1.FileName, LinkToFile:=False, SaveWithDocument:=True) Next NOTA: Lo que hace el código es reemplazar una o más imágenes que tengan un determinado título, o sea, el documento debe tener una imagen en la ubicación en donde tú quieres que vaya el logo de la empresa. Así que puedes poner alguna imagen "genérica" en el documento Word. Edited February 6, 2012 by susodicho Link to comment Share on other sites More sharing options...
Variator Posted February 6, 2012 Author Report Share Posted February 6, 2012 (edited) gracias por la ayuda... lo acabo de completar :) estaré atento al foro por si puedo ayudar :) Edited February 6, 2012 by Variator Link to comment Share on other sites More sharing options...
AshWilliams Posted February 6, 2012 Report Share Posted February 6, 2012 Solucionado gracias a susodicho XD.....se cierra. Saludos :krider: Link to comment Share on other sites More sharing options...
Recommended Posts