Compartilhar via


Abrir documento de uma planilha de um fluxo

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para abrir um documento de folha de cálculo a partir de um fluxo programaticamente.


Quando Abrir a Partir de um Stream

Se tiver uma aplicação, como Microsoft SharePoint Foundation 2010, que funcione com documentos através da entrada/saída de fluxo e quiser utilizar o SDK Open XML para trabalhar com um dos documentos, esta ação foi concebida para ser fácil de fazer. Isto é especialmente verdade se o documento existir e pode abri-lo com o SDK Open XML. No entanto, suponha que o documento é um fluxo aberto no ponto do código em que tem de utilizar o SDK para trabalhar com o mesmo? Este é 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 com o SDK Open XML.


Objeto SpreadsheetDocument

A estrutura básica do documento de uma Folha de CálculoML consiste nos Sheets elementos e Sheet , que referenciam as folhas de cálculo no Workbook. É criado um ficheiro XML separado para cada Worksheet. Por exemplo, a Folha de CálculoML de um livro que tem duas folhas de cálculo com o nome MySheet1 e MySheet2 está localizada no ficheiro Workbook.xml e é a 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 ficheiros XML da folha de cálculo 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, a Folha de CálculoML da primeira folha de cálculo num livro, que tem apenas o valor 100 na célula A1, está localizada no ficheiro Sheet1.xml e é a 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>

Com o SDK Open XML, pode criar a estrutura do documento e o conteúdo que utiliza classes com tipos fortes que correspondem a elementos de Folha de CálculoML. Pode encontrar estas classes no DocumentFormat.OpenXML.Spreadsheet espaço de nomes. A tabela seguinte lista os nomes das classes que correspondem aos workbookelementos , sheets, sheet, worksheete sheetData .

Elemento SpreadsheetML Abrir Classe SDK XML Descrição
<workbook/> Workbook O elemento raiz para a parte do documento principal.
<sheets/> Sheets O contentor para as estruturas ao nível do bloco, como folha, 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 de Folha de CálculoML para Adicionar uma Folha de Cálculo

Quando tem acesso ao corpo da parte do documento main, adiciona uma folha de cálculo ao chamar AddNewPart o método para criar um novo WorksheetPart. O seguinte exemplo de código adiciona o novo WorksheetPart.


// 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 utilizado para abrir um documento de folha de cálculo a partir de um fluxo já aberto e acrescentar algum texto ao mesmo. 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);
}

Repare que o OpenAddAndAddToSpreadsheetStream método não fecha o fluxo transmitido para o mesmo. O código de chamada tem de o fazer 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);
        }
    }
}


Confira também