none
Busqueda de texto en documentos de Office

    Question

  • Buenas!
    Conocen de algún componente o alguna forma de realizar busqueda de texto dentro de documentos de Office y otros tipos en WPF?
    Por ejemplo:
    Especificar un directorio de documentos con diferentes archivos, .txt, .docx, .xlsx, .pptx, .pdf, buscar en alguno de los archivos la palabra "informe mensual 2010", y que muestre los documentos donde se encuentre esa palabra.

    Talvez me ayudan con algunas de ideas de como realizar esto, muchas gracias.

    Saludos..
    Briayan
    Thursday, March 11, 2010 8:37 PM

Answers

  • Hola Briayan.


    En Word, apartir de la version 2007, microsoft ya no usa su sistema binario de archivo usado por versiones anteriores, ahora usa OpenXML que es un standard abierto, mas info en: http://es.wikipedia.org/wiki/Office_Open_XML

    Bien, estos documentos son ahora paquetes .zip con todos los recursos y en la version 2007 de word viene con la extension .docx, que se puede cambiar a .zip y descomprimir para ver que hay dentro.

    Pues bien, en un principio, se puede hacer uso de varias soluciones para leer un documento Word, usando la libreria OpenXML para formatos del 2007 en adelante o hacer uso del componente para interoperabilidad COM para word.

    Yo te voy a comentar el uso de OpenXML ya que es el mas reciente y da muchos menos problemas en entornos web al no necesitar privilegios para instanciar componentes COM.

    para este ejemplo hace falta bajarse la SDK de OpenXML disponible en:


    se instala y se agrega la referencia en nuestro proyecto a la libreria.

    luego se puede usar este codigo de ejemplo para contar el numero de veces que se repite una palabra:

    NOTA: incluir estos using:

    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml.Packaging;

    /// <summary>
    /// Funcion para buscar una cadena en el documento
    /// </summary>
    /// <param name="_docName">Nombre del documento</param>
    /// <param name="_textToSearch">Texto a buscar</param>
    /// <returns>Numero de veces que ha sido encontrada la cadena</returns>
    public int searchText(string _docName, string _textToSearch)
    {
        int ret = 0;
    
        using (WordprocessingDocument document = WordprocessingDocument.Open(_docName, true))
        {
            // obtener el documento
            Document doc = document.MainDocumentPart.Document;
            
            // obtener los elementos de texto del documento
            var elements = doc.Descendants<DocumentFormat.OpenXml.Wordprocessing.Run>();
    
            // obtener numero de veces que se ha encontrado el texto
            ret = elements.Where(w => w.InnerText == _textToSearch).Count();
            
        }
    
        return ret;
    }

    Con este codigo se cuenta el numero de veces que se repite una palabra, no se si es lo que buscas pero se puede partir a partir de aqui.

    Ya me diras algo.







    Saludos
    David González
    Monday, March 15, 2010 9:05 AM

All replies

  • Hola Briayan.

    Una cosa es buscar Texto en office word, otra en .txt, otra en .pdf y otra en cualquier otra aplicacion, ya que cada una tiene una forma distinta de almacenar los datos.

    Yo te puedo ayudar con todas las que has puesto (menos .pptx que no lo he probado nunca), pero debes de saber que cada una llevara una implementacion distinta.

    Asi que paso a paso, ¿por cual quieres empezar?.


    Saludos
    David González
    Friday, March 12, 2010 11:34 AM
  • Gracias por la aclaración y te estoy bastante agradecido por la intención de ayudarme, creo que me gustaría empezar por los documentos de Word.

    Saludos
    Briayan
    Friday, March 12, 2010 3:52 PM
  • Hola Briayan.


    En Word, apartir de la version 2007, microsoft ya no usa su sistema binario de archivo usado por versiones anteriores, ahora usa OpenXML que es un standard abierto, mas info en: http://es.wikipedia.org/wiki/Office_Open_XML

    Bien, estos documentos son ahora paquetes .zip con todos los recursos y en la version 2007 de word viene con la extension .docx, que se puede cambiar a .zip y descomprimir para ver que hay dentro.

    Pues bien, en un principio, se puede hacer uso de varias soluciones para leer un documento Word, usando la libreria OpenXML para formatos del 2007 en adelante o hacer uso del componente para interoperabilidad COM para word.

    Yo te voy a comentar el uso de OpenXML ya que es el mas reciente y da muchos menos problemas en entornos web al no necesitar privilegios para instanciar componentes COM.

    para este ejemplo hace falta bajarse la SDK de OpenXML disponible en:


    se instala y se agrega la referencia en nuestro proyecto a la libreria.

    luego se puede usar este codigo de ejemplo para contar el numero de veces que se repite una palabra:

    NOTA: incluir estos using:

    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml.Packaging;

    /// <summary>
    /// Funcion para buscar una cadena en el documento
    /// </summary>
    /// <param name="_docName">Nombre del documento</param>
    /// <param name="_textToSearch">Texto a buscar</param>
    /// <returns>Numero de veces que ha sido encontrada la cadena</returns>
    public int searchText(string _docName, string _textToSearch)
    {
        int ret = 0;
    
        using (WordprocessingDocument document = WordprocessingDocument.Open(_docName, true))
        {
            // obtener el documento
            Document doc = document.MainDocumentPart.Document;
            
            // obtener los elementos de texto del documento
            var elements = doc.Descendants<DocumentFormat.OpenXml.Wordprocessing.Run>();
    
            // obtener numero de veces que se ha encontrado el texto
            ret = elements.Where(w => w.InnerText == _textToSearch).Count();
            
        }
    
        return ret;
    }

    Con este codigo se cuenta el numero de veces que se repite una palabra, no se si es lo que buscas pero se puede partir a partir de aqui.

    Ya me diras algo.







    Saludos
    David González
    Monday, March 15, 2010 9:05 AM