c# - Excel 2007 : XML: choking on missing ss: namespace qualifier

标签 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] 公共(public)字符串 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: 限定符,但它会窒息,因为它不能使用样式的“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 编写器,但是有没有任何非 hackish 的方法来获取第二行?

谢谢, ~S

最佳答案

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

The Open XML SDK 2.0 for Microsoft Office is built on top of the System.IO.Packaging API and provides strongly typed part classes to manipulate Open XML documents. The SDK also uses the .NET Framework Language-Integrated Query (LINQ) technology to provide strongly typed object access to the XML content inside the parts of Open XML documents.

关于c# - Excel 2007 : XML: choking on missing ss: namespace qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507914/

相关文章:

python - 使用 ElementTree 解析 XML

java - 将 XML 转换为 JSON 忽略属性

Excel如何提取不在第二列中的不同值

c# - 在 xml 文件中查找值的最有效方法?

c# - 这是已知的线程安全同步/锁定模式吗?

xml - 元素类型 "xs:element"后面必须跟有属性规范 ">"或 "/>"

vba - 在保留自动筛选设置的同时清除单元格?

c# - 使用 VSTO 在 Excel 中创建命名范围的事件

c# - 在不使用 XAML 的情况下创建 Windows 应用商店应用程序页面

c# - 是否可以在 Java 项目中使用 .Net GUI?