Abrir documento de uma planilha para acesso somente leitura
Este tópico mostra como utilizar as classes no SDK Open XML para o Office para abrir um documento de folha de cálculo para acesso só de leitura programaticamente.
Quando Abrir um Documento para Read-Only Access
Por vezes, quer abrir um documento para inspecionar ou obter algumas informações e pretende fazê-lo de forma a garantir que o documento permanece inalterado. Nestes casos, quer abrir o documento para acesso só de leitura. Este tópico Procedimentos aborda várias formas de abrir programaticamente um documento de folha de cálculo só de leitura.
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 workbook
elementos , sheets
, sheet
, worksheet
e 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. |
Obtendo um Objeto SpreadsheetDocument
No SDK 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 a que chama um dos métodos de Open sobrecarga. São fornecidos vários Open
métodos, cada um com uma assinatura diferente. Os métodos que lhe permitem especificar se um documento é editável estão listados na tabela seguinte.
Abrir | Tópico de Referência da Biblioteca de Classes | Descrição |
---|---|---|
Open(String, Boolean) | Open(String, Boolean) | Crie uma instância da classe Folha de CálculoDocumento a partir do ficheiro especificado. |
Abrir(Stream, Booleano) | Abrir(Stream, Booleano | Crie uma instância da classe Folha de CálculoDocumento a partir do fluxo de E/S especificado. |
Open(String, Boolean, OpenSettings) | Open(String, Boolean, OpenSettings) | Crie uma instância da classe Folha de CálculoDocumento a partir do ficheiro especificado. |
Abrir(Stream, Booleano, OpenSettings) | Abrir(Stream, Booleano, OpenSettings) | Crie uma instância da classe Folha de CálculoDocumento a partir do fluxo de E/S especificado. |
A tabela anterior neste tópico lista apenas os Open
métodos que aceitam um valor Booleano como segundo parâmetro para especificar se um documento é editável. Para abrir um documento para acesso só de leitura, especifique False
para este parâmetro.
Repare que dois dos Open
métodos criam uma instância da classe SpreadsheetDocument com base numa cadeia como o primeiro parâmetro. O primeiro exemplo no código de exemplo utiliza esta técnica. Utiliza o primeiro Open
método na tabela anteriormente neste tópico, com uma assinatura que requer dois parâmetros. O primeiro parâmetro utiliza uma cadeia que representa o nome de ficheiro de caminho completo a partir do qual pretende abrir o documento. O segundo parâmetro é true
ou false
. Este exemplo utiliza false
e indica que pretende abrir o ficheiro como só de leitura.
O seguinte exemplo de código 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 Folha de CálculoDocumento com base num fluxo de entrada/saída. Pode utilizar esta abordagem, por exemplo, se tiver uma aplicação Microsoft SharePoint Foundation 2010 que utilize entrada/saída de fluxo e quiser utilizar o SDK Open XML para trabalhar com um documento.
O seguinte exemplo de código abre um documento com base num fluxo.
// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
Suponha que tem uma aplicação que utiliza o suporte Open XML no espaço de nomes System.IO.Packaging da Biblioteca de Classes .NET Framework e que pretende utilizar o SDK Open XML para trabalhar com um pacote como só de leitura. Enquanto o SDK Open XML inclui sobrecargas de métodos que aceitam um Package
como primeiro parâmetro, não existe um que utilize um Booleano como segundo parâmetro para indicar se o documento deve ser aberto para edição.
O método recomendado é abrir o pacote como só de leitura no início, antes de criar a instância da SpreadsheetDocument
classe, conforme mostrado no segundo exemplo no código de exemplo. O seguinte exemplo de código efetua esta 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.
}
}
}