【问题标题】:Excel 2007: XML: choking on missing ss: namespace qualifierExcel 2007:XML:因缺少 ss:命名空间限定符而窒息
【发布时间】:2011-07-27 08:19:29
【问题描述】:

尝试使用 C# 和 System.XML.Serialization 创建 Excel 2007 XML 文件。 Excel XML 文件的根元素是这样的:

<Workbook xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="urn:schemas-microsoft-com:office:spreadsheet">

默认命名空间中的许多元素都有用“ss”限定的属性,这是不必要的,因为“ss”和默认命名空间都是“urn:schemas-microsoft-com:office:spreadsheet”。

例如 Style 元素,显示为:

   <Style ss:ID="s21">
      <Font x:Family="Swiss" ss:Bold="1"/>
   </Style>

当我创建我的 XmlSerializerNamespaces 时,我添加了 Excel 需要的所有命名空间:

var ns = new XmlSerializerNamespaces();
ns.Add("", "urn:schemas-microsoft-com:office:spreadsheet");
ns.Add("o", "urn:schemas-microsoft-com:office:office");
ns.Add("x", "urn:schemas-microsoft-com:office:excel");
ns.Add("ss", "urn:schemas-microsoft-com:office:spreadsheet");
ns.Add("html", "http://www.w3.org/TR/REC-html40");

在生成的 XML 中,省略了 ""(默认)命名空间,因为它与 'ss' 相同。

我的样式对象大致如下: [XmlRoot(Namespace = "urn:schemas-microsoft-com:office:spreadsheet")] 公共类样式 { [Xml属性] 公共字符串 ID { 获取;放; }

    [XmlAttribute]
    public string Name { get; set; }

    [XmlElement]
    public string Font { get; set; }
}

当我实际生成我得到的 XML 时:

<ss:Style ID="s21">
          <ss:Font x:Family="Swiss" Bold="1"/>
</ss:Style>

我认为这在技术上没有任何问题。 Excel 不介意元素上的 ss: 限定符,但它令人窒息,因为它不能使用 Style 的 'ID' 属性。必须硬编码才能查找文字字符串 'ss:ID'?

如果我从命名空间中省略“ss”,它会生成更清晰的 XML,但不会让我的错误消失。我也尝试过省略“ss”命名空间,然后将 Style 对象的命名空间设置为字面意义上的“ss”,但它会生成一些名为“d4p1”的临时命名空间并造成混乱。

关于如何让 Excel 读取有效 XML 的任何想法?

对于加分,我怎样才能使我的 XML 文件的开头看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>

显然第一部分带有一个 XML 编写器,但是有没有什么非骇人听闻的方法来获得第二行?

谢谢, ~S

【问题讨论】:

    标签: c# xml excel xml-namespaces


    【解决方案1】:

    您是否考虑过使用Open XML SDK 2.0 for Microsoft Office,而不是自己编写xml?除了帮助处理 Open XML 文档之外,它还包含相当多的文档,并且似乎非常适合您的任务:

    适用于 Microsoft Office 的 Open XML SDK 2.0 构建在 System.IO.Packaging API 并提供 强类型零件类 操作 Open XML 文档。开发工具包 还使用 .NET 框架 语言集成查询 (LINQ) 技术提供强类型 对象访问 XML 内容 在 Open XML 的部分内部 文件。

    【讨论】:

    • 我对协同工作的 MS 技术以及它们现在识别 XML 的能力没有多少信心,但无论如何我都会尝试一下。感谢您的建议。
    • 这行得通,但是 SDK 级别很低,而且不如我写的包方便。
    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多