Abrir documento de uma planilha para acesso somente leitura
Este tópico mostra como usar as classes no SDK do Open XML para Office para abrir um documento de planilha para acesso somente leitura de forma programática.
Quando abrir um documento para acesso Read-Only
Às vezes, você deseja abrir um documento para inspecionar ou recuperar algumas informações e deseja fazer isso de uma maneira que garanta que o documento permaneça inalterado. Nessas instâncias, você deseja abrir o documento para acesso somente leitura. Este tópico How To discute várias maneiras de abrir programaticamente um documento de planilha somente leitura.
Obtendo um Objeto SpreadsheetDocument
O SDK para XML aberto, a classe SpreadsheetDocument representa um pacote de documentos Excel . Para criar um documento do Excel, crie uma instância da classe SpreadsheetDocument e preencha-a com partes. No mínimo, o documento deve ter uma parte de pasta de trabalho que funcione como um contêiner para o documento e pelo menos uma parte de planilha. O texto é representado no pacote como XML usando a marcação SpreadsheetML.
Para criar a instância de classe do documento, chame um dos métodos de sobrecarga Open() . Vários métodos Open são fornecidos, cada um com uma assinatura diferente. Os métodos que permitem especificar se um documento é editável estão listados na tabela a seguir.
Abrir | Tópico referência da biblioteca de classes | Descrição |
---|---|---|
Open(String, booleano) | Open(String, booleano) | Crie uma instância da classe SpreadsheetDocument do arquivo especificado. |
Open(Stream, Boolean) | Open(Stream, Boolean | Crie uma instância da classe SpreadsheetDocument a partir do fluxo de E/S especificado. |
Open(String, Boolean, OpenSettings) | Open(String, Boolean, OpenSettings) | Crie uma instância da classe SpreadsheetDocument do arquivo especificado. |
Open(Stream, Boolean, OpenSettings) | Open(Stream, Boolean, OpenSettings) | Crie uma instância da classe SpreadsheetDocument a partir do fluxo de E/S especificado. |
A tabela anterior neste tópico lista apenas os métodos Open que aceitam um valor booliano como o segundo parâmetro para especificar se um documento é editável. Para abrir um documento para acesso somente leitura, especifique False para este parâmetro.
Observe que dois dos métodos Open criam uma instância da classe SpreadsheetDocument com base em uma cadeia de caracteres como o primeiro parâmetro. O primeiro exemplo no código de exemplo usa essa técnica. Ele usa o primeiro método Open na tabela anterior neste tópico; com uma assinatura que requer dois parâmetros. O primeiro parâmetro usa uma cadeia de caracteres que representa o nome do arquivo de caminho completo do qual você deseja abrir o documento. O segundo parâmetro é verdadeiro ou falso. Este exemplo usa false e indica que você deseja abrir o arquivo como somente leitura.
O exemplo de código a seguir chama o Método Open .
// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
Os outros dois métodos Open criam uma instância da classe SpreadsheetDocument com base em um fluxo de entrada/saída. Você pode usar essa abordagem, por exemplo, se tiver um aplicativo Microsoft SharePoint Foundation 2010 que usa entrada/saída de fluxo e quiser usar o SDK Open XML para trabalhar com um documento.
O exemplo de código a seguir abre um documento com base em um fluxo.
// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
Suponha que você tenha um aplicativo que usa o suporte a Open XML no namespace System.IO.Packaging da Biblioteca de Classes .NET Framework e que deseja usar o SDK Open XML para trabalhar com um pacote somente leitura. Enquanto o SDK do Open XML inclui sobrecargas de método que aceitam um Pacote como o primeiro parâmetro, não há um que usa um booliano como o segundo parâmetro para indicar se o documento deve ser aberto para edição.
O método recomendado é abrir o pacote como somente leitura no início, antes de criar a instância da classe SpreadsheetDocument , conforme mostrado no segundo exemplo no código de exemplo. O exemplo de código a seguir executa essa operação.
// 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))
Estrutura básica de documentos
A estrutura básica do documento de um documento SpreadsheetML consiste nos elementos Planilhas e Planilhas , que fazem referência às 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 é o seguinte.
<?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, o SpreadsheetML para a 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 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. |
Código de exemplo
Este é o código de exemplo completo em C# e em Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System.IO;
using System.IO.Packaging;
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.
}
}
}