Nokogiri Builder 将省略 xmlns 属性(如果已使用)



我正在尝试构建一个包含将在 excel 中打开的样式的 xml 电子表格。

这是我的代码:

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,它不再工作了。基本上是这样的:WorksheetOptions标签中的"xmlns" => "urn:schemas-microsoft-com:office:excel"将被忽略,并且不会添加到文档中。以下是实际结果:

<?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 将无法正确设置页面。这是Nokogiri的正确行为吗?

如果是,是否有其他方法可以使 excel 将正确的页面布局应用于文档?

这种情况发生在我未包含在示例中的另一个标签上,否则它会太长。这是另一个:xml.DocumentProperties("xmlns" => "urn:schemas-microsoft-com:office:office") do .

我不确定构建器接口,但您始终可以通过使用带有 nil 命名空间的 add_namespace 将其直接添加到节点:

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

有关详细信息,请参阅 Node#add_namespace 上的文档。

相关内容

  • 没有找到相关文章

最新更新