【发布时间】: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