Share via


Abrir un documento de hoja de cálculo con acceso de solo lectura

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para abrir un documento de hoja de cálculo para el acceso de solo lectura mediante programación.


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

En algunos casos, desea abrir un documento para inspeccionar o recuperar parte de la información y desea hacerlo de tal manera que asegure que no se realicen cambios en el documento. En estas ocasiones, desea que el documento tenga acceso de solo lectura. En este tema se exponen varias formas de abrir un documento de hojas de cálculo con acceso de solo lectura mediante programación.


Obtención de un objeto SpreadsheetDocument

En Open XML SDK, la clase SpreadsheetDocument representa un paquete de documentos de Excel. Para crear un documento de Excel, cree una instancia de la clase SpreadsheetDocument y rellénela con partes. Como mínimo, el documento debe tener una parte de libro que sirva como contenedor para el documento y una parte de hoja de cálculo. En el paquete, el texto se representa como XML mediante el marcado SpreadsheetML.

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

Abrir Tema de referencia de la biblioteca de clases Descripción
Open(String, Boolean) Open(String, Boolean) Creación de una instancia de la clase SpreadsheetDocument desde el archivo especificado.
Open(Stream, Boolean) Open(Stream, Boolean Creación de una instancia de la clase SpreadsheetDocument desde la secuencia de E/S especificada.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Creación de una instancia de la clase SpreadsheetDocument desde el archivo especificado.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Creación de una instancia de la clase SpreadsheetDocument desde la secuencia de E/S especificada.

En la tabla que se proporcionó anteriormente en este tema solo se enumeran los métodos Open que aceptan un valor booleano como segundo parámetro para especificar si un documento se puede editar o no. Para abrir un documento que tenga acceso de solo lectura, especifique False para este parámetro.

Tenga en cuenta que dos de los métodos Open crean una instancia de la clase SpreadsheetDocument basándose en una cadena como primer parámetro. El primer ejemplo del código de ejemplo usa esta técnica. Usa el primer método Open de la tabla que se proporcionó anteriormente en este tema, con una firma que necesita dos parámetros. El primer parámetro toma una cadena que representa el nombre de archivo de la ruta de acceso completa desde la que desea abrir el documento. El segundo parámetro es true o false. En este ejemplo se usa false, que indica que desea abrir el archivo con acceso de solo lectura.

El siguiente ejemplo de código llama al método Open.

// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))

Los otros dos métodos Open crean una instancia de la clase SpreadsheetDocument en función de un flujo de entrada y salida. Puede usar este enfoque, por ejemplo, si tiene una aplicación de Microsoft SharePoint Foundation 2010 que usa la entrada y salida de secuencias 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.

// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))

Supongamos que tiene una aplicación que usa 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 como de solo lectura. Mientras que el SDK de Open XML incluye sobrecargas de método que aceptan un paquete como primer parámetro, no hay uno que tome un booleano como segundo parámetro para indicar si el documento debe abrirse para su edición.

Se recomienda abrir el paquete como de solo lectura primero, antes de crear la instancia de la clase SpreadsheetDocument, como se muestra en el segundo ejemplo de código. El siguiente ejemplo de código realiza esta operación.

// Open System.IO.Packaging.Package.
Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

// Open a SpreadsheetDocument based on a package.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))

Estructura básica del documento

La estructura básica de un documento SpreadsheetML consta de los elementos Sheets y Sheet , que hacen referencia a las hojas de cálculo del libro. Se crea un archivo XML separado para cada Worksheet. Por ejemplo, el documento SpreadsheetML para un libro que tiene dos hojas de cálculo denominadas MySheet1 y MySheet2 está ubicado en el archivo Workbook.xml y es el siguiente.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns=https://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships">
        <sheets>
            <sheet name="MySheet1" sheetId="1" r:id="rId1" /> 
            <sheet name="MySheet2" sheetId="2" r:id="rId2" /> 
        </sheets>
    </workbook>

Los archivos XML de hoja de cálculo contienen uno o más elementos de nivel de bloque como SheetData. sheetData representa la tabla de la celda y contiene uno o más elementos Row. Un elemento row contiene uno o más elementos Cell. Cada celda contiene un elemento CellValue que representa el valor de la celda. Por ejemplo, el documento SpreadsheetML para la primera hoja de cálculo de un libro, que solo tiene el valor 100 en la celda A1, está ubicado en el archivo Sheet1.xml y es el siguiente.

    <?xml version="1.0" encoding="UTF-8" ?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <sheetData>
            <row r="1">
                <c r="A1">
                    <v>100</v> 
                </c>
            </row>
        </sheetData>
    </worksheet>

Con el SDK de Open XML, puede crear la estructura de documentos y el contenido que usa clases fuertemente tipadas que corresponden a elementos SpreadsheetML. Puede encontrar estas clases en el espacio de nombres DocumentFormat.OpenXML.Spreadsheet. En la siguiente tabla se enumeran los nombres de las clases que corresponden a los elementos workbook, sheets, sheet, worksheet y sheetData.

Elemento de SpreadsheetML Open XML SDK (clase) Descripción
libro de trabajo DocumentFormat.OpenXml.Spreadsheet.Workbook El elemento raíz del elemento de documento principal.
sheets DocumentFormat.OpenXml.Spreadsheet.Sheets El contenedor de las estructuras del nivel de bloque, como sheet, fileVersion y otras que se detallan en la especificación ISO/IEC 29500.
sheet DocumentFormat.OpenXml.Spreadsheet.Sheet Una hoja que apunta a un archivo de definición de hoja.
worksheet DocumentFormat.OpenXml.Spreadsheet.Worksheet Un archivo de definición de hoja que contiene los datos de la hoja.
sheetData DocumentFormat.OpenXml.Spreadsheet.SheetData La tabla de celdas agrupadas por filas.
row DocumentFormat.OpenXml.Spreadsheet.Row Una fila en una tabla de celdas.
c DocumentFormat.OpenXml.Spreadsheet.Cell Una celda en una fila.
v DocumentFormat.OpenXml.Spreadsheet.CellValue El valor de una celda.

Código de ejemplo

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

using DocumentFormat.OpenXml.Packaging;
using System.IO;
using System.IO.Packaging;

static void OpenSpreadsheetDocumentReadonly(string filePath)
{
    // Open a SpreadsheetDocument based on a file path.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open a SpreadsheetDocument based on a stream.
    Stream stream = File.Open(filePath, FileMode.Open);

    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open System.IO.Packaging.Package.
    Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

    // Open a SpreadsheetDocument based on a package.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }
}

Consulte también