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.
Objeto SpreadsheetDocument
La estructura básica del documento SpreadsheetML consta de los Sheets elementos y Sheet , que hacen referencia a las hojas de cálculo de Workbook. Se crea un archivo XML independiente 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="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://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 varios elementos de nivel de bloque, como SheetData.
sheetData
representa la tabla de celdas y contiene uno o varios Row elementos. contiene row
uno o varios Cell elementos. Cada celda contiene un CellValue elemento 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 DocumentFormat.OpenXML.Spreadsheet
nombres. En la tabla siguiente se enumeran los nombres de clase de las clases correspondientes a los workbook
elementos , sheets
, sheet
, worksheet
y sheetData
.
Elemento de SpreadsheetML | Open XML SDK (clase) | Descripción | |
---|---|---|---|
<workbook/> |
Workbook | El elemento raíz del elemento de documento principal. | |
<sheets/> |
Sheets | Contenedor de las estructuras de nivel de bloque, como sheet, fileVersion y | especificados en la especificación ISO/IEC 29500 . |
<sheet/> |
Sheet | Una hoja que apunta a un archivo de definición de hoja. | |
<worksheet/> |
Worksheet | Un archivo de definición de hoja que contiene los datos de la hoja. | |
<sheetData/> |
SheetData | La tabla de celdas agrupadas por filas. | |
<row/> |
Row | Una fila en una tabla de celdas. | |
<c/> |
Cell | Una celda en una fila. | |
<v/> |
CellValue | El valor de una celda. |
Obtención de un objeto SpreadsheetDocument
En el SDK de Open XML, la SpreadsheetDocument clase representa un paquete de documentos de Excel. Para crear un documento de Excel, cree una instancia de la SpreadsheetDocument
clase 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 el documento al que se llama a uno de los Open métodos de sobrecarga. 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.
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 anterior de este tema 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 el acceso de solo lectura, especifique False
para este parámetro.
Observe que dos de los Open
métodos crean una instancia de la clase SpreadsheetDocument 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 anteriormente en este tema; con una firma que requiere 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 o true
false
. En este ejemplo se usa false
e indica que desea abrir el archivo como de solo lectura.
En el ejemplo de código siguiente se llama al Open
método .
// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
Los otros dos Open
métodos crean una instancia de la clase SpreadsheetDocument basada en 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 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 consiste en abrir el paquete como de solo lectura al principio, antes de crear la instancia de la SpreadsheetDocument
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.
Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);
// Open a SpreadsheetDocument based on a package.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))
Código de ejemplo
A continuación se incluye el código de ejemplo completo en C# y Visual Basic.
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.
}
}
}