2013-09-13 3 views
0

Я пытаюсь создать таблицу xml, которая содержит стили, которые будут открываться в excel.Nokogiri Builder опустит атрибут xmlns, если он уже используется

Это мой код:

res = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| 
    xml.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:html' => "http://www.w3.org/TR/REC-html40", 
       'xmlns:ss' => "urn:schemas-microsoft-com:office:spreadsheet" do 

    xml.WorksheetOptions "xmlns" => "urn:schemas-microsoft-com:office:excel" do 
     xml.PageSetup do 
     xml.Layout "x:Orientation" => "Landscape" 
     xml.Header "x:Data" => "&LLeft side&CCenter&R&D &T" 
     xml.Footer "x:Data" => "&CPage: &P/&N" 
     end 

     xml.Unsynced 
     xml.FitToPage 

     xml.Print do 
     xml.FitHeight 20 
     xml.ValidPrinterInfo 
     xml.Scale 90 
     xml.HorizontalResolution -4 
     xml.VerticalResolution -4 
     end 

     xml.Zoom 125 
     xml.PageLayoutZoom 0 
     xml.Selected 
     xml.Panes do 
     xml.Pane do 
      xml.Number 3 
      xml.ActiveRow 8 
      xml.ActiveCol 4 
     end 
     end 
     xml.ProtectObjects "False" 
     xml.ProtectScenarios "False" 

     xml.AllowFormatCells 
     xml.AllowSizeCols 
     xml.AllowSizeRows 
     xml.AllowSort 
     xml.AllowFilter 
     xml.AllowUsePivotTables 
    end 
    end 
end.to_xml 
puts res 

Я имел это в качестве рабочего шаблона в течение многих лет (я использовал построитель bunlder перед которой в настоящее время является просто слишком медленно) и теперь, когда я перешел на Nokogiri он больше не работает , В основном это: "xmlns" => "urn:schemas-microsoft-com:office:excel" в теге WorksheetOptions get проигнорирован и не добавлен в документ. Вот реальный результат:

<?xml version="1.0" encoding="UTF-8"?> 
<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:html="http://www.w3.org/TR/REC-html40" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
    <WorksheetOptions> 
    <PageSetup> 
     <Layout x:Orientation="Landscape"/> 
     <Header x:Data="&amp;LLeft side&amp;CCenter&amp;R&amp;D &amp;T"/> 
     <Footer x:Data="&amp;CPage: &amp;P/&amp;N"/> 
    </PageSetup> 
    <Unsynced/> 
    <FitToPage/> 
    <Print> 
     <FitHeight>20</FitHeight> 
     <ValidPrinterInfo/> 
     <Scale>90</Scale> 
     <HorizontalResolution>-4</HorizontalResolution> 
     <VerticalResolution>-4</VerticalResolution> 
    </Print> 
    <Zoom>125</Zoom> 
    <PageLayoutZoom>0</PageLayoutZoom> 
    <Selected/> 
    <Panes> 
     <Pane> 
     <Number>3</Number> 
     <ActiveRow>8</ActiveRow> 
     <ActiveCol>4</ActiveCol> 
     </Pane> 
    </Panes> 
    <ProtectObjects>False</ProtectObjects> 
    <ProtectScenarios>False</ProtectScenarios> 
    <AllowFormatCells/> 
    <AllowSizeCols/> 
    <AllowSizeRows/> 
    <AllowSort/> 
    <AllowFilter/> 
    <AllowUsePivotTables/> 
    </WorksheetOptions> 
</Workbook> 

Если я что-нибудь еще в качестве атрибута xmlns на этой линии xml.WorksheetOptions "xmlns" => "urn:schemas-microsoft-com:office:excel" do писать он будет работать и получить правильно добавлены в документ.

Это неправильно, очевидно, Excel не будет правильно задавать страницу, если этот атрибут отсутствует. Это правильное поведение для Нокогири?

Если это так, есть ли другой способ сделать Excel подходящим правилом страницы для документа?

Это происходит с другим тегом, который я не включил в пример, иначе он был бы слишком длинным. Это другой: xml.DocumentProperties("xmlns" => "urn:schemas-microsoft-com:office:office") do.

ответ

0

Я не уверен насчет интерфейса строителя, но вы всегда можете добавить его непосредственно к узлу с помощью add_namespace с nil именами:

node.add_namespace(nil, "urn:schemas-microsoft-com:office:excel") 

Смотрите документацию по Node#add_namespace для деталей.

Смежные вопросы