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

马特·菲茨莫里斯(Matt Fitzmaurice)

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

能做到吗

托马斯·巴内科

对于Open XML SDK,这确实是不可能的,因为它仅提供WordprocessingDocument(用于.docx等),SpreadsheetDocument(用于.xlsx等)和PresentationDocument(用于.pptx等)类来打开Word,Excel和PowerPoint文档和模板。

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

下图显示了ChartTemplate.crtx我为测试目的而创建的样本的结构我使用了适用于Modern Visual StudioOpen XML软件包编辑器来检查该软件包。

Excel图表模板的包装结构

使用System.IO.Packaging类,Package该类表示整个包(例如ChartTemplate.crtx)。PackagePart类表示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);
}

我已经创建了一个辅助类C,以提供所需的XML命名空间和名称与使用XElement类,其中,像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存储库中找到。查找ChartTemplateTests类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何指定不使用Open XML SDK包装Word TableCell?

来自分类Dev

使用Open Xml将列添加到现有Excel 2007工作簿中

来自分类Dev

使用TSQL从XML读取

来自分类Dev

使用Open XML SDK 2.0获取占位符值

来自分类Dev

为什么无法使用XML SDK 2.0 C#读取2013年之前的Excel文件版本

来自分类Dev

使用XmlDocument读取XML

来自分类Dev

使用SAXParser读取XML

来自分类Dev

使用PIG读取XML

来自分类Dev

使用Golang读取XML

来自分类Dev

使用F#和Open XML SDK读取Excel文件中的单元格内容

来自分类Dev

无法使用Open XML SDK创建文档

来自分类Dev

如何使用Open XML SDK在.xlsx文件的现有行中添加新单元格?

来自分类Dev

使用SelectSingleNode读取XML

来自分类Dev

使用Boost读取xml

来自分类Dev

如何使用Open XML SDK将文本插入内容控件

来自分类Dev

在UWP中使用OPEN-XML SDK生成Doc文件

来自分类Dev

创建单词模板,并使用Open XML用代码替换内容控制文本

来自分类Dev

使用xmldocument读取xml

来自分类Dev

使用XStream读取XML

来自分类Dev

使用Open XML和C#读取Word书签

来自分类Dev

OPEN XML SDK无限循环

来自分类Dev

使用XmlReader读取xml

来自分类Dev

使用LINQ从XML读取

来自分类Dev

使用Open Xml为Excel 2013创建xlsx文件

来自分类Dev

使用Open XML SDK检索内容控件时出现问题

来自分类Dev

使用Open XML更改Excel文件的工作表标签颜色

来自分类Dev

使用PIG读取XML

来自分类Dev

使用Boost读取xml

来自分类Dev

如何使用 Open XML SDK 在 PPTx 中插入视频?