後台導出大量數據的時候出現導不出數據

公共c#後台方法

 public static string AllTableToArrayString(string sql, string dataSource = "datasource")
    {
        string dt1 = DateTime.Now.ToString("HH:mm:ss");
        string jsonString = "";
        StringBuilder strBuilder = new StringBuilder();
        var connectionString = ConfigurationManager.AppSettings["datasource"];
        using (var connection = new NpgsqlConnection(connectionString))
        {
            connection.Open();
            //执行查询操作
            using (var command = new NpgsqlCommand(sql, connection))
            {
                command.CommandTimeout = 300;
                using (var reader = command.ExecuteReader())
                {
                    var dataTable = new DataTable();
                    dataTable.Load(reader);
                    //将数据转换为JSON格式
                    if (dataTable.Rows.Count > 0)
                    {
                        for (int i = 0; i < dataTable.Rows.Count; i++)
                        {
                            strBuilder.Append("[");
                            for (int j = 0; j < dataTable.Columns.Count; j++)
                            {
                                string col = dataTable.Columns[j].ColumnName;
                                if (j != dataTable.Columns.Count - 1)
                                {
                                    strBuilder.Append("'" + dataTable.Rows[i][j] + "',");
                                }
                                else
                                {
                                    strBuilder.Append("'" + dataTable.Rows[i][j] + "'],");
                                }

                            }

                        }
                        jsonString = "[" + strBuilder.ToString().Trim(',') + "]";
                    }
                    else
                    {
                        jsonString = "\"NoData\"";
                    }
                }
            }
        }
        return jsonString;
    }

公共java後台方法

與上同理使用SqlSessionFactory配置超時時間或直接在yml中配置超時時間。

公用js實現

function exportSubmit() {
    
    $.ajax({
        type: "post",
        url: "",
        data: JSON.stringify({ 'data1':data1 , 'data2': data2}),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        timeout: 180000,//設置超時時間3分鐘
        traditional: true,
        success: function (data) {
            var tempData = eval(data.d);
            if (tempData[0].rows != 'NoData') {
                exportExcelFile(tempData[0].rows);
            } else {
                ShowMsg('無數據');
            }
        },
        error: function (t1, t2, t3) {
            var m = t1 + t2 + t3;
            if (t2 === 'timeout') {
                ShowMsg('數據量太多,请求超时!!');
            } else {
                alert(m);
            }
            LoadingTip();
        }
    });
}
var exportHead = [
{ title: "title1" },
{ title: "title2" },
];

function exportExcelFile(data) {

    var queryTyp = "文件說明";
    var curDt = new Date();
    var fileName = queryTyp + curDt.Format('yyyyMMddHHmmss');//生成文件名
    var vRow0 = [];//標題
    var vRow1 = [];//數據項名稱
    var tHead = [];

    var tempArr = [];
    var wholeTable = [];
    var sheet = {};
    vRow0 = ['文件說明'];
    vRow1 = exportHead;

    tempArr = new Array(vRow1.length).fill(null);
    tempArr[0] = vRow0[0];
    tHead.push(tempArr);

    tempArr = [];
    for (var i = 0; i < vRow1.length; i++) {
        tempArr.push(vRow1[i]['title']);
    }
    tHead.push(tempArr);

    wholeTable = tHead.concat(data);
    sheet = XLSX.utils.aoa_to_sheet(wholeTable);
    sheet['!merges'] = [
        // 设置第一行與第二行相同列數的单元格合并
        { s: { r: 0, c: 0 }, e: { r: 0, c: vRow1.length - 1 } }
    ];
    openDownloadDialog(sheet2blob(sheet), fileName + '.xlsx');
}

注意:通過command.CommandTimeout配置數據庫延時時間,默認超時時間為20秒。並且需要在js中的ajax請求中設置timeout屬性,否則後台時間過長,前台也會因為超時出現超時的錯誤。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值