2013-10-03 1 views
4

Я нашел этот вопрос, и у меня был тот же вопрос.Удалите пространство имен x, используя openxml

XLSX- how to get rid of the default namespace prefix x:?

У меня проблема при создании еепа OpenXML Excel таблицы. Специально часть таблицы стилей. Когда таблица стилей каким-то образом получила стиль для временной шкалы (excel 2013), она может генерировать excel-файл. Затем таблица стилей содержит правое пространство имен (xmlns: x = "..."). Это позволяет открыть его в Excel 2010. Но при сохранении сгенерированного excel-файла с Excel 2010 пространство имен x становится пространством имен по умолчанию, а удаляется из всех элементов, кроме элемента расширения временной шкалы. При повторном открытии файла в excel это приведет к ошибке. При открытии того же файла в OpenXml Productivity Tool появляется ошибка, когда x является неизвестным пространством имен.

Итак, вот какой код результата xml. Fisrt после создания файла 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: в таблице стилей вообще. Но я не смог найти способ сообщить об этом openKML SDK.

ответ

3

Я знаю, что это старый вопрос, но на всякий случай у кого-то другая проблема, я сделал это, чтобы удалить конфликтующие разделы. Хотя это не оптимальное решение, оно позволяет пользователю открывать файл в Excel 2010, повторно сохранять его с другим именем, а затем повторно открывать только что созданный файл без проблем.

Чтобы удалить разделы, которые я использовал этот код:

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

Я din't использовать Document.WorkbookPart.WorkbookStylesPart.Stylesheet.Save(), так как я сохранил изменения в другом месте, но вам может понадобиться, чтобы сохранить его, это зависит от ваших потребностей.

Я решил удалить всех детей, но, возможно, вы можете удалить только тот, который вызывает проблему.

Надеюсь, что это вам поможет;)

+0

Спасибо, что нашли время, чтобы дать ответ. Я застрял в этой конкретной проблеме. Удаление раздела о нарушении было одним из возможных исправлений, которые я планировал попробовать. Мне любопытно: вы пытались переместить пространство имен SpreadsheetML из префикса «x», чтобы вместо этого было пространство имен по умолчанию? Это было бы более трудоемким (сменив префикс всех элементов на nil), но мне интересно, будет ли он работать. –

+0

@ZachBlocker Я не пытался переместить префикс, потому что я считаю то же самое, что и вы, кажется, больше времени, поэтому я выбрал более «читаемый» код, который я разместил, но он тоже должен работать. – emmanuel