尝试使用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
答案 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的部分内部 文档。