Поделиться через


Открытие электронной таблицы только для чтения

Дата последнего изменения: 14 октября 2010 г.

Применимо к: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

В этой статье
Когда следует открывать документ только для чтения
Получение объекта SpreadsheetDocument
Базовая структура документа
Попытка создать разметку SpreadsheetML для добавления листа
Пример кода

В этом разделе показано, как использовать классы в пакете SDK Open XML версии 2.0 для Microsoft Office для открытия электронной таблицы программным образом в режиме только для чтения.

Для компиляции кода, представленного в этом разделе, требуются следующие директивы сборки.

using System.IO;
using System.IO.Packaging;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
Imports System.IO
Imports System.IO.Packaging
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet

Когда следует открывать документ только для чтения

Иногда требуется открыть документ для проверки или получения некоторых сведений, при этом нужно сделать это так, чтобы документ нельзя было изменить. В этих случаях документ нужно открыть только для чтения. В этом разделе описывается несколько способов открытия документа электронной таблицы только для чтения программными средствами.

Получение объекта SpreadsheetDocument

В Open XML SDK класс SpreadsheetDocument представляет пакет документа Excel. Для создания документа Excel необходимо создать экземпляр класса SpreadsheetDocument и заполнить его соответствующими частями. Как минимум, документ должен содержать часть книги, которая служит контейнером для документа, и хотя бы одну часть листа. Текст представляется в этом пакете в виде XML с использованием разметки SpreadsheetML.

Чтобы создать экземпляр класса на основе документа, необходимо вызвать один из перегруженных методов Open(). Представлено несколько таких методов Open с разными сигнатурами. В следующей таблице представлены имена методы, позволяющие указать, можно ли изменять документ.

Метод Open

Раздел справочника библиотеки классов

Описание

Open(String, Boolean)

Open(String, Boolean)

Создание экземпляра класса SpreadsheetDocument в указанном файле.

Open(Stream, Boolean)

Open(Stream, Boolean)

Создание экземпляра класса SpreadsheetDocument в указанном потоке ввода-вывода.

Open(String, Boolean, OpenSettings)

Open(String, Boolean, OpenSettings)

Создание экземпляра класса SpreadsheetDocument в указанном файле.

Open(Stream, Boolean, OpenSettings)

Open(Stream, Boolean, OpenSettings)

Создание экземпляра класса SpreadsheetDocument в указанном потоке ввода-вывода.

В таблице, представленной ранее, указаны только те методы Open, которые в качестве второго параметра принимают логическое значение, определяющее, можно ли изменять документ. Чтобы открыть документ только для чтения задайте для этого параметра значение False.

Обратите внимание на то, что два из методов Open создают экземпляр класса SpreadsheetDocument на основе строки, заданной в качестве первого параметра. Этот способ используется в первом примере кода. В нем применяется первый метод Open из таблицы, представленной ранее, с сигнатурой, для которой требуется два параметра. Первый параметр принимает строку, представляющую полный путь имени файла, из которого нужно открыть документ. Второй параметр равен true или false. В этом примере используется значение false, которое означает, что файл открывается только для чтения.

В следующем примере кода вызывается метод Open.

// Open a SpreadsheetDocument for read-only access based on a filepath.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
' Open a SpreadsheetDocument for read-only access based on a filepath.
Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(filepath, False)

В других двух методах Open создается экземпляр класса SpreadsheetDocument на основе потока ввода-вывода. Этот подход можно использовать, например, в случае, когда есть приложение Microsoft SharePoint Foundation 2010, которое использует поток ввода-вывода, и нужно использовать пакет SDK Open XML версии 2.0 для работы с документами.

В следующем коде открывается документ на основе потока.

Stream stream = File.Open(strDoc, FileMode.Open);
// Open a SpreadsheetDocument for read-only access based on a stream.
using (SpreadsheetDocument spreadsheetDocument =
    SpreadsheetDocument.Open(stream, false))
Dim stream As Stream = File.Open(strDoc, FileMode.Open)
' Open a SpreadsheetDocument for read-only access based on a stream.
Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(stream, False)

Представим, что есть приложение, использующее поддержку Open XML в пространстве имен System.IO.Packaging библиотеки классов .NET Framework, и нужно использовать пакет SDK Open XML версии 2.0 для работы с пакетом в режиме доступа только для чтения. Хотя пакет SDK Open XML версии 2.0 содержит перегрузки метода, принимающие Package в качестве первого параметра, нет такой перегрузки, которая принимает в качестве второго параметра логическое значение, обозначающее, нужно ли открыть документ для редактирования.

Рекомендуется сначала открыть пакет только для чтения перед созданием экземпляра класса SpreadsheetDocument, как показано во втором примере кода. В следующем примере выполняется эта операция.

// 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))
' Open System.IO.Packaging.Package.
Dim spreadsheetPackage As Package = Package.Open(filepath, FileMode.Open, FileAccess.Read)

' Open a SpreadsheetDocument based on a package.
Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage)

После открытия пакета документов электронной таблицы можно получить доступ к основной части книги. Для этого нужно назначить ссылку на существующую часть книги, как показано в следующем примере кода.

// Assign a reference to the existing workbook part.
WorkbookPart wbPart = document.WorkbookPart;
' Assign a reference to the existing workbook part.
Dim wbPart As WorkbookPart = document.WorkbookPart

Базовая структура документа

Базовая структура документа SpreadsheetML состоит из элементов Sheets и Sheet, которые ссылаются на листы в книге Workbook. Для каждого листа Worksheet создается отдельный XML-файл. Например, разметка SpreadsheetML для книги с двумя листами MySheet1 и MySheet2 хранится в файле Workbook.xml. Эта разметка приведена ниже.

<?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>

XML-файлы листов содержат один или несколько элементов уровня блока, такие как SheetData. sheetData представляет таблицу и содержит один или несколько элементов Row. row содержит один или несколько элементов Cell. Каждая ячейка содержит один или несколько элементов CellValue, которые представляют значение ячейки. Например, разметка SpreadsheetML для первого листа в книге, в которой для ячейки A1 задано значение 100, размещена в файле Sheet1.xml и выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8" ?> 
<worksheet xmlns="https://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <sheetData>
        <row r="1">
            <c r="A1">
                <v>100</v> 
            </c>
        </row>
    </sheetData>
</worksheet>

При использовании пакета SDK Open XML версии 2.0 можно создать структуру и содержимое документа с помощью строго типизированных классов, соответствующих элементам SpreadsheetML. Эти классы можно найти в пространстве имен DocumentFormat.OpenXML.Spreadsheet. В следующей таблице представлены имена классов, соответствующие элементам workbook, sheets, sheet, worksheet и sheetData.

Элемент SpreadsheetML

Класс пакета SDK Open XML версии 2.0

Описание

workbook

DocumentFormat.OpenXml.Spreadsheet.Workbook

Корневой элемент основной части документа.

sheets

DocumentFormat.OpenXml.Spreadsheet.Sheets

Контейнер для структур уровня блока, таких как sheet, fileVersion и др., определенных в спецификации ISO/IEC 29500 (Возможно, на английском языке).

sheet

DocumentFormat.OpenXml.Spreadsheet.Sheet

Лист, указывающий на файл определения листа.

worksheet

DocumentFormat.OpenXml.Spreadsheet.Worksheet

Файл определения листа, который содержит данные листа.

sheetData

DocumentFormat.OpenXml.Spreadsheet.SheetData

Таблица, сгруппированная по строкам.

row

DocumentFormat.OpenXml.Spreadsheet.Row

Строка в таблице ячеек.

c

DocumentFormat.OpenXml.Spreadsheet.Cell

Ячейка в строке.

v

DocumentFormat.OpenXml.Spreadsheet.CellValue

Значение ячейки.

Попытка создать разметку SpreadsheetML для добавления листа

В этом примере кода показано, как при попытке добавить новый лист возникает исключение, так как файл открыт только для чтения. При получении доступа к телу основной части документа лист добавляется с помощью метода AddNewPart<T>(String, String), который создает WorksheetPart. В следующем примере кода показана попытка добавления нового листа WorksheetPart.

public static void OpenSpreadsheetDocumentReadonly(string filepath)
{
    // Open a SpreadsheetDocument based on a filepath.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
    {
        // 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.
    }
}
Public Shared Sub OpenSpreadsheetDocumentReadonly(ByVal filepath As String)
    ' Open a SpreadsheetDocument based on a filepath.
    Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(filepath, False)
        ' Attempt to add a new WorksheetPart.
        ' The call to AddNewPart generates an exception because the file is read-only.
        Dim newWorksheetPart As WorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()

        ' The rest of the code will not be called.
    End Using
End Sub

Пример кода

В следующем примере кода выполняется открытие электронной таблицы в режиме только для чтения. В коде вызывается метод OpenSpreadsheetDocumentReadonl, открывающий файл "Sheet10.xlsx".

OpenSpreadsheetDocumentReadonly(@"C:\Users\Public\Documents\Sheet10.xlsx");
OpenSpreadsheetDocumentReadonly("C:\Users\Public\Documents\Sheet10.xlsx")

Ниже приведен полный пример кода на языках C# и Visual Basic.

public static void OpenSpreadsheetDocumentReadonly(string filepath)
{
    // Open a SpreadsheetDocument based on a filepath.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
    {
        // 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.
    }
}
Public Sub OpenSpreadsheetDocumentReadonly(ByVal filepath As String)
    ' Open a SpreadsheetDocument based on a filepath.
    Using spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Open(filepath, False)
        ' Attempt to add a new WorksheetPart.
        ' The call to AddNewPart generates an exception because the file is read-only.
        Dim newWorksheetPart As WorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()

        ' The rest of the code will not be called.
    End Using
End Sub

См. также

Ссылка

Class Library Reference