Я делаю экспорт в Excel с помощью своего приложения Ruby on Ralis. Я не использовал какой-либо драгоценный камень или плагин (поскольку наши требования были чем-то другим, мы не могли их использовать). Мы использовали встроенную поддержку «format.xls», которая поставляется с Ruby on Rails.

Проблема в том, что когда мы получаем наш Excel, Save as Type появляется на веб-странице. Я хочу изменить это на Microsoft Office Excel Workbook (*xls). Как это сделать?

Ниже мой controller action code и respective view, с помощью которых мы получаем excel.

Методы Get_excel в контроллере

def get_excel
    format.xls do
        headers['Content-Type'] = "application/vnd.ms-excel"
        headers["Content-disposition"] = 'inline;  filename="myexcel.xls"'
        headers['Cache-Control'] = ''
    end
end

ПРОСМОТР (get_excel.xls.erb)

<html xmlns:o="urn:schemas-microsoft-com:office:office
      xmlns:x="urn:schemas-microsoft-com:office:excel"
      xmlns="http://www.w3.org/TR/REC-html40"
      xmlns:ss = "urn:schemas-microsoft-com:office:spreadsheet" />
<head>
  <meta http-equiv=Content-Type content="text/html; charset=UTF-8"/>
  <meta name=ProgId content=Excel.Sheet/>
  <meta name=Generator content="Microsoft Excel 11"/>
  <style type="text/css">
    @page {
      mso-header-data : '&R CONFIDENTIAL';
      margin: 0.75in 0.20in 0.5in 0.20in;
      mso-header-margin: 0.25in;
      mso-footer-margin:0.25in;
      mso-page-orientation: landscape;
    }
    table{
      page-break-inside: avoid;
    }
    td{
      white-space:nowrap;
    }
  </style>

  <!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets
   <x:ExcelWorksheet>
    <x:Name>Gantt Detail</x:Name>
    <x:WorksheetOptions>  
    <x:DefaultRowHeight>319</x:DefaultRowHeight>  
     <x:Print>
      <x:FitHeight>15</x:FitHeight>
      <x:ValidPrinterInfo/>
      <x:Scale>74</x:Scale>
      <x:HorizontalResolution>600</x:HorizontalResolution>
      <x:VerticalResolution>600</x:VerticalResolution>
     </x:Print>
     <x:Selected/>
     <x:FrozenNoSplit/>
     <x:SplitHorizontal>5</x:SplitHorizontal>
     <x:TopRowBottomPane>5</x:TopRowBottomPane>
     <x:ActivePane>2</x:ActivePane>
          <x:Panes>
            <x:Pane>
            <x:Number>3</x:Number>
            </x:Pane>
            <x:Pane>
            <x:Number>2</x:Number>
            </x:Pane>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>8580</x:WindowHeight>
  <x:WindowWidth>12120</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>45</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
 </x:ExcelWorkbook>
 <x:ExcelName>
  <x:Name>Print_Titles</x:Name>
  <x:SheetIndex>1</x:SheetIndex>
  <x:Formula>='Gantt Detail'!$3:$5</x:Formula>
 </x:ExcelName>
</xml><![endif]-->

</head>
<body>
  <table>
<tr>some code</tr>
<tr>some code</tr>
<tr>some code</tr>
<tr>some code</tr>
<tr>some code</tr>
  </table>
</body>
0
AnkitG 17 Мар 2011 в 09:22

1 ответ

В config/initializers/mime_types.rb

Mime::Type.register "application/vnd.ms-excel", :xls

Тогда вам не нужно устанавливать заголовки непосредственно в методе.

Я не уверен, что это остановит вас от запроса, но именно так я обслуживаю HTML-таблицы как xls, и ни у кого никогда не было проблем с их открытием.

Я также не устанавливаю имя файла, так как имя метода будет называть его (get_excel.xls в вашем случае). Я также не устанавливаю все элементы xml и xmlns. Это просто работает.

0
Unixmonkey 18 Мар 2011 в 01:51
Привет Спасибо за ответ. Я пробовал делать это и раньше, но это не сработало! Я должен установить имя файла, как я написал в коде, и схема xml, которую я использую, фактически предназначена для управления настройками печати моего excel. Что мне делать?
 – 
AnkitG
18 Мар 2011 в 09:20