Abrir un documento de hoja de cálculo desde una secuencia
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 desde una secuencia mediante programación.
Cuándo se debe abrir desde una secuencia
Si tiene una aplicación, como Microsoft SharePoint Foundation 2010, que funciona con documentos mediante la entrada y salida de secuencias y desea usar el SDK de Open XML para trabajar con uno de los documentos, esto está diseñado para ser fácil de hacer. Esto es especialmente cierto si el documento existe y puede abrirlo mediante el SDK de Open XML. Sin embargo, imagine que el documento contiene un flujo abierto en el lugar del código donde necesita trabajar con el SDK. Ese es el escenario de este tema. El método de ejemplo del código de ejemplo acepta una secuencia abierta como parámetro y, a continuación, agrega texto al documento detrás de la secuencia mediante el SDK de Open XML.
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. |
Generación del marcado SpreadsheetML para agregar una hoja de cálculo
Cuando tiene acceso al cuerpo de la parte principal del documento, agregue una hoja de cálculo llamando al AddNewPart método para crear un nuevo WorksheetPart. En el ejemplo de código siguiente se agrega el nuevo WorksheetPart
.
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Código de ejemplo
En este ejemplo, el OpenAndAddToSpreadsheetStream
método se puede usar para abrir un documento de hoja de cálculo desde una secuencia ya abierta y anexar texto a él. A continuación se incluye el código de ejemplo completo en C# y Visual Basic.
using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
OpenAndAddToSpreadsheetStream(fileStream);
}
Observe que el OpenAddAndAddToSpreadsheetStream
método no cierra la secuencia que se le ha pasado. El código de llamada debe hacerlo manualmente o con una using
instrucción .
A continuación se incluye el código de ejemplo completo en C# y Visual Basic.
static void OpenAndAddToSpreadsheetStream(Stream stream)
{
// Open a SpreadsheetDocument based on a stream.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
{
if (spreadsheetDocument is not null)
{
// Get or create the WorkbookPart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Workbook workbook = workbookPart.Workbook ?? new Workbook();
if (workbookPart.Workbook is null)
{
workbookPart.Workbook = workbook;
}
Sheets sheets = workbook.GetFirstChild<Sheets>() ?? workbook.AppendChild(new Sheets());
string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);
// Get a unique ID for the new worksheet.
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId = (sheets.Elements<Sheet>().Select(s => s.SheetId?.Value).Max() + 1) ?? (uint)sheets.Elements<Sheet>().Count() + 1;
}
// Give the new worksheet a name.
string sheetName = "Sheet" + sheetId;
// Append the new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);
}
}
}