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


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

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


Возможные условия для открытия документа только для чтения

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


Объект SpreadsheetDocument

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

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

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

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

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

Элемент SpreadsheetML Класс пакета SDK Open XML Описание
<workbook/> Workbook Корневой элемент основной части документа.
<sheets/> Sheets Контейнер для структур уровня блока, таких как лист, fileVersion и другие, указанные в спецификации ISO/IEC 29500 .
<sheet/> Sheet Лист, указывающий на файл определения листа.
<worksheet/> Worksheet Файл определения лист с данными листа.
<sheetData/> SheetData Таблица ячеек, сгруппированных по строкам.
<row/> Row Строка в таблице ячеек.
<c/> Cell Ячейка в строке.
<v/> CellValue Значение ячейки.

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

В пакете SDK SpreadsheetDocument Open XML класс представляет пакет документов 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 метод в таблице, приведенной выше в этом разделе, с сигнатурой, требующей двух параметров. Первый параметр принимает строку, представляющую полный путь к нужному файлу. Второй параметр — или truefalse. В этом примере используется false и указано, что файл нужно открыть только для чтения.

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

// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))

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

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

// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))

Предположим, что у вас есть приложение, использующее поддержку Open XML в пространстве имен System.IO.Packaging библиотеки классов платформа .NET Framework, и вы хотите использовать пакет SDK Open XML для работы с пакетом только для чтения. В то время как пакет SDK Open XML включает перегрузки методов, которые принимают 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))

Пример кода

Далее представлен полный пример кода на языках C# и 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.
        }
    }
}

См. также