Сгенерируйте excel или html с помощью coldfusion из формата JSON

Мне нужно создать отчет с данными в формате JSON. Вот файл действий, который получает параметры и отображает либо html-таблицу с данными, либо excel. Мне нужна помощь в анализе данных JSON, которые я получаю в требуемом формате (html или excel). Я знаю, как работать с форматированием Excel, мне просто нужна помощь с анализом данных JSON и их выводом.

<cfajaxproxy cfc="components.acct.accttrx">
<script src="../jQuery/js/jquery-1.7.2.min.js"></script>

<cfparam name="prD" default="0_0">
<cfparam name="sM" default="1">
<cfparam name="sY" default="2013">
<cfparam name="status" default="0">
<cfparam name="FORM.fileformat" default="html">

<script type="text/javascript">
  jQuery(document).ready(function(){        
    var myURL = '../components/acct/accttrx.cfc';

  function populateReport(){            
  $.ajax({
  url: myURL + "?method=GetTranactions",
  type: 'POST',
  data: { 
    prID: '<cfoutput>#prD#</cfoutput>',
    mn: '<cfoutput>#sM#</cfoutput>',
    yr: '<cfoutput>#sY#</cfoutput>',
    st: '<cfoutput>#status#</cfoutput>',
    ea_adm:'1',
    slist:'',
    lang: '1'
  },
  dataType: "json",
  success: 
    function(data){
    $.each(data, function(index, item) {
      //(item.description,item.balance,item.accttrx_status);
      // I need help from this point to pass 
      // data to cfml part of my code
      });
    },
  error: 
    function(){
      alert("An error has occurred while fetching records");
    }
});
populateReport();
});
</script>
</HEAD>
<body>
<cfif FORM.fileformat Eq 'excel'>
    <cfset VARIABLES.vcFilename = "thisreport_" & DateFormat(Now(), "yyyymmdd") & "-" &  TimeFormat(Now(), "HHmmss") & ".xls">
    <cfsetting enablecfoutputonly="Yes">
    <cfcontent type="application/vnd.ms-excel">
    <cfheader name="Content-Disposition" value="inline;filename=""#VARIABLES.vcFilename#""">

     <cfoutput>
      <!--- here display data from JSON object --->
     </cfoutput>
  <cfsetting enablecfoutputonly="No">
  <cfelse>
    <div id="reportcontents" />  <!--- display row html --->
</cfif>

Вот данные из ответа:

{"ROWS":[ { "баланс":-642.04000, "описание":"Компания ABC", "ee_name":"Джон, Доу", "plan_id":0, "дебет":25000.22000, "accttrx_year":2013 , "sponsor_id":5, "division_id":0, "accttrx_month":1, "credit":26591.25000, "trx_employee_id":1, "cheque_amt":25000.00000, "cheque_no":"", "accttrx_status":"B ", "accttrx_id":15 }, { "баланс":-642.04000, "описание":"Компания ABC", "ee_name":"Джеймс, готово", "plan_id":0, "дебет":32233.07000, "accttrx_year ":2013, "sponsor_id":5, "division_id":0, "accttrx_month":1, "кредит":30000.00000, "trx_employee_id":1, "cheque_amt":32233.07000, "cheque_no":"", "accttrx_status" :"P", "accttrx_id":14 } ], "СТРАНИЦА":1, "ЗАПИСИ":2, "ВСЕГО":1.0 }


person user1706426    schedule 29.01.2013    source источник


Ответы (2)


Если вы используете ColdFusion 8 или более позднюю версию, вы можете использовать DeserializeJSON(), чтобы превратить JSON в структуру. Затем вы можете перебрать эту структуру, используя cfloop, и превратить содержимое структуры в запрос (используя QueryNew(), QueryAddRow() и QuerySetCell() внутри цикла). Оттуда вы можете либо использовать тег cfspreadsheet для преобразования этого запроса в файл Excel (или файл csv), если вы используете ColdFusion 9, либо вы можете вывести простой старый HTML, используя любую версию ColdFusion и установить заголовок, чтобы обмануть браузер думать, что это файл Excel, следующим образом:

<cfcontent type="application/msexcel">
person Brian    schedule 29.01.2013
comment
Я на CF8. Как получить данные в DeserializeJSON(). Я полагаю, это сделано здесь function(data){ $.each(data, function(index, item) { //(item.description,item.balance,item.accttrx_status); }); - person user1706426; 29.01.2013
comment
Выводить html и обманывать браузер, заставляя его думать, что это файл Excel, стало плохой идеей, когда MS представила Office 2007. - person Dan Bracuk; 30.01.2013
comment
Извините, я не ясно выразился. Мне нужна помощь, чтобы завершить мой код. Мне трудно закончить эту функцию, чтобы передать данные на вывод отсюда или если есть лучший способ извлечь и отправить данные для отображения. function(data){ $.each(data, function(index, item) { //(item.description,item.balance,item.accttrx_status); }); - person user1706426; 30.01.2013
comment
Я забыл упомянуть, что не могу десериализовать JSON() в cffunction, так как он используется в другом процессе с jqgrid. Поэтому мне нужно десериализовать JSON в клиенте при извлечении данных. - person user1706426; 30.01.2013

  1. Не используйте AJAX. Просто создайте функцию JS, чтобы передать параметры отчета в код обработки. См. этот пост для примера. По сути:

     window.location="process.cfm?param1=&param2=";
    
  2. Используйте deserializeJSON() в файле «../components/acct/accttrx.cfc», чтобы преобразовать опубликованный JSON в структуру CF.

  3. Используйте следующий CF, чтобы браузер распознал загрузку файла:

     <cfheader name="Content-Disposition" value="attachment;filename=XXXX">
     <cfcontent type="application/vnd.ms-excel" reset="false">
    
person malpaso    schedule 30.01.2013
comment
Я сделал #1 и #3, но я не могу #2 deserializeJSON() в cffunction, так как он используется в другом процессе с jqgrid. Поэтому мне нужно десериализовать JSON в клиенте при извлечении данных. Извините, я не ясно выразился. Мне нужна помощь, чтобы завершить мой код. Мне трудно закончить эту функцию, чтобы передать данные на вывод отсюда или если есть лучший способ извлечь и отправить данные для отображения. function(data){ $.each(data, function(index, item) { //(item.description,item.balance,item.accttrx_status); }); - person user1706426; 30.01.2013