参考来源1:https://blog.csdn.net/tim_phper/article/details/77581071

参考来源2:https://blog.csdn.net/qq_37682202/article/details/79426810

在数据不太多的时候,用xlsx表格导出导入还是可以的。

数据量很大时(5万条以上),用 PHPExcel 导出 xls 将十分缓慢且占用很大内存,最终造成运行超时或内存不足。

excel也是有脾气的呀!

  • 表数据限制:
Excel 2003及以下的版本。一张表最大支持65536行数据,256列。
Excel 2007-2010版本。一张表最大支持1048576行,16384列。

也就是说你想几百万条轻轻松松一次性导入一张EXCEL表是不行的,你起码需要进行数据分割,保证数据不能超过104W一张表。

到数据的导入与导出,因为数据比较多,思来想去使用了CSV格式的文件,结合了网上各位大佬的文章,具体代码如下:

在thinkphp/library/think下新建Csv.php文件:

<?php
namespace Think;
class Csv
{
//导出csv文件
public function put_csv($list,$title)
{
$file_name = "exam".time().".csv";
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.$file_name );
header('Cache-Control: max-age=0');
$file = fopen('php://output',"a");
$limit = ;
$calc = ;
foreach ($title as $v){
$tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);
}
fputcsv($file,$tit);
foreach ($list as $v){
$calc++;
if($limit == $calc){
ob_flush();
flush();
$calc = ;
}
foreach($v as $t){
$tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
}
fputcsv($file,$tarr);
unset($tarr);
}
unset($list);
fclose($file);
exit();
} // csv导入,此格式每次最多可以处理1000条数据
public function input_csv($csv_file) {
$result_arr = array ();
$i = ;
while($data_line = fgetcsv($csv_file,)) {
if ($i == ) {
$GLOBALS ['csv_key_name_arr'] = $data_line;
$i ++;
continue;
}
foreach($GLOBALS['csv_key_name_arr'] as $csv_key_num => $csv_key_name ) {
$result_arr[$i][$csv_key_name] = $data_line[$csv_key_num];
}
$i++;
}
return $result_arr;
}
}
?>

在控制器中调用:

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use think\Db;
use think\Paginator;
use think\Validate;
use think\Csv; //此处是csv文件实现的关键
class Index extends Controller
{
public function _initialize()
{
header("Content-type:text/html;charset=utf-8");
}
/*
* CSV试题导出
*/
public function downQuestions()
{
$condition['qu_status'] = array('gt','-1');
$csv = new Csv(); //实例化后才可以调用之前类文件定义好的方法
$list = Db::table('gw_questions')->field('qu_name,qu_options,qu_answer,qu_describe,gw_topic.to_name,qu_time,te_name')->join('gw_topic','gw_topic.to_id=gw_questions.to_id')->join('gw_teacher','gw_teacher.te_id=gw_questions.te_id','LEFT')->where($condition)->select();
$csv_title = array('题干内容','选项详情','参考答案','答案解析','题型','录入时间','录入人');
$csv->put_csv($list,$csv_title);
} /*
* CSV试题导入
*/
public function upQuestionsWrite()
{
// 获取表单上传文件
$file = request()->file('examfile');
if(empty($file)) {
$this->error('请选择上传文件');
}
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH.'public'.DS.'upload');
//获取文件(日期/文件),$info->getFilename();
$filename = ROOT_PATH.'public'.DS.'upload/'.$info->getSaveName();
$handle = fopen($filename,'r');
$csv = new Csv();
$result = $csv->input_csv($handle); // 解析csv
$len_result = count($result);
if($len_result == ){
$this->error('此文件中没有数据!');
}
$data_values = '';
for($i = ;$i < $len_result+;$i ++) { // 循环获取各字段值
$arr = array_values($result[$i]);
$qu_name = iconv('gb2312','utf-8',$arr[] ); // 中文转码
$qu_options = iconv('gb2312','utf-8',$arr[]);
$qu_answer = $arr[];
$qu_describe = iconv('gb2312','utf-8',$arr[]);
$to_id = $arr[];
$te_id = ; //添加试题的教师
$data_values .= "('$qu_name','$qu_options','$qu_answer','$qu_describe','$to_id','$te_id'),";
}
$data_values = substr($data_values,,- ); // 去掉最后一个逗号
fclose($handle); // 关闭指针
// 批量插入数据表中
$result = DB::execute("insert into gw_questions (qu_name,qu_options,qu_answer,qu_describe,to_id,te_id) values $data_values" );
if($result){
$this->success('文件上传成功,数据已经导入!','exampaper',);
}else{
// 上传失败获取错误信息
$this->error($file->getError());
}
}
}
?>

模板页表单(此处我的项目中使用了框架,样式可以按自己的需求修改):

<form action="{:url('index/index/upQuestionsWrite')}" method="post" class="form form-horizontal" enctype="multipart/form-data" id="addform">
    <div class="row cl">
<label class="form-label col-xs-4 col-sm-2">选择试题文件:</label>
<div class="btn-upload form-group">
    <input type="text" name="uploadfile" id="uploadfile" class="input-text upload-url radius" readonly> <a href="javascript:void();" class="btn btn-primary radius"><i class="Hui-iconfont"></i>浏览文件</a>
<input type="file" name="examfile" class="input-file" multiple>
</div>    
<a class="btn btn-success btn-submit">导入试题</a>
</div>
</form>
<script type="text/javascript">
$(function(){
//表单提交时判断是否有文件存在
$(".btn-submit").click(function(){
if($("input[name='uploadfile']").val() == ''){
alert("请选择CSV文件!");
return false;
}else{
    $("#addform").submit();
}
});
});
</script>

php表格--大数据处理的更多相关文章

  1. eMarketer:DMP帮广告主搞定大数据处理问题

    DMP(数据管理平台)帮助广告主获得可行动的洞察 在数字广告领域,大数据和数据管理平台(DPMs)仍大有可为.DMPs让广告主可以使用他们的大数据来做出更灵活更有效的营销决策. 数据管理和分析是业界挑 ...

  2. 大数据处理也要安全--关于MaxCompute的安全科普

    [TOC] 1.企业大数据处理现状 当今社会数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(百GB.TB乃至PB)级别.基于此,阿里云推出有了一套快速.完全托 ...

  3. 翻译-In-Stream Big Data Processing 流式大数据处理

    相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twitter Storm,Yah ...

  4. [转载] 一共81个,开源大数据处理工具汇总(下),包括日志收集系统/集群管理/RPC等

    原文: http://www.36dsj.com/archives/25042 接上一部分:一共81个,开源大数据处理工具汇总(上),第二部分主要收集整理的内容主要有日志收集系统.消息系统.分布式服务 ...

  5. 《Spark大数据处理:技术、应用与性能优化 》

    基本信息 作者: 高彦杰 丛书名:大数据技术丛书 出版社:机械工业出版社 ISBN:9787111483861 上架时间:2014-11-5 出版日期:2014 年11月 开本:16开 页码:255 ...

  6. Spark大数据处理技术

    全球首部全面介绍Spark及Spark生态圈相关技术的技术书籍 俯览未来大局,不失精细剖析,呈现一个现代大数据框架的架构原理和实现细节 透彻讲解Spark原理和架构,以及部署模式.调度框架.存储管理及 ...

  7. hadoop大数据处理之表与表的连接

    hadoop大数据处理之表与表的连接 前言:  hadoop中表连接其实类似于我们用sqlserver对数据进行跨表查询时运用的inner join一样,两个连接的数据要有关系连接起来,中间必须有一个 ...

  8. 0基础搭建Hadoop大数据处理-初识

    在互联网的世界中数据都是以TB.PB的数量级来增加的,特别是像BAT光每天的日志文件一个盘都不够,更何况是还要基于这些数据进行分析挖掘,更甚者还要实时进行数据分析,学习,如双十一淘宝的交易量的实时展示 ...

  9. 0基础搭建Hadoop大数据处理-编程

    Hadoop的编程可以是在Linux环境或Winows环境中,在此以Windows环境为示例,以Eclipse工具为主(也可以用IDEA).网上也有很多开发的文章,在此也参考他们的内容只作简单的介绍和 ...

随机推荐

  1. File.Create(path)未关闭遇到的一点点问题

    本人老菜鸟一枚,不是因为偶是菜鸟中的老手,而是偶是老了但是还是很菜的鸟╮(╯▽╰)╭,不过打今儿起偶想要腾飞…… 今天写文本文件编辑类时遇到一个小问题,下面先将问题描述一下: 1.写文本文件时都会习惯 ...

  2. [vijos1883]月光的魔法<递归>

    题目链接:https://vijos.org/p/1883 这道题还有另外一种版本叫天神下凡,属于模拟题,可是模拟题数据太水以至于模拟题A了都不一定在vijos上A.... 在模拟题里我用的是一种类似 ...

  3. Activiti网关--排他网关

    排他网关 1.什么是排他网关 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策. 当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分 ...

  4. 1-1. OSS/ALSA 声卡的驱动与配置和 Madplay 嵌入式播放器的移植

    报警子系统 一. OSS/ALSA 声卡的驱动与配置 声卡驱动中传统的OSS构架在02年被收购后即不开源,并且OSS的混音效果不好->因此ALSA构架孕育而生. ALSA(高级音频构架,目前应用 ...

  5. .net core 集成 sentry 进行异常报警

    .net core 集成 sentry 进行异常报警 Intro Sentry 是一个实时事件日志记录和汇集的平台.其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈.它分为客户端和 ...

  6. Git常用命令(一)

    $ git init 初始化仓库(会生成一个隐藏文件.git) $ git add + (文件名) 实现对指定文件的跟踪 $ git commit 提交更新$ git clone + URL 克隆远程 ...

  7. MySQL入门,第二部分,必备基础知识点

    一.数据类型 日期和时间数据类型 date 字节 日期,格式:2014-09-18 日期和时间数据类型 time 字节 时间,格式:08:42:30 日期和时间数据类型 datetime 字节 日期时 ...

  8. defer使用小结

    defer 前言 defer的定义 defer执行的规则 为什么需要defer defer进阶 作为匿名函数 作为函数参数 defer命令执行的时机 defer配合recover 总结 参考 defe ...

  9. Mybatis对象关系映射 one2one,one2many,many2many

    MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...

  10. 虚拟机VMware 安装后虚拟机网卡与主机网卡数据交换关系

    安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后面会详细介绍.在VMware Worksta ...