Excel 2007:XML:阻塞缺少的ss:namespace限定符

时间:2011-04-01 00:18:16

标签: c# xml excel xml-namespaces

尝试使用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”)]     公共课风格     {         [XmlAttribute]         公共字符串ID {get;组; }

    [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'属性而窒息。必须硬编码才能查找文字字符串的ID:ID'?

如果我从命名空间中省略'ss',它会生成更干净的XML,但不会让我的错误消失。我也尝试省略'ss'命名空间,然后将Style对象的命名空间设置为字面上的'ss',但是它会生成一个名为'd4p1'的临时命名空间并使其变得非常混乱。

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

对于奖励标记,我如何使我的XML文件的开头看起来像这样:

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

显然,第一部分附带了一个XML编写器,但有没有非黑客的方法来获得第二行?

谢谢, 382 4

1 个答案:

答案 0 :(得分:0)

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

  

用于Microsoft Office的Open XML SDK 2.0构建于   System.IO.Packaging API并提供   强类型的零件类   操纵Open XML文档。 SDK   也使用.NET Framework   语言集成查询(LINQ)   技术提供强类型   对象访问XML内容   在Open XML的部分内部   文档。