5

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

XLSX-如何摆脱默认的命名空间前缀 x:?

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

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

所以这里有一些 xml-result 代码。

生成excel文件(stylesheet.xml)后首先:

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

并在 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>

如你看到的。该<x:ext uri="{9260A510-F301-46a8-8635-F512D64BE5F5}"部分仍然包含 x 命名空间,在该命名空间中它已从其他元素中删除。

有人知道怎么修这个东西吗?我的第一个想法是将 x 命名空间设置为默认命名空间,因此它不再需要x:样式表中的 。但是我无法找到一种方法来告诉 openXML SDK 这样做。

4

1 回答 1

3

I know this is an old question but just in case anyone else has the same issue, what I did is to remove the conflicting sections. Although is not the optimal solution, It allows the user to open the file in Excel 2010, re save it with another name and then re open the file just created without problems.

To remove the sections I used this code:

        if (Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Descendants<StylesheetExtensionList>().Any())
        {
            Document.WorkbookPart.WorkbookStylesPart.Stylesheet.RemoveAllChildren<StylesheetExtensionList>();
        }

I din't use Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Save() since I saved the changes in another place, but you might need to save it, it depends on your needs.

I opted to remove all the children, but maybe you can delete only the one that is causing the issue.

Hope this help you ;)

于 2014-02-05T20:23:49.280 回答