Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico mostra como usar as classes no Open XML SDK for Office para abrir um documento de planilha de um fluxo programaticamente.
Quando abrir a partir de um Stream
Se você tiver um aplicativo, como o Microsoft SharePoint Foundation 2010, que funciona com documentos usando entrada/saída de fluxo e quiser usar o Open XML SDK para trabalhar com um dos documentos, isso foi projetado para ser fácil de fazer. Isso é especialmente verdadeiro se o documento existir e você puder abri-lo usando o Open XML SDK. No entanto, suponha que o documento seja um fluxo aberto no ponto do código em que você deve usar o SDK para trabalhar com ele? Esse é o cenário para este tópico. O método de exemplo no código de exemplo aceita um fluxo aberto como um parâmetro e, em seguida, adiciona texto ao documento por trás do fluxo usando o SDK do Open XML.
O objeto SpreadsheetDocument
A estrutura básica do documento de um documento SpreadsheetML consiste nos Sheets elementos and Sheet , que fazem referência às planilhas no Workbook. Um arquivo XML separado é criado para cada Worksheetarquivo . Por exemplo, o SpreadsheetML de uma pasta de trabalho que tem duas planilhas chamadas MySheet1 e MySheet2 está localizado no arquivo Workbook.xml e é o seguinte.
<?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>
Os arquivos XML da planilha contêm um ou mais elementos de nível de bloco, como SheetData.
sheetData Representa a tabela de células e contém um ou mais Row elementos. A row contém um ou mais Cell elementos. Cada célula contém um CellValue elemento que representa o valor da célula. Por exemplo, o SpreadsheetML da primeira planilha em uma pasta de trabalho, que tem apenas o valor 100 na célula A1, está localizado no arquivo Sheet1.xml e é o seguinte.
<?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>
Usando o SDK do Open XML, você pode criar estrutura e conteúdo de documento que usa classes fortemente tipadas que correspondem a elementos SpreadsheetML. Você pode encontrar essas classes no DocumentFormat.OpenXML.Spreadsheet namespace. A tabela a seguir lista os nomes de classe das classes que correspondem aos workbookelementos , sheets, , sheetworksheet, , . .sheetData
| Elemento SpreadsheetML | Classe Open XML SDK | Descrição | |
|---|---|---|---|
<workbook/> |
Workbook | O elemento raiz para a parte do documento principal. | |
<sheets/> |
Sheets | O contêiner para as estruturas de nível de bloco, como sheet, fileVersion e | outros especificados na especificação ISO/IEC 29500 . |
<sheet/> |
Sheet | Uma planilha que aponta para um arquivo de definição de planilha. | |
<worksheet/> |
Worksheet | Um arquivo de definição de planilha que contém os dados de planilha. | |
<sheetData/> |
SheetData | A tabela de células, agrupadas por linhas. | |
<row/> |
Row | Uma linha na tabela de células. | |
<c/> |
Cell | Uma célula em uma linha. | |
<v/> |
CellValue | O valor de uma célula. |
Gerar a marcação SpreadsheetML para adicionar uma planilha
Quando você tem acesso ao corpo da parte principal do documento, adiciona uma planilha chamando AddNewPart o método para criar um novo WorksheetPartarquivo . O exemplo de código a seguir adiciona o novo WorksheetPartarquivo .
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Código de exemplo
Neste exemplo, o OpenAndAddToSpreadsheetStream método pode ser usado para abrir um documento de planilha de um fluxo já aberto e anexar algum texto a ele. Este é o código de exemplo completo em C# e em Visual Basic.
using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
OpenAndAddToSpreadsheetStream(fileStream);
}
Observe que o OpenAddAndAddToSpreadsheetStream método não fecha o fluxo passado para ele. O código de chamada deve fazer isso manualmente ou com uma using instrução.
Este é o código de exemplo completo em C# e em 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);
}
}
}