C# 使用openxml删除x命名空间

C# 使用openxml删除x命名空间,c#,excel,xml,openxml-sdk,C#,Excel,Xml,Openxml Sdk,我发现了这个问题,我得到了一些相同的问题 生成OpenXML Excel工作表时遇到问题。特别是样式表部分 当样式表以某种方式获得时间线样式(仅限Excel 2013)时,它就能够生成Excel文件。然后,样式表包含正确的名称空间(xmlns:x=“…”)。这样就可以在Excel 2010中打开它。但是,当使用Excel 2010保存生成的Excel文件时,x名称空间将成为默认名称空间,并从所有元素中删除,时间轴扩展元素除外。在excel中重新打开文件时,这将导致错误。在OpenXml生产力工

我发现了这个问题,我得到了一些相同的问题

生成OpenXML Excel工作表时遇到问题。特别是样式表部分

当样式表以某种方式获得时间线样式(仅限Excel 2013)时,它就能够生成Excel文件。然后,样式表包含正确的名称空间(
xmlns:x=“…”
)。这样就可以在Excel 2010中打开它。但是,当使用Excel 2010保存生成的Excel文件时,x名称空间将成为默认名称空间,并从所有元素中删除,时间轴扩展元素除外。在excel中重新打开文件时,这将导致错误。在OpenXml生产力工具中打开同一文件时,会出现一个错误,即x是未知名称空间

下面是一些xml结果代码

生成excel文件(stylesheet.xml)后的第一步:


在Excel 2010中保存后

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac">
  <fonts count="3" x14ac:knownFonts="1">
    <font>
      <sz val="11"/>
      <color theme="1"/>
      <name val="Calibri"/>
      <family val="2"/>
      <scheme val="minor"/>
    </font>
    <!-- more fonts -->
  <fills count="7">
    <fill>
      <patternFill patternType="none"/>
    </fill>
    <!-- more fills -->
  </fills>
  <borders count="1">
    <border>
      <left/>
      <right/>
      <top/>
      <bottom/>
      <diagonal/>
    </border>
  </borders>
  <cellStyleXfs count="1">
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
  </cellStyleXfs>
  <cellXfs count="18">
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
    <xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" pivotButton="1"/>
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyAlignment="1">
      <alignment horizontal="left"/>
    </xf>
    <!-- more cells -->
  </cellXfs>
  <cellStyles count="1">
    <cellStyle name="Standaard" xfId="0" builtinId="0"/>
  </cellStyles>
  <dxfs count="1">
    <dxf>
      <numFmt numFmtId="164" formatCode="m/d/yyyy"/>
    </dxf>
  </dxfs>
  <tableStyles count="0" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleLight16"/>
  <extLst>
    <ext uri="{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main">
      <x14:slicerStyles defaultSlicerStyle="SlicerStyleLight1"/>
    </ext>
    <x:ext uri="{9260A510-F301-46a8-8635-F512D64BE5F5}" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main">
      <x15:timelineStyles defaultTimelineStyle="TimeSlicerStyleLight1"/>
    </x:ext>
  </extLst>
</styleSheet>


如你所见。
我知道这是一个老问题,但为了防止其他人也有同样的问题,我所做的就是删除冲突的部分。虽然不是最佳解决方案,但它允许用户在Excel 2010中打开文件,用另一个名称重新保存,然后重新打开刚刚创建的文件,而不会出现问题

要删除我使用此代码的部分,请执行以下操作:

        if (Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Descendants<StylesheetExtensionList>().Any())
        {
            Document.WorkbookPart.WorkbookStylesPart.Stylesheet.RemoveAllChildren<StylesheetExtensionList>();
        }
if(Document.WorkbookPart.WorkbookStylesPart.Stylesheet.subjections().Any())
{
Document.WorkbookPart.WorkbookStylesPart.Stylesheet.RemoveAllChildren();
}
我没有使用
Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Save()
,因为我在另一个地方保存了更改,但您可能需要保存它,这取决于您的需要

我选择删除所有子项,但可能您只能删除导致问题的子项


希望这对你有帮助;)

非常感谢您抽出时间提供答案。我被困在这个问题上。删除有问题的部分是我计划尝试的可能修复方法之一。我很好奇:您是否尝试将SpreadsheetML名称空间从“x”前缀改为默认名称空间?它会更加劳动密集(将所有元素的前缀更改为nil),但我不知道它是否也会起作用。@ZachBlocker我没有尝试移动前缀,因为我和你一样,它似乎更耗时,所以我选择了我发布的更“可读”的代码,但它也应该起作用。
        if (Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Descendants<StylesheetExtensionList>().Any())
        {
            Document.WorkbookPart.WorkbookStylesPart.Stylesheet.RemoveAllChildren<StylesheetExtensionList>();
        }