使用 Open XML SDK 读取 Excel 图表模板 (*.crtx)

Use Open XML SDK to read an Excel Chart Template (*.crtx)

我正在尝试读取 Excel 图表模板 (mychart.crtx) 中使用的颜色。但我不知道如何使用 Open XML 工具包打开文件。似乎无法使用 SDK 工具。

能做到吗?

Open XML SDK确实做不到这一点,因为它只提供了WordprocessingDocument(for .docx等),SpreadsheetDocument(for .xlsx 等)和 PresentationDocument(对于 .pptx 等)class 用于打开 Word、Excel 和 PowerPoint 文档和模板。

但是,Office 文档和您的 Excel 图表模板 (.crtx) 都基于开放打包约定 (OPC)。您可以使用 System.IO.Packaging 命名空间中提供的 classes 来处理任何基于 OPC 的文档,包括那些 Excel 图表模板。

下图显示了我为测试目的创建的示例 ChartTemplate.crtx 的结构。我用 Open XML Package Editor for Modern Visual Studios 检查那个包。

使用 System.IO.Packaging classes,Package class 表示整个包(例如,ChartTemplate.crtx)。 PackagePart class 表示 XML 和包中包含的其他文件。每个 PackagePart 都有一个 URI(例如,/chart/chart.xml/chart/charts/colors1.xml)、一个内容类型以及与其他部分的零个或多个关系。

以下代码片段打开示例 Package,获取 PackagePart,从该部分加载根 XML 元素并进行某些断言以演示其获取的内容。

[Fact]
public void LoadRootElement_Chart_SuccessfullyLoaded()
{
    using Package package = Package.Open("Resources\ChartTemplate.crtx", FileMode.Open, FileAccess.Read);
    PackagePart packagePart = package.GetPart(new Uri("/chart/chart.xml", UriKind.Relative));

    XElement rootElement = LoadRootElement(packagePart);

    Assert.Equal(C.chartSpace, rootElement.Name);
    Assert.NotEmpty(rootElement.Elements(C.chart).Elements(C.title));
    Assert.NotEmpty(rootElement.Elements(C.chart).Elements(C.plotArea));
    Assert.NotEmpty(rootElement.Elements(C.chart).Elements(C.legend));
}

LoadRootElement()方法很简单:

private static XElement LoadRootElement(PackagePart packagePart)
{
    using Stream stream = packagePart.GetStream(FileMode.Open, FileAccess.Read);
    return XElement.Load(stream);
}

并且我创建了一个帮助程序 class C 来提供所需的 XML 名称空间和名称以用于 XElement class,它,如 XNamespaceXName,是在 System.Xml.Linq 命名空间中定义的。

private static class C
{
    public static readonly XNamespace c = "http://schemas.openxmlformats.org/drawingml/2006/chart";

    public static readonly XName chart = c + "chart";
    public static readonly XName chartSpace = c + "chartSpace";
    public static readonly XName lang = c + "lang";
    public static readonly XName legend = c + "legend";
    public static readonly XName plotArea = c + "plotArea";
    public static readonly XName title = c + "title";

    public static readonly XName val = "val";
}

一如既往,完整的源代码可以在我的 CodeSnippets GitHub repository. Look for the ChartTemplateTests class.

中找到