Excel 2007:XML:在缺lessss:namespace限定符时窒息

尝试使用C#和System.XML.Serialization创buildExcel 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> 

当我创build我的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”)] public class Styles {[XmlAttribute] public string 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”属性。 必须硬编码才能查找string“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

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

用于Microsoft Office的Open XML SDK 2.0构build在System.IO.Packaging API之上,并提供强types的部件类来操作Open XML文档。 SDK还使用.NET框架语言集成查询(LINQ)技术为Open XML文档的部分内部的XML内容提供强types对象访问。