导出表格所有数据
使用火狐浏览器可以下载文件,谷歌浏览器报网络错误
参考
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;
}
}