Mostrando entradas con la etiqueta WORD. Mostrar todas las entradas
Mostrando entradas con la etiqueta WORD. Mostrar todas las entradas

lunes, 15 de febrero de 2010

Guardar Word en txt, xml y más

Bien, el problema a solucionar, es cuando tenemos (o recibimos) un documento en un formato, y lo que queremos obtener, mostrar o tratar es un documento en un formato distinto, bien pues vamos a ver un código sencillo y explicado que haría esto en pocos pasos optimamente:
1º Sería interesante que le hechárais un vistazo al anterior post, para ver interactuar bien con las herramientas en c# para MicrosoftWord.

//A la función se le pasa como parámetros el Path del documento existente y el que queremos tener, y devolvemos un entero para gestión de errores.

public int saveWordAsTxt(string inputWord, string outputTxt)
{
int result = -1;
//comprobamos que esté abierto el Word y que exista el documento de entrada
if (this.openApp && File.Exists(inputWord))
{
object oRuta = inputWord;
object readOnly = false;
object isVisible = true;
try
{
//Abrimos el documento
oWordDoc = oWord.Documents.Open(ref oRuta, ref readOnly, ref readOnly, ref oNulo, ref oNulo,
ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref readOnly,
ref oNulo, ref oNulo, ref isVisible, ref oNulo);
//Ahora preparamos las opciones del documento que queremos tener
object fileName = outputTxt;
object fileFormat = Word.WdSaveFormat.wdFormatText;
//Importante, al poner wdFormatText es cuando le decimos el formato, en este caso .txt
object encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
object lineEnding = Word.WdLineEndingType.wdCRLF;
//Salvar el documento con las opciones que le hemos dicho.
oWordDoc.SaveAs(ref fileName, ref fileFormat, ref oNulo, ref oNulo, ref oNulo, ref oNulo,
ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref encoding, ref oNulo,
ref oNulo, ref lineEnding, ref oNulo);
}
catch(Exception e)
{
//Manejo de excepciones, lo correcto sería capturarla.
}
finally
{
//Asegurarse de cerrar el documento pase lo que pase
object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
if (this.oWordDoc != null)
this.oWordDoc.Close(ref doNotSaveChanges, ref oNulo, ref oNulo);
}
}
return result;
}

Y hasta aquí el método, ahora dejo un enlace donde hay una tabla con todas las opciones con sus correspondientes formatos:

lunes, 21 de diciembre de 2009

Buscar patrones (palabras) en multiples documentos.GREP.

Con buscar patrones, en este caso, me refiero, por ejemplo en ver en una carpeta donde tenemos 1000 documentos, en cuales (y dónde) sale la palabra "jamón", por ejemplo.
Para esto vamos a usar la herramienta Cygwin, que sirve para utilizar comando linux de consola desde Windows.
Bueno simplemente buscandola por su nombre, se descarga gratuitamente y se ejecuta normal, como cualquier aplicacion windows.
No saldrá una consola, tecleamos "cd c:" + enter, y luego "cd nombre_carpeta_contenedora" + enter, y suponiendo que la carpeta donde queremos realizar la búsqueda esté en C: y se llame "carpeta_contenedora", ya no hay que navegar más.
Ahora una vez aquí, tendremos que escribir esto :

GREP -i -w "patron_busqueda" doc_*>salida.txt

Ahora por pasos:
GREP --> es la herramienta de búsqueda que usamos

-i --> es un parametro opcional, para que no diferencia entre mayúsculas y minúsculas

-w --> otro parámetro opcional, para que busque sólo las ocurrencias exactas de la palabra, no subcadenas

Nota: existen muchos otros parametro útiles para esta herramienta.

"patron_busqueda" --> en un uso sencillo, es la palabra entrecomillada que queremos buscar, aqui tambien se pueden usar todo tipo de expresiones regulares.

doc_* -->esto quiere decir que haría la búsqueda en todos los archivos que empiecen por doc_ (es un ejemplo, se podria poner lo que convenga)

>salida.txt --> esto es para que cree un documento que se llamara "salida.txt" o como queramos poner, donde pondrá el nombre del documento en el que se ha encontrado, dos puntos y la frase en la que se a encontrado.

viernes, 10 de julio de 2009

Modificar y guardar documento word desde C#

Una vez que hemos encontrado la parte del documento que contiene el texto o el formato que buscábamos, ahora vamos a ver cómo modificar ese rango del documento, y guardar los cambios realizados.

Modificar:

Trabajando con lo anterior por ejemplo, podriamos quirtale el fondo a la palabra anteriormente encontrada:

//Color por defecto de fondo en los documentos.
auto = Microsoft.Office.Interop.Word.WdColorIndex.wdAuto;

rngC.SetRange(inicio, final);
rngC.Select();
rng.HighlightColorIndex = auto;

Guardar cambios :

Se guarda en un nuevo documento con ruta y nombre pasado como parámetro al método SaveAs(...)
Se puede sobreescribir con el método Save(...), pero saldrá la ventanita típica de la aplicación pidiéndonos el nombre, y si ponemos el mismo no preguntará si queremos sobreescribir.

object FileNamea = outputFile;
object FileFormata = Word.WdSaveFormat.wdFormatDocument;
object no = false;
object AddToRecentFilesa = true;
object SaveNativePictureFormata = true;
object Encodinga = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
object LineEndinga = Word.WdLineEndingType.wdCRLF;
oWordDoc.SaveAs(ref FileNamea, ref FileFormata, ref no, ref oNulo, ref AddToRecentFilesa, ref oNulo, ref no, ref no, ref SaveNativePictureFormata, ref oNulo,
ref no, ref Encodinga, ref no,ref no, ref LineEndinga, ref no);

Cerrar:

Importante acordarse siempre de cerrar el documento y la aplicación antes de terminar nuestro programa.

object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
object saveChanges = Word.WdSaveOptions.wdSaveChanges;

oWordDoc.Close(ref doNotSaveChanges, ref oNulo, ref oNulo);

Tambien os pongo algun consejo de mi experiencia personal que os facilitaran las cosas:

Abrir y cerrar sólo una vez la aplicación, puesto que esto tarda un poco y relentiza la ejecución de tu programa.
A la hora de realizar búsquedas, utilizar siempre el método .Find.Execute(...), es el más eficaz y eficiente comparado con otro hecho manual.
Para recorrer los documentos, prestar especial atención a los valores de los rangos y a las marcas asignadas, asi como recorrerlo una única vez, y acotando al máximo los rangos.
oWord.Quit(ref doNotSaveChanges, ref oNulo, ref oNulo);

jueves, 9 de julio de 2009

Buscar formato en Word (documentos) desde C#

Una vez visto como buscar texto en el post anterior, ahora vamos a orientar la búsqueda según criterio de formato.

En este caso el algoritmo se plantea diferente:

Del documento (y de los rangos) se puede saber tanto los párrafos como las frases y/o las palabras.

int palabras = oWordDoc.Words.Count;

int frases = oWordDoc.Sentences.Count;

De las palabras y frases, también se puede obtener los rangos:

for(int i = 1; i < frases ; i++)
{
//Asignar al rango esa palabra
inicio = oWordDoc.Sentences[i].Start;
final = oWordDoc.Sentences[i].End;
...}
Para encontrar un formato recorreremos el documento por frases.

En nuestro ejemplo de buscar fondo distinto al por defecto:

if (rngC.HighlightColorIndex != auto){...}

Una vez encontrada la frase, recorrerla por palabras para encontrar sólo las que tengan el fondo, porque lo anterior
de ”true” en el caso que alguna palabra lo dé.

Un ejemplo para seleccionar la 1ªpalabra con fondo sería:

for (int j = 1; j < palabras && primera; j++)
{
if (rngC.Words[j].HighlightColorIndex != auto
{
primera = false;
inicio = rngC.Words[j].Start;
fin = rngC.Words[j].End;
}
}

martes, 7 de julio de 2009

Buscar texto en Word (documentos) desde C#

Siguiendo con los anteriores post relacionados con manejar documentos Word desde nuestra aplicacion en C#, vamos a buscar, por texto o por formato.

Por texto:
"Benito Rodriguez" --> Encontrar una o todas (las que queramos) ocurrencias y modificar cualquier propiedad del texto.

Por formato:
Encontrar todas las palabras con un color, negrita, tamaño o lo que se desee.

Texto:
En este ejemplo pondremos color de fondo a la 1ª ocurrencia encontrada.

rngPrimera.Find.Text = buscar;

Color = Word.WdColorIndex.wdYellow;
object caseSensitive = true;//Para que encuentre la palabra exactamente, diferencie entre encontrar la cadena dentro de otra, mayúsculas, etc.

rngPrimera.Find.Execute(ref oNulo, ref caseSensitive, ref caseSensitive, ref caseSensitive, ref oNulo,, ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref oNulo, ref oNulo,ref oNulo, ref oNulo, ref oNulo, ref oNulo);

Esto lo hace con la 1ªocurrencia:

if (rng.Find.Found){

...
rng.SetRange(inicio, final);
rng.Select();
rng.HighlightColorIndex = color;
marca = rng.End ; }

Esto con todas (o lo que condicionemos):

while (rng.Find.Found){...}

Buscar formato:
En este caso el algoritmo se plantea diferente:

Del documento (y de los rangos) se puede saber tanto los párrafos como las frases y/o las palabras.

int palabras = oWordDoc.Words.Count;
int frases = oWordDoc.Sentences.Count;

De las palabras y frases, también se puede obtener los rangos:


for(int i = 1; i < frases ; i++)
{
//Asignar al rango esa palabra
inicio = oWordDoc.Sentences[i].Start;
final = oWordDoc.Sentences[i].End;
...}



Para encontrar un formato recorreremos el documento por frases.

En nuestro ejemplo de buscar fondo distinto al por defecto:

if (rngC.HighlightColorIndex != auto){...}

Una vez encontrada la frase, recorrerla por palabras para encontrar sólo las que tengan el fondo, porque lo anterior de ”true” en el caso que alguna palabra lo dé.

Un ejemplo para seleccionar la 1ªpalabra con fondo sería:


for (int j = 1; j <palabras && primera; j++)
{
if (rngC.Words[j].HighlightColorIndex != auto)
{
primera = false;
inicio = rngC.Words[j].Start;
fin = rngC.Words[j].End;
}
}



viernes, 3 de julio de 2009

Como moverse por documento Word con C#

Ahora, continuando con la interacción entre C# y Word con nuestro programa, vamos a ver cómo movernos por el documento abierto.
Lo mejor es usar la clase proporcionada "range".

object start = 0;
obect end = 0;
Word.Range rngC = oWordDoc.Range(ref start, ref end)

Mediante sus propios metodos y propiedades será la manera más rápida y eficaz de hacer las diferentes acciones sobre el documento Word.

El siguiente paso a seguir será asignar un rango:
Mediante marcas podemos ir recorriendo el documento.

object end = oWordDoc.Content.End;
int marca = 1;
rngC.SetRange(marca,(int)end);

Actualizando marca, por ejemplo con el valor del rango usado en una búsqueda, para ir avanzando sería:

marca = rngC.Start;
ó
marca = rngC.End;

Para trabajar con el rango, antes de usarlo hay que limpiar valores antiguos:

rngC.Find.ClearFormatting();
rngC.Find.Forward = true;
rngC.SetRange((int)inic, (int)end);
rngC.Text = ””;

Y, por ejemplo,
asignarle el texto que queramos ”manejar”

rngC.Text = " New Text ";

Y,
muy importante, seleccionar el rango (esto habrá que llevar cuidado de recordar hacerlo siempre que queramos hacer "algo" con una selección de texto del documento):

rngC.Select();


miércoles, 1 de julio de 2009

C# y Word , introduccion a la interaccion entre ambos.

Con este artículo vamos a empezar una pequeña serie de teoría, paso y ejemplos de cómo coordinar nuestra aplicación con documentos word.

Objetivo:
  • Coordinar nuestra aplicación C# con Word 2003 y 2007.
  • Abrir aplicación la Word y/o documentos de este tipo.
  • Buscar, extraer y/o modificar (texto, fuentes, estilos, etc).
Pasos:

Primero agregar referencias y librerías necesarias
En el VisualStudio: Agregar referencia -> COM -> MicrosoftOffice 11.0 ObjectLibrary

Ahora en el código:

Para agregar librería :
"using word = Microsoft.Office.Interop.Word"
-Esta asignación inicial la hacemos para trabajar cómodamente más adelante.

Para abrir la aplicación Word:
"private Word.Application oWord;"
"this.oWord = new Word.Application();"

Aconsejable tener una variable booleana para controlar si la
aplicación Word se encuentra abierta o no.

"private bool openApp;"

Crear, abrir y añadir a la aplicación el documento Word:

"private Word.Document oWordDoc"
"object oRuta → ruta del documento que queremos abrir."
"private Object oNulo = System.Reflection.Missing.Value"
"oWordDoc = oWord.Documents.Add(ref oRuta, ref oNulo, ref oNulo, ref oNulo)"

En lugar del método Add(...), se puede usar Open(...), que tiene más opciones, cómo abrir sólo para lectura.