js使用XLSX實現excel數據縱向導出

 c#後台

[WebMethod]
    public static string exportData(objectItem object)
    {
        string id1= "", starttime = "", endtime = "", exportUpData = "", exportDownData = "", jsonString = "", id2= "", id3= "";
        id1= object.id1;
        id2= object.id2;
        id3= object.id3;
        starttime = object.starttime;
        endtime = object.endtime;
        JavaScriptSerializer jss = new JavaScriptSerializer();
        var dbObj = new Postgre();
        string sql1 = string.Format(@"select t.* from schmea.function('{3}', '{4}') t
                                      where t.id1= '{0}'  
                                      order by t.id1"
                                      , id1, id2, id3, starttime, endtime);
        
        exportUpData = JsonHelper.TableToArrayString(sql1);
        string sql2 = string.Format(@"select t.colum1,t.colum2,
                                             string_agg(cast(t.colum3 as varchar), ',' order by t.start_time,t.colum4,t.colum5) as colum3 
                                      from schmea.function('{3}', '{4}') t
                                      where t.id1= '{0}' {1} {2} 
                                      group by t.id1,t.id2,t.colum1,t.colum2,t.start_time
								      order by t.start_time"
                                    , id1, id2, id3, starttime, endtime);
        
        exportDownData = JsonHelper.TableToArrayString(sql2);
        exportUpData = exportUpData != "NoData" ? exportUpData : "\"NoData\"";
        exportDownData = exportDownData != "NoData" ? exportDownData : "\"NoData\"";
        jsonString += "[{\"exportUpData\":" + exportUpData + ",\"exportDownData\":" + exportDownData + "}]";
        return jsonString;
    }

java後台同理,sql相同,用mybatis或者jpa實現

js實現

function exportSubmit() {
    var id1= '';
    var id2 = '';
    var id3 = '';
    var starttime = '';
    var endtime = '';
    var objectItem={ 'id1': id1, 'id2 ': id2 , 'id3 ': id3 , 'starttime': starttime, 'endtime': endtime };
    $.ajax({
        type: "post",
        url: "../../..",
        data: JSON.stringify({ 'objectItem': objectItem }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        traditional: true,
        success: function (data) {
            var tempData = eval(data.d);
            if (tempData[0].exportUpData != 'NoData') {
                exportExcelFile(tempData[0]);
            } else {
                ShowMsg('無數據');
            }
        },
        error: function (t1, t2, t3) {
            var m = t1 + t2 + t3;
            alert(m);
        }
    });
}
function normSDist(x) {//实现正态分布
    const erf = (x) => {
        const t = 1.0 / (1.0 + 0.5 * Math.abs(x));
        const tau = t * Math.exp(-Math.pow(x, 2) - 1.26551223 +
          t * (1.00002368 +
            t * (0.37409196 +
              t * (0.09678418 +
                t * (-0.18628806 +
                  t * (0.27886807 +
                    t * (-1.13520398 +
                      t * (1.48851587 +
                        t * (-0.82215223 +
                          t * 0.17087277
                        )
                      )
                    )
                  )
                )
              )
            )
          )
        );
        return x >= 0 ? 1 - tau : tau - 1;
    };

    return (1 + erf(x / Math.sqrt(2))) / 2;
}
var exportHead = [
    { title: "title1" },
    { title: "title2" },
    { title: "title3" },
    { title: "" },
    { title: "" },
];
var lastTwoHead = [
    { title: "开始时间" },
    { title: "结束时间" },
    { title: "title1" },
    { title: "title2" },
    { title: "title3" },
];
function exportExcelFile(data) {
    var exportUpData = data.exportUpData;
    var exportDownData = data.exportDownData != "NoData"?data.exportDownData:[];
    var queryTyp = exportUpData[0][0] + " 报表";
    var curDt = new Date();
    var fileName = queryTyp + curDt.Format('yyyyMMddHHmmss');//生成文件名
    var vRow0 = [];//标题
    var vRow1 = [];//数据项名称
    var tHead = [];
    var lastHead = [];
    var tempArr = [];
    var wholeTable = [];
    var sheet = {};
    var message = '首行说明信息';
    vRow0 = [message];
    var excelUpData =[];
    var excelDownData =[];
    excelUpData = exportUpData.map(dataArray => dataArray.slice(3, -2));
    excelDownData = exportDownData.map(subArr => {//将二维数组总的每一项都变成字符串数组
        let flatSubArr = subArr.map(item => item.includes(',') ? item.split(',') : item).flat();
        return flatSubArr;
    });

    vRow1 = exportHead;
    tempArr[4] = vRow0[0];
    tHead.push(tempArr);
    // 将表头也转换为纵向数据
    var transposedHeader = [];
    var lastTwoData = [];
    for (var i = 0; i < vRow1.length; i++) {
        transposedHeader.push([vRow1[i]['title']]);
    }
    // 将数据转换为纵向数据
    var transposedData = [];
    for (var j = 0; j < excelUpData[0].length; j++) {
        var rowData = ['','','',''];
        // 将表头的每个元素做为纵向数据的第一个元素
        rowData.push(vRow1[j]['title']);
        // 将横向数据转换为纵向数据
        for (var k = 0; k < excelUpData.length; k++) {
            rowData.push(excelUpData[k][j]);
        }
        transposedData.push(rowData);
    }
    for (var col = 5; col < transposedData[0].length; col++) {
        //var formula = '=NORMSDIST(3*$' + String.fromCharCode(65 + col) + '$16)+NORMSDIST(6*$' + String.fromCharCode(65 + col) + '13-3*$' + String.fromCharCode(65 + col) + '$16)-1';//excel实现公式
        var formula = ((normSDist(3 * transposedData[14][col]) + normSDist(6 * transposedData[11][col] - 3 * transposedData[14][col]) - 1) * 100).toFixed(2) + '%';
        transposedData[16][col] = formula;
    }
    // 将最后两列的数组数据按逗号分割并纵向输出到excel中去
    /*lastTwoData = excelDownData[0][0].split(',').map(item =>[item,'']);
    for (var m = 0; m < excelDownData.length; m++) {
        var lastData = excelDownData[m][1].split(',');
        for (var n = 0; n < lastData.length; n++) {
            lastTwoData[n].push(lastData[n]);
        }
    }
    for (var i = 0; i < lastTwoHead.length; i++) {
        lastHead.push([lastTwoHead[i]['title']]);
    }*/
    for (var i = 0; i < lastTwoHead.length; i++) {
        lastHead[i]=lastTwoHead[i]['title'];
    }
    transposedData.push(lastHead); 
    //transposedData = transposedData.concat(lastTwoData);
    transposedData = transposedData.concat(excelDownData);
    wholeTable = tHead.concat(transposedData);

    sheet = XLSX.utils.aoa_to_sheet(wholeTable);
    sheet['!merges'] = [
    // 设置单元格合并
    { s: { r: 0, c: 4 }, e: { r: 0, c: excelUpData.length + 1 } }
    ];
    openDownloadDialog(sheet2blob(sheet), fileName + '.xlsx');
}

说明:由于需要纵向数据的excel,并且会去使用excel中的某些公式,所以可以通过构造数据来实现纵向输出。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值