【问题标题】:Export json to excel导出json到excel
【发布时间】:2013-08-08 11:42:06
【问题描述】:

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

我想做的事:将两个来源导出到 excel,原始数据和处理后的数据。

一些代码

$('#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,然后使用此数据检索和处理数据

我做了什么:

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

定义导出表

@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

建议?

【问题讨论】:

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


    【解决方案1】:

    JQuery 不支持将“xls”作为数据类型。我认为您可以将 'xls' 替换为 'text' 就可以了,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])
    

    【讨论】:

    • 当然,如果我用文本替换 'xls' 或删除它,我会进入成功例程,但仍然无法下载我期望的 excel。 “结果”是要字符串的 excel 内容...
    • 下载excel :)
    • 哦,对了,在这种情况下,您不需要使用 ajax,您只需将链接放入映射到正确控制器操作的 url(如果您不这样做,也将配置设置为附件'不希望浏览器尝试渲染它)
    • 您可以在单击链接时动态更改链接的 href 属性,但我看到您使用的是 POST,所以这不起作用。让我做个实验
    • 你之前是怎么下载xls文件的?
    【解决方案2】:

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

    1. 在我的视图中创建一个隐藏输入文本的表单
    2. 在简单的帖子中提交我的表单(无 ajax)
    3. 点击按钮(在发布之前)将 json 字符串化到输入中
    4. 在带有ActiveSupport::JSON.decode(value) 端的控制器上读取它并像往常一样渲染format.xls

    刚刚测试过,工作正常,可惜这个解决方案不是很漂亮......我仍然会留下这个开放,让别人想出一个更好的解决方案。

    马上!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是一个死链接,由于这种情况,您应该在此处提供答案。
      • 去bitbucket上的用户名kylo_ren,你会找到它。抱歉死链接。
      猜你喜欢
      • 2021-04-12
      • 2015-08-10
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2010-11-05
      • 2011-09-17
      相关资源
      最近更新 更多