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对象访问。