如何:打开电子表格文档以进行只读访问

上次修改时间: 2010年10月14日

适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

本文内容
何时打开文档以进行只读访问
获取 SpreadsheetDocument 对象
基本文档结构
尝试生成用于添加工作表的 SpreadsheetML 标记
示例代码

本主题介绍如何使用 Open XML SDK 2.0 for 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 类的一个实例并用部件填充该实例。该文档至少必须具有一个充当文档容器的工作簿部件和至少一个工作表部件。在此包中,将使用 SpreadsheetML 标记将文本表示为 XML 形式。

若要从文档中创建类实例,请调用 Open() 重载方法之一。提供了多个 Open 方法,每个方法具有不同的签名。下表中列出了允许您指定文档是否可编辑的方法。

Open 方法

类库参考主题

说明

Open(String, Boolean)

Open(String, Boolean)

从指定的文件创建 SpreadsheetDocument 类的实例。

Open(Stream, Boolean)

Open(Stream, Boolean)

从指定的 IO 流创建 SpreadsheetDocument 类的实例。

Open(String, Boolean, OpenSettings)

Open(String, Boolean, OpenSettings)

从指定的文件创建 SpreadsheetDocument 类的实例。

Open(Stream, Boolean, OpenSettings)

Open(Stream, Boolean, OpenSettings)

从指定的 I/O 流创建 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 应用程序,并且您希望使用 Open XML SDK 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)

假设您具有的应用程序使用 .NET Framework 类库的 System.IO.Packaging 命名空间中的 Open XML 支持,并且您希望使用 Open XML SDK 2.0 以只读方式处理包。然而 Open XML SDK 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 文档的基本文档结构由引用Workbook中的工作表的 SheetsSheet 元素组成。将为每张 Worksheet 创建单独的 XML 文件。例如,具有 MySheet1 和 MySheet2 这两张工作表的工作簿的 SpreadsheetML 位于 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 元素。例如,工作簿中只在单元格 A1 中具有值 100 的第一张工作表的 SpreadsheetML 位于 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>

通过使用 Open XML SDK 2.0,可以使用与 SpreadsheetML 元素对应的强类型类创建文档结构和内容。可以在 DocumentFormat.OpenXML.Spreadsheet 命名空间中找到这些类。下表列出了 workbook、sheets、sheet、worksheet 和 sheetData 元素所对应类的类名称。

SpreadsheetML 元素

Open XML SDK 2.0 类

说明

workbook

DocumentFormat.OpenXml.Spreadsheet.Workbook

主文档部件的根元素。

sheets

DocumentFormat.OpenXml.Spreadsheet.Sheets

块级结构(如工作表、文件版本和 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