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 para acesso somente leitura programaticamente.
Quando abrir um documento para o Read-Only Access
Às vezes, você deseja abrir um documento para inspecionar ou recuperar algumas informações e deseja fazer isso de um modo a garantir que o documento permaneça inalterado. Nesses casos, você deseja abrir o documento para acesso somente leitura. Este tópico de Como fazer discute várias maneiras de abrir programaticamente um documento de planilha somente leitura.
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. |
Obtendo um Objeto SpreadsheetDocument
No SDK do Open XML, a SpreadsheetDocument classe representa um pacote de documentos do Excel. Para criar um documento do Excel, crie uma instância da classe e preencha-a SpreadsheetDocument 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 a partir do documento que você chama um dos métodos de Open sobrecarga. Vários Open métodos 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 de referência da biblioteca de classes | Descrição |
|---|---|---|
| Open(String, Boolean) | Open(String, Boolean) | Crie uma instância da classe SpreadsheetDocument a partir 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 a partir 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 somente os Open métodos que aceitam um valor booleano 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 Open métodos 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 Open método 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 é ou true .false Este exemplo usa false e indica que você deseja abrir o arquivo como somente leitura.
O exemplo de código a seguir chama o Open Método.
// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
Os outros dois Open métodos 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 do Microsoft SharePoint Foundation 2010 que usa entrada/saída de fluxo e quiser usar o Open XML SDK 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 use o suporte a Open XML no namespace System.IO.Packaging da Biblioteca de Classes do .NET Framework e queira usar o Open XML SDK para trabalhar com um pacote como somente leitura. Enquanto o SDK do Open XML inclui sobrecargas de método que aceitam a Package como o primeiro parâmetro, não há um que usa um booleano 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 SpreadsheetDocument instância da classe, 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))
Código de exemplo
Este é o código de exemplo completo em C# e em Visual Basic.
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.
}
}
}