Layui之使用table.exportFile导出报错网络错误

导出表格所有数据

使用火狐浏览器可以下载文件,谷歌浏览器报网络错误

参考
https://blog.csdn.net/weixin_44285250/article/details/86229277 导出csv
https://blog.csdn.net/u010652866/article/details/90513721 使用 Blob

1
https://blog.csdn.net/xiewenfeng520/article/details/104563113

中指出   原因就是 base64encode(data)转码之后过长,url下载的长度限制,无法下载。
采用Blob类型存储就可以了。

2
https://blog.csdn.net/weixin_30507481/article/details/96552857

中指出   经查,TableExport是将CSV文件,放到get请求中
如果CSV文件内容过多,则get请求长度过长,无法正确处理
从浏览器的下载地址即可看出,TableExport插件是直接将CSV文件作为get请求发送从而下载

get请求的长度在http协议规范中没有规定,规定是服务器(如IIS、Tomcat等)和浏览器(如Safari、Chrome等)自行处理的

常用浏览器长度限制:

IE:2083

Firefox:65536(但实际不少于100000)  --括号内不确定,仅为网络查询资料,实际这个6.2M的文件Firefox也无法正常下载,可能与版本有关
	
Chrome:8182

Safari:80000

Opera:190000

常用服务器长度限制:

Apache:8192

IIS:16384(IIS7中可以修改)

Nginx:可通过配置修改

3 
https://blog.csdn.net/qq_34720759/article/details/79189480
中指出   发现对写入浏览器的stream流,有的加上了流的长度,试了下就成功了。我想是因为chrome做了某些安全限制吧,防止未知流写入。
加上的代码就一句,向客户端声明输出流的长度
response.AddHeader("Content-Length", bytes.Length.ToString());
或
String jsonResult="";   //     String jsonResult="";
response.addHeader("Content-Length", String.valueOf(jsonResult.getBytes().length)); 
response.addHeader("Content-Length", String.valueOf(jsonResult.getBytes().length)); 

其中 bytes就是所要写入浏览器的字节流。
在将字节流写入浏览器时,一定要声明字节流的长度!!!

我原先使用 layui 中 table.exportFile 导出速度慢
1

form.on('submit(exp)', function(msg) {   //全部导出
   $.ajax({
        url: "{:url('admin/get/all')}",
        type: 'post',
        data: {dmp_id: dmp_id},
        success:function(res){
            var obj = eval("("+res+")");
            exportData2 = obj.data;
             // table.exportFile(d, exportData2,'xls');
             table.exportFile(['名字','ID','任务ID','表单编号','归属地','来源','eff','Int','mate'],exportData2, 'xls');
         }
     });
     return false;
 });
 
 var dataList;
 var dmp_id;
 form.on('submit(admin)', function(data){
       layui.use('table', function(){
           var table = layui.table;
           dmp_id = data.field.task_name;
           d = table.render({
               elem: '#demo'
               ,id:'test'
               ,url: '/admin/an/data_ajax/' //数据接口
               ,where: {dmp_id: data.field.task_name}
               ,cols: [[ //表头
                 {field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
                 ,{field: 'eff', title: '客户',sort: true} 
                 ,{field: 'Int', title: '意',sort: true}
                 ,{field: 'mate', title: '需', sort: true}
               ]]
               ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
                   layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
                   ,limit:10 //一页显示多少条
                   ,limits:[5,10,15]//每页条数的选择项
                   ,groups: 2 //只显示 2 个连续页码
                   ,first: "首页" //不显示首页
                   ,last: "尾页" //不显示尾页
               }
           });
           
       });
     return false;
 });

2 参考 https://blog.csdn.net/tyweb_nte/article/details/105992532 导出速度快

页面中

<button type="button" class="layui-btn layui-btn-blue"  lay-submit="" id="btnExport" lay-filter="exp">导出EXCEL</button> </div>
<a href="{:url('/admin/Analysis/putStory')}"  id="links" class="layui-btn layui-btn-blue">导出CSV文件</a>

js中

 // 导出csv
 $('#links').attr('href',"{:url('/admin/Ana/putStory')}");   // 删除已赋值参数
 $('#links').attr('href',function(i, attr) {                       // 添加参数
     return attr + '?dmp_id='+ data.field.task_name;
 });

控制器中 返回要导出所有数据的数组

1方式中

$res = [
        'code'=>'0',
          'data'=>$result
      ];
return json_encode($res);

2方式中

use think\Csv;

$csv = new Csv();
$titleList = array('名字','ID','任务ID','表单编号','归属地','来源','effectiveness','Intentionality','matching_degree');
$csv->put_csv($result, $titleList);

2中 需要在thinkphp/library/think下新建Csv.php
可以 导入导出 csv 支持十几万+数据

<?php

namespace think;
 
class Csv
{

//导出csv文件
public function put_csv(&$data, $titleList = array(), $fileName = '')
{
    ini_set("max_execution_time", "3600");
    $csvData = '';

    // 标题
    $nums = count($titleList);
    for ($i = 0; $i < $nums - 1; $i++)
    {
        $csvData .= '"' . $titleList[$i] . '",';
    }
    $csvData .= '"' . $titleList[$nums - 1] . "\"\r\n";

    foreach ($data as $key => $row)
    {
        $i = 0;
        foreach ($row as $_key => $_val)
        {
            $_val = str_replace("\"", "\"\"", $_val);
            if ($i < ($nums - 1))
            {
                $csvData .= '"' . $_val . '",';
            }
            elseif ($i == ($nums - 1))
            {
                $csvData .= '"' . $_val . "\"\r\n";
            }
            $i++;
        }
        unset($data[$key]);
    }

    $csvData = mb_convert_encoding($csvData, "cp936", "UTF-8");
    $fileName = empty($fileName) ? date('Y-m-d-H-i-s', time()) : $fileName;
    $fileName = $fileName . '.csv';
    header("Content-type:text/csv;");
    header("Content-Disposition:attachment;filename=" . $fileName);
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Expires:0');
    header('Pragma:public');
    echo $csvData;
    exit();
}

// csv导入,支持10W+数据
public function input_csv($filename,$field,$table) {
    //$field 打散为数组
    $fieldArr = explode(',', $field);
    //CSV转数组 $excelData
    $content = trim(file_get_contents($filename));
    $excelData = explode("\n",$content); //把字符串打散为数组
    //删除第一行标题
    array_splice($excelData, 0, 1);

    // 将这个大量数据(10W+)的数组分割成5000一个的小数组。这样就一次批量插入5000条数据。mysql 是支持的。
    $chunkData = array_chunk($excelData ,5000);
    $count = count($chunkData);
    for ($i = 0; $i < $count; $i++) {
        $insertRows = array();
        foreach($chunkData[$i] as $value){
            //转码,有中文不要用这种方式,会出乱码
            //$string = mb_convert_encoding(trim(strip_tags($value)), 'utf-8', 'gbk');
            $string = trim(strip_tags($value));//转码
            $v = explode(',', $string); //把字符串打散为数组
            $row = array();
            for($j=0;$j<count($fieldArr);$j++){
                $row[$fieldArr[$j]] = $v[$j];
            }
            $sqlString = "('".implode( "','", $row )."')"; //把数组元素组合为字符串 批量
            $insertRows[] = $sqlString;
        }
        $result = $this->addData($table,$insertRows,$field); //批量将sql插入数据库。
    }
    return $result;
}

public function addData($table,$rows,$field)
{
    if(empty($rows)){
        return false;
    }
    //数据量较大,采取批量插入
    $data = implode(',', $rows);
    $sql = "INSERT IGNORE INTO $table ($field) VALUES {$data}";
    $result = Db::execute($sql);
    return $result;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值