Share via


Validar un documento de procesamiento de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para validar mediante programación un documento de procesamiento de texto.


Funcionamiento del código de ejemplo

Este ejemplo de código consta de dos métodos. El primer método, ValidateWordDocument, se usa para validar un archivo Word normal. No produce ninguna excepción y cierra el archivo después de ejecutar la comprobación de validación. El segundo método, ValidateCorruptedWordDocument, comienza insertando texto en el cuerpo, lo que provoca un error de esquema. A continuación, valida el archivo Word, en cuyo caso el método produce una excepción al intentar abrir el archivo dañado. La validación se realiza mediante el método Validate . El código muestra información sobre los errores que se encuentran, además del recuento de errores.


Código de ejemplo

En el método principal, se puede llamar a los dos métodos, ValidateWordDocument y ValidateCorruptedWordDocument, mediante el siguiente ejemplo que valida un archivo denominado "Word18.docx.".

    string filepath = @"C:\Users\Public\Documents\Word18.docx";
    ValidateWordDocument(filepath);
    Console.WriteLine("The file is valid so far.");
    Console.WriteLine("Inserting some text into the body that would cause Schema error");
    Console.ReadKey();

    ValidateCorruptedWordDocument(filepath);
    Console.WriteLine("All done! Press a key.");
    Console.ReadKey();

Importante

[!IMPORTANTE] Tenga en cuenta que no puede volver a ejecutar el código después de dañar el archivo en la primera ejecución. Tiene que comenzar con un nuevo archivo de Word.

A continuación se incluye el código de ejemplo completo en C# y Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Validation;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

ValidateCorruptedWordDocument(args[0]);

static void ValidateWordDocument(string filepath)
{
    using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filepath, true))
    {
        try
        {
            OpenXmlValidator validator = new OpenXmlValidator();
            int count = 0;
            foreach (ValidationErrorInfo error in
                validator.Validate(wordprocessingDocument))
            {
                count++;
                Console.WriteLine("Error " + count);
                Console.WriteLine("Description: " + error.Description);
                Console.WriteLine("ErrorType: " + error.ErrorType);
                Console.WriteLine("Node: " + error.Node);
                if (error.Path is not null)
                {
                    Console.WriteLine("Path: " + error.Path.XPath);
                }
                if (error.Part is not null)
                {
                    Console.WriteLine("Part: " + error.Part.Uri);
                }
                Console.WriteLine("-------------------------------------------");
            }

            Console.WriteLine("count={0}", count);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        wordprocessingDocument.Dispose();
    }
}

static void ValidateCorruptedWordDocument(string filepath)
{
    // Insert some text into the body, this would cause Schema Error
    using (WordprocessingDocument wordprocessingDocument =
    WordprocessingDocument.Open(filepath, true))
    {

        if (wordprocessingDocument.MainDocumentPart is null || wordprocessingDocument.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Insert some text into the body, this would cause Schema Error
        Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
        Run run = new Run(new Text("some text"));
        body.Append(run);

        try
        {
            OpenXmlValidator validator = new OpenXmlValidator();
            int count = 0;
            foreach (ValidationErrorInfo error in
                validator.Validate(wordprocessingDocument))
            {
                count++;
                Console.WriteLine("Error " + count);
                Console.WriteLine("Description: " + error.Description);
                Console.WriteLine("ErrorType: " + error.ErrorType);
                Console.WriteLine("Node: " + error.Node);
                if (error.Path is not null)
                {
                    Console.WriteLine("Path: " + error.Path.XPath);
                }
                if (error.Part is not null)
                {
                    Console.WriteLine("Part: " + error.Part.Uri);
                }
                Console.WriteLine("-------------------------------------------");
            }

            Console.WriteLine("count={0}", count);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

Vea también