0

我正在尝试构建一个包含将在 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,它不再工作了。基本上是这样的:"xmlns" => "urn:schemas-microsoft-com:office:excel"WorksheetOptions标签中获取被忽略并且不添加到文档中。这是实际结果:

<?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

4

1 回答 1

0

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

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

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

于 2013-09-13T11:14:53.493 回答