C# 使用XDocument生成XML Excel文档
我正在尝试生成这样的XML Excel文档C# 使用XDocument生成XML Excel文档,c#,xml,excel,xelement,C#,Xml,Excel,Xelement,我正在尝试生成这样的XML Excel文档 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID="Default" /></Style>
</Styles>
<Worksheet ss:Name="Worksheet Name">
<Table>
<Row ss:AutoFitHeight="0">
<Cell>
<Data ss:Type="String">Test</Data>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
有什么建议吗?您的问题很可能是您不了解默认名称空间是从父元素继承的。以XML为例:
<parent xmlns="http://namespace.com/uri">
<child />
</parent>
另一方面,我还要指出,LINQtoXML支持的声明性方法比您目前采用的方法多得多。可以通过构造函数传递元素的所有内容。所以你可以重写你的风格:
var styles = new XElement(ss + "Styles",
new XElement(ss + "Style",
new XAttribute("ID", "Default")
)
);
请参阅以这种样式修复并重新编写的示例。目前我最好的解决方法是在添加工作簿元素而不是添加xmlns名称空间时省略名称空间。将文档转换为字符串后,我手动将xmlns名称空间添加到工作簿元素。这是一个复制品,建议的解决方案是使用开放式XML。不过,这不是我的首选解决方案……我知道名称空间是继承的,这就是以xmlns=”“结尾的原因。在名称空间前面加上前缀只解决了我一半的问题。现在,我的命名空间无处不在。我甚至不希望它出现在工作簿元素上。因此,你的解决方案对我不起作用。我不太喜欢声明式方法,这就是为什么我不使用它;-)这个代码示例是从一个更大的类中的代码片段组合而成的。如果您引用的是前缀,那么由于LINQ to XML在编写XML时的工作方式,您无法删除这些前缀。例如,请参阅-简单地解析和编写“必需”XML将为该名称空间中的所有元素添加
ss
前缀。但是,请确保这两个名称空间在语义上是相同的。如果重新排序将默认名称空间放在重复的ss
前缀之后,则元素的LINQ到XML名称空间查找将首先到达该名称空间并使用该名称空间(请参阅)。如果你喜欢它的外观,那会让你更接近它。我只能强调,这3个重复在语义上是相同的。我真的不在乎它看起来如何-我在乎Excel是否接受XML:-)Excel接受你的第二次尝试的结果。我想我会使用这个方法,或者只是手动将xmlsns插入到根目录中。我还没决定,但是谢谢你的帮助。
<parent xmlns="http://namespace.com/uri">
<child />
</parent>
var styles = new XElement(ss + "Styles");
var styles = new XElement(ss + "Styles",
new XElement(ss + "Style",
new XAttribute("ID", "Default")
)
);