初期修改 apache配置 ,php 代码 增加
ini_set("Mermery_limit",'4G');
治标不治本,分析代码,是在后端根据数据生成Excel表,然后下载下来,整体增加后端运行负载。
改造如下:
1·后端生成json 数据
2、前端用layui 的插件 layui-excel (https://github.com/wangerzi/layui-excel) 实现前端生成Excel ,比较好用
注意的坑:
netmvc 写的代码 ,在Content文件夹增加 layui 和 layui-excel,并在 BundleConfig.cs文件下下面配置
//引入layUi
bundles.Add(new ScriptBundle("~/layui/js").Include(
"~/Content/layui/layui.js"));
bundles.Add(new StyleBundle("~/layui/css").Include(
"~/Content/layui/css/layui.css"));
//引入layUi
bundles.Add(new ScriptBundle("~/layuiex/js").Include(
"~/Content/layuiexcel/layui_exts/excel.js"));
_Layout.cshtml文件下配置
@Styles.Render("~/layui/css")
@Scripts.Render("~/layui/js")
@Scripts.Render("~/layuiex/js")
前端一直报错,可能是找不到 js文件,或者是文件重复加载,反正各种报错,因此,粗暴删除_Layout.cshtml文件下的引入,直接写上
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script src="../layui/layui.js"></script>
<script src="../layuiexcel/layui_exts/excel.js"></script>
<script type="text/javascript">
layui.config({
base: 'layui_exts/'
}).extend({
excel: 'excel'
});
</script>
并在发布完成后 ,讲两个文件夹 直接复制到根目录即可,正常运行。
2、Controller返回的 JsonResult 数据量过大,也会出现失败的情况,因此在返回数据中增加如下代码
jsonResult.MaxJsonLength = int.MaxValue;
至此,整体改造完成,并运行正常。
部分代码如下:
后端:
public JsonResult getListVoTo(string ss)
{
List<string> lists = db.XXXX.Where<XXXX>(m => m.SS == ss.Trim()).Select(t => t.TT).ToList();
if (lists.Count() < 1)
{
Hashtable table1 = new Hashtable
{
["code"] = 0,
["msg"] = "无数据",
["data"] = "" //分页数据
};
return Json(table1, JsonRequestBehavior.AllowGet);
}
List<Dictionary<String, String>> ListMap = new List<Dictionary<String, String>>();
foreach (string t in lists)
{
JObject jo = (JObject)JsonConvert.DeserializeObject(t);
Dictionary<String, String> voMap = new Dictionary<String, String>();
string jsonStr = jo["itemList"].ToString();
JObject json = JObject.Parse(jsonStr);
string itemName = "";
string counts = "";
decimal totalPrice = 0.0m;
//由于返回单行不是数组,所以进行判断,并区分读取方式
foreach (JToken item in json["goodsItem"])
{
if (item.Count() != 1)
{
counts = item["gnum"].ToString();
itemName += item["itemName"].ToString() + "|";
totalPrice += Convert.ToDecimal(item["totalPrice"]);//合计
................
}
else
{
counts = "1";
itemName = jo["itemList"]["goodsItem"]["itemName"].ToString() + " ";
totalPrice = Convert.ToDecimal(jo["itemList"]["goodsItem"]["totalPrice"]);//合计
................
break;
}
}
voMap["sender_name"] = jo["senderInfo"]["name"].ToString(); // 发件人名称
voMap["sender_address"] = jo["senderInfo"]["address"].ToString(); // 发件人地址
voMap["receiver_name"] = jo["receiverInfo"]["name"].ToString();//收货人姓名
voMap["receiver_address"] = jo["receiverInfo"]["address"].ToString();//收货人地址( CN+ )
voMap["itemList_goodsItem_itemName"] = itemName.Substring(0, itemName.Length - 1); //货物描述 s = s.Substring(0,s.Length - 1)
voMap["itemList_goodsItem_totalPrice"] = (Math.Round((totalPrice / 7), 2)).ToString();//总值(USD)(硬编码美元换算)
................
ListMap.Add(voMap);
}
System.Diagnostics.Debug.WriteLine("==数据导出成功>>>>>>>>>");
Hashtable table = new Hashtable
{
["code"] = 0,
["msg"] = "导出数据【" + lists.Count() + "】条",
["data"] = ListMap//分页数据
};
//return Json(table, JsonRequestBehavior.AllowGet); 数据量过大,这样写,也是出问题,增加如下代码
JsonResult jsonResult = Json(table, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
return jsonResult;
}
前端部分代码如下:
<script>
layui.use(['layer', 'form', 'table', 'laydate', 'jquery'], function () {
var form = layui.form;
var table = layui.table;
//监听工具条
table.on('tool(user)', function (obj) {
var data = obj.data;
if (obj.event === 'detail') {
layer.alert(data.json_text)
}
});
//方法级渲染
table.render({
elem: '#LAY_table_user'
, url: '/Cnno/ListVo'//数据接口地址
, toolbar: true
, title: '基础数据表'
, totalRow: true
, defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
title: '提示'
, layEvent: 'LAYTABLE_TIPS'
, icon: 'layui-icon-tips'
}]
, cols: [[
{ title: '序号', templet: '#xuhao', fixed: 'left' },
//{ field: 'cgl_id', title: "cgl_id" },
{ field: 'id', title: "ID", hide: true },
{ field: 'master_no', title: "运单号" },
{ field: 'wl_no', title: "物流单号" },
{ field: 'order_no', title: "交易订单号" },
{ fixed: 'right', width: 178, align: 'center', toolbar: '#barDemo' }
]], //设置表头
id: 'testReload'
, page: true
, limit: 20,
limits: [50, 100, 150, 200, 500, 1000, 2000, 3000, 4000, 5000]
});
//搜索
var $ = layui.$, active = {
reload: function () {
var wlData = $('#wl');
var zyData = $('#zy');
//执行重载
table.reload('testReload', {
page: {
curr: 1 //重新从第 1 页开始
}
, where: {
wlDataP: wlData.val(),
zyDataP: zyData.val(),
}
}, 'data');
},
};
$('.demoTable .layui-btn').on('click', function () {
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
//---------
form.on('submit(uploadImg)', function (data) {
//var zydh = JSON.stringify(data.field);
// JSON.stringify(param)
//console.log(zydh);
loading = layer.load(1, { shade: [0.1, '#fff'] });
var $ = layui.jquery;
var excel = layui.excel;
var value = $("#zongyundan").val();
console.log("==========");
console.log(value);
console.log("==========");
$.ajax({
url: '/Cnno/getListVoTo',//数据接口地址
dataType: 'json',
// data: datato,
data: {
zydh:value
},
success: function (res) {
layer.close(loading);
layer.msg(res.msg);
// layer.msg("成功");
console.log(res.data);
// // 假如返回的 res.data 是需要导出的列表数据
// console.log(res.data);//
// // 1. 数组头部新增表头
res.data.unshift({
sender_name: ' 发件人名称',
sender_address: '发件人地址',
receiver_name: '收货人姓名',
receiver_address: '收货人地址',
.............
itemList_goodsItem_itemName: '货物描述',
itemList_goodsItem_totalPrice: '总值(USD)',
});
// // 3. 执行导出函数,系统会弹出弹框
excel.exportExcel({
sheet1: res.data
}, '数据.xlsx', 'xlsx');
},
error: function (res) {
layer.close(loading);
console.log(res.data);
layer.msg("失败");
// console.log(res);
}
});
});
//---------
});
</script>
网友评论