Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XDocument生成XML Excel文档_C#_Xml_Excel_Xelement - Fatal编程技术网

C# 使用XDocument生成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 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: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")
        )
    );