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