Abrir documento de uma planilha de um fluxo
Este tópico mostra como usar as classes no SDK Open XML para Office para abrir um documento de planilha de um fluxo de forma programática.
Quando abrir de um fluxo
Se você tiver um aplicativo, como Microsoft SharePoint Foundation 2010, que funcione com documentos usando entrada/saída de fluxo e quiser usar o SDK Open XML para trabalhar com um dos documentos, isso será projetado para ser fácil de fazer. Isso é especialmente verdadeiro se o documento existir e você pode abri-lo usando o SDK Open XML. 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 parâmetro e adiciona texto ao documento por trás do fluxo usando o SDK Open XML.
O Objeto SpreadsheetDocument
A estrutura básica de um documento SpreadsheetML consiste nos elementos Sheets e Sheet, que referenciam as planilhas na pasta de trabalho. Um arquivo XML separado é criado para cada planilha. Por exemplo, o SpreadsheetML para uma pasta de trabalho que tem duas planilhas nome MySheet1 e MySheet2 está localizado no arquivo Workbook.xml e é mostrado no exemplo de código a seguir.
<?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>
Os arquivos XML da planilha contêm um ou mais elementos em nível de bloco como SheetData. sheetData representa a tabela da célula e contém um ou mais elementos Row. Uma linha contém um ou mais elementos Cell. Cada célula contém um elemento CellValue que representa o valor da célula. Por exemplo, a PlanilhaML da primeira planilha em uma pasta de trabalho, que tem apenas o valor 100 na célula A1, está localizada no arquivo Sheet1.xml e é mostrada no exemplo de código a seguir.
<?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 a estrutura de documentos e o conteúdo que usa classes fortemente tipdas que correspondem a elementos SpreadsheetML. Você pode encontrar essas classes no namespace DocumentFormat.OpenXML.Spreadsheet. A tabela a seguir lista os nomes das classes que correspondem aos elementos workbook, sheets, sheet, worksheet e sheetData.
Elemento SpreadsheetML | Classe SDK Open XML | Descrição |
---|---|---|
pasta de trabalho | DocumentFormat.OpenXml.Spreadsheet.Workbook | O elemento raiz para a parte do documento principal. |
sheets | DocumentFormat.OpenXml.Spreadsheet.Sheets | O contêiner para as estruturas de nível de bloco, como sheet, fileVersion e outras indicadas na especificação ISO/IEC 29500. |
sheet | DocumentFormat.OpenXml.Spreadsheet.Sheet | Uma planilha que aponta para um arquivo de definição de planilha. |
worksheet | DocumentFormat.OpenXml.Spreadsheet.Worksheet | Um arquivo de definição de planilha que contém os dados de planilha. |
sheetData | DocumentFormat.OpenXml.Spreadsheet.SheetData | A tabela de células, agrupadas por linhas. |
row | DocumentFormat.OpenXml.Spreadsheet.Row | Uma linha na tabela de células. |
c | DocumentFormat.OpenXml.Spreadsheet.Cell | Uma célula em uma linha. |
v | DocumentFormat.OpenXml.Spreadsheet.CellValue | O valor de uma célula. |
Gerando a Marcação de PlanilhaML para adicionar uma planilha
Quando você tem acesso ao corpo da parte do documento main, você adiciona uma planilha chamando o método AddNewPart<T>(String, String) para criar uma nova WorksheetPart. O exemplo de código a seguir adiciona a nova WorksheetPart.
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
newWorksheetPart.Worksheet.Save();
Código de exemplo
Neste exemplo, o método OpenAndAddToSpreadsheetStream pode ser usado para abrir um documento de planilha de um fluxo já aberto e acrescentar algum texto a ele. Este é o código de exemplo completo em C# e em Visual Basic.
var fileStream = File.Open(args[0], FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
OpenAndAddToSpreadsheetStream(fileStream);
Observe que o método OpenAddAndAddToSpreadsheetStream não fecha o fluxo passado para ele. O código de chamada deve fazer isso.
Este é o código de exemplo completo em C# e em Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO;
using System.Linq;
static void OpenAndAddToSpreadsheetStream(Stream stream)
{
// Open a SpreadsheetDocument based on a stream.
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());
newWorksheetPart.Worksheet.Save();
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);
workbookPart.Workbook.Save();
// Dispose the document handle.
spreadsheetDocument.Dispose();
}
}