Compartir a través de


Abrir un documento de procesamiento de texto para acceso de solo lectura

En este tema se describe cómo usar las clases del SDK de Open XML para Office para abrir mediante programación un documento de procesamiento de texto con acceso de solo lectura.


Cuándo se debe abrir un documento para acceso de solo lectura

A veces, se desea abrir un documento para inspeccionar o recuperar algo de información, y se quiere hacer de manera que se garantice que el documento permanezca sin cambios. En estos casos, la idea es abrir el documento para acceso de solo lectura. En este tema de procedimientos se abordan diversas formas de abrir mediante programación un documento de procesamiento de texto de solo lectura.


Creación de un objeto WordprocessingDocument

En el SDK de Open XML, la WordprocessingDocument clase representa un paquete de documento Word. Para trabajar con un documento de Word, cree primero una instancia de la WordprocessingDocument clase a partir del documento y, a continuación, trabaje con esa instancia. Una vez creada la instancia a partir del documento, puede obtener acceso al elemento de documento principal que contiene el texto del documento. Cada paquete de Office Open XML contiene cierto número de elementos. Como mínimo, debe WordprocessingDocument contener una parte del documento principal que actúe como contenedor para el texto principal del documento. El paquete también puede contener elementos adicionales. Tenga en cuenta que en un documento de Word, el texto en el elemento de documento principal se representa en el paquete como XML mediante marcado de WordprocessingML.

Para crear la instancia de clase desde el documento, llame a uno de los Open métodos. Se proporcionan varios Open métodos, cada uno con una firma diferente. En la siguiente tabla, se incluye una lista de los métodos que permiten especificar si un documento se puede editar.

Método Open Tema de referencia de la biblioteca de clases Descripción
Open(String, Boolean) Open(String, Boolean) Cree una instancia de la WordprocessingDocument clase a partir del archivo especificado.
Open(Stream, Boolean) Open(Stream, Boolean) Cree una instancia de la WordprocessingDocument clase a partir del flujo de E/S especificado.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Cree una instancia de la WordprocessingDocument clase a partir del archivo especificado.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Cree una instancia de la WordprocessingDocument clase a partir de la secuencia de E/S especificada.

En la tabla anterior se enumeran solo los Open métodos que aceptan un valor booleano como segundo parámetro para especificar si un documento es editable. Para abrir un documento para acceso de solo lectura, especifique este parámetro como falso.

Observe que dos de los Open métodos crean una instancia de la WordprocessingDocument clase basada en una cadena como primer parámetro. El primer ejemplo del código de ejemplo usa esta técnica. Usa el primer Open método de la tabla anterior; con una firma que requiere dos parámetros. El primer parámetro toma una cadena que representa un nombre de archivo con ruta completa desde la que se quiere abrir el documento. El segundo parámetro es o truefalse; en este ejemplo se usa false e indica si desea abrir el archivo para su edición.

En el ejemplo de código siguiente se llama al Open método .

// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))

Los otros dos Open métodos crean una instancia de la WordprocessingDocument clase basada en un flujo de entrada y salida. Puede emplear este enfoque, por ejemplo, si tiene una aplicación de Microsoft Office SharePoint Online que usa entrada y salida de flujo y desea usar el SDK de Open XML para trabajar con un documento.

El siguiente código de ejemplo abre un documento basándose en una secuencia.

// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))

// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))

Supongamos que tiene una aplicación que emplea la compatibilidad con Open XML en el espacio de nombres System.IO.Packaging de la biblioteca de clases de .NET Framework y que desea usar el SDK de Open XML para trabajar con un paquete de solo lectura. Aunque el SDK de Open XML incluye sobrecargas de método que aceptan como Package primer parámetro, no hay ninguna que tome un valor booleano como segundo parámetro para indicar si el documento debe abrirse para su edición.

El método recomendado es abrir el paquete como de solo lectura para empezar con antes de crear la instancia de la WordprocessingDocument clase, como se muestra en el segundo ejemplo del código de ejemplo. El siguiente ejemplo de código realiza esta operación.

// Open System.IO.Packaging.Package.
using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))

Después de abrir el paquete de documentos de Word, se puede tener acceso al elemento de documento principal. Para tener acceso al cuerpo del elemento de documento principal, se asigna una referencia al cuerpo del documento existente, tal como se muestra en el siguiente ejemplo de código.

// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();

Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

Estructura de un documento WordProcessingML

La estructura básica de un WordProcessingML documento consta de los document elementos y body , seguidos de uno o varios elementos de nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios r elementos. significa r ejecutar, que es una región de texto con un conjunto común de propiedades, como el formato. Una ejecución contiene uno o varios t elementos. El t elemento contiene un intervalo de texto. En el ejemplo de código siguiente se muestra el WordprocessingML marcado de un documento que contiene el texto "Texto de ejemplo".

    <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

Con el SDK de Open XML, puede crear contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a WordprocessingML elementos. Encontrará estas clases en el espacio de DocumentFormat.OpenXml.Wordprocessing nombres. En la tabla siguiente se enumeran los nombres de clase de las clases correspondientes a los documentelementos , body, p, ry t .

Elemento de WordprocessingML Open XML SDK (clase) Descripción
<document/> Document El elemento raíz del elemento de documento principal.
<body/> Body El contenedor de las estructuras a nivel de bloque, como párrafos, tablas, anotaciones y otras recogidas en la especificación ISO/IEC 29500.
<p/> Paragraph Un párrafo.
<r/> Run Un segmento.
<t/> Text Un intervalo de texto.

Para obtener más información sobre la estructura general de los elementos y elementos de un documento WordprocessingML, vea Estructura de un documento WordprocessingML.


Generación del marcado de WordprocessingML para agregar texto e intentar guardar

El código de ejemplo muestra cómo se puede agregar texto e intentar guardar los cambios para mostrar que el acceso es de solo lectura. Una vez que tenga acceso al cuerpo de la parte principal del documento, agregue texto agregando instancias de las Paragraphclases , Runy Text . Esto genera el marcado de WordprocessingML necesario. El siguiente ejemplo de código agrega el párrafo, segmento y texto.

// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();

Código de ejemplo

El primer método de ejemplo que se muestra aquí, OpenWordprocessingDocumentReadOnly, abre un documento Word para el acceso de solo lectura. Al llamar al método, se debe pasar una ruta completa al archivo que desea abrir. Por ejemplo, en el ejemplo de código siguiente se abre la ruta de acceso del archivo desde el primer argumento de línea de comandos para el acceso de solo lectura.

OpenWordprocessingDocumentReadonly(args[0]);

El segundo método de ejemplo, OpenWordprocessingPackageReadonly, muestra cómo abrir un documento de Word para el acceso de solo lectura desde .Package Al llamar al método, se debe pasar una ruta completa al archivo que desea abrir. Por ejemplo, en el ejemplo de código siguiente se abre la ruta de acceso del archivo desde el primer argumento de línea de comandos para el acceso de solo lectura.

OpenWordprocessingPackageReadonly(args[0]);

El tercer método de ejemplo, OpenWordprocessingStreamReadonly, muestra cómo abrir un documento de Word para el acceso de solo lectura desde una secuencia. Al llamar al método, se debe pasar una ruta completa al archivo que desea abrir. Por ejemplo, en el ejemplo de código siguiente se abre la ruta de acceso del archivo desde el primer argumento de línea de comandos para el acceso de solo lectura.

OpenWordprocessingStreamReadonly(args[0]);

Importante

[!IMPORTANTE] Si se quita un comentario de la instrucción que guarda el archivo, el programa genera una IOException, porque el archivo está abierto para acceso de solo lectura.

A continuación se proporciona el código de ejemplo completo en C# y VB.

static void OpenWordprocessingDocumentReadonly(string filepath)
{
    // Open a WordprocessingDocument based on a filepath.
    using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
    {
        if (wordProcessingDocument is null)
        {
            throw new ArgumentNullException(nameof(wordProcessingDocument));
        }

        // Assign a reference to the existing document body or create a new one if it is null.
        MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();

        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Attempt to add some text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        // mainDocumentPart.Document.Save();
    }
}

static void OpenWordprocessingPackageReadonly(string filepath)
{
    // Open System.IO.Packaging.Package.
    using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
    // Open a WordprocessingDocument based on a package.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
    {
        // Assign a reference to the existing document body or create a new one if it is null.
        MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();

        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Attempt to add some text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingPackageReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        // mainDocumentPart.Document.Save();
    }
}


static void OpenWordprocessingStreamReadonly(string filepath)
{
    // Get a stream of the wordprocessing document
    using (FileStream fileStream = new FileStream(filepath, FileMode.Open))

    // Open a WordprocessingDocument for read-only access based on a stream.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
    {


        // Assign a reference to the existing document body or create a new one if it is null.
        MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();

        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Attempt to add some text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingStreamReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        // mainDocumentPart.Document.Save();
    }
}

Vea también