将json导出为ex​​cel

时间:2013-08-08 11:42:07

标签: jquery ruby-on-rails json export-to-excel

上下文: 我有一个搜索页面,它从一个数据库表中检索数据,并使用一堆jquery插件和一些编写的代码将其显示为数据透视表。

我想做什么:将两个来源导出为ex​​cel,将原始数据和处理后的数据导出为。

部分代码

$('#btn-apply').click(function() {
  params = buildParams(); //-> json object structure

    $.ajax({
        url: '<%= pivot_apply_path%>',
        type: "GET",
        dataType: "html",
        data: params,
        success: function(result) {
            json.source = $.parseJSON(result); //-> original json response and data from acctiverecord
            json.pivot = pivot(json.source.data, params.rows, params.columns, {}); //-> treated data to another json
            html = tableGeneration(json.pivot); //-> generate a table from the treated json and show it
        }
    });
});

这一切都很有效,但现在挑战

  1. 单击按钮,发送源json,并使用此数据检索并擅长
  2. 单击按钮,发送数据透视json,并使用此数据检索并擅长
  3. 我做了什么:

    1. 将源json传递给控制器​​并像这样收到
    2.   

      def export_table

      @records = params
      
      respond_to do |format|
          format.xls
      end
      
           

      我已经有了一个视图export_source.xls.erb,这是我以前用来导出xls的技术,所有的格式都可以。问题是对json调用的响应......

      $('.export-table').click(function(e) {
              $.ajax({
                  url: '<%= pivot_export_table_path%>',
                  type: "POST",
                  dataType: "xls",
                  data: { data: json.pivot },
                  success: function(result) {
                      //<-  
                  },
                  error: function (request, status, error) {
                      showMessage('error', error); //<- ENDS UP HERE  
                  }
              });
      });
      

      由于这不是回发链接所以它不回发我的xls,更糟糕的是,它甚至没有输入我的ajax成功,它直接导致错误,描述为No conversion from text to xls

      建议?

3 个答案:

答案 0 :(得分:1)

JQuery不支持'xls'作为数据类型。我认为你可以用'text'替换'xls',它会正常工作,jquery不需要理解xls格式。

经过一些阅读后,似乎唯一的方法是在点击处理程序中动态创建表单,然后提交它。您需要对数据进行json编码,然后在隐藏字段中提交。这样的事情应该有效

$('.export-table').click(function(e) {
  var form_el = $('<form action="<%= pivot_export_table_path%>" method="POST"></form>');
  $('body').append(form_el);
  form_el.append($('<%= token_tag %>');  //if you are using CSRF protection

  var obj = {thing: "sdfjk", things: [1,4,6,6]};

  var input_el = $('<input type="hidden" name="json_data"></input>');
  form_el.append(input_el);
  input_el.val(JSON.stringify(obj));

  form_el.submit();

});

然后在您的控制器中,您需要使用

@records = JSON.parse(params[:json_data])

答案 1 :(得分:0)

与slicepan的讨论让我想到了一个解决方案:

  1. 在我的视图中创建一个隐藏输入文本的表单
  2. 在简单的帖子(没有ajax)中提交我的表格
  3. 点击按钮(发布前),将json字符串化为输入
  4. ActiveSupport::JSON.decode(value)侧的控制器上读取它,并一如既往地呈现format.xls
  5. 刚试过它,并且工作正常,可怜这个解决方案并不那么漂亮......我仍然可以让这个开放给有人提出更好的解决方案。

    正确!

答案 2 :(得分:-1)

您可以使用可用的JSON到EXCEL转换器here