因公司业务需要,需要对网页版模块数据的批量导入和模板导出功能来实现批量数据的导入
效果图如下:
老铁们
在网上也看了很多的教程,最后还是实现了我的功能 哼哼
废话不多比比 直接上主菜:
Csv的类:
<?php
class Csv{
/**
* 导出csv文件
* @param $list 数据源
* @param $title 数据列表
*/
public function put_csv($list,$title)
{
$file_name = "exam".time().".csv";//文件名
header('Content-Type: application/vnd.ms-excel');//设置内容类型为Excel
header('Content-Disposition: attachment;filename='.$file_name );//下载文件
header('Cache-Control: max-age=0');//表示当访问此网页后的0秒内再次访问不会去服务器
$file = fopen('php://output',"a");//打开文件或者 URL, php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区, a:写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
$limit = 1000;
$calc = 0;
foreach ($title as $v){
$tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);//转码
}
fputcsv($file,$tit);//将行格式化为 CSV 并写入一个打开的文件中。(标题)
foreach ($list as $v){
$calc++;
//-------核心!!!清空缓存,将缓存上的数据写入到文件--------
if($limit == $calc){
ob_flush();//将本来存在输出缓存中的内容取出来,调用ob_flush()之后缓冲区内容将被丢弃。
flush(); //待输出的内容立即发送。 具体查看:https://www.jb51.net/article/37822.htm
$calc = 0;
}//-------核心--------
foreach($v as $t){
$tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
}
fputcsv($file,$tarr);//将行格式化为 CSV 并写入一个打开的文件中。(内容)
unset($tarr);//销毁指定的变量
}
unset($list);//销毁指定的变量
fclose($file);//关闭打开的文件
exit();
}
//批量导入数据的模板
public function input_csv($csv_file) {
$result_arr = array ();
$i = 0;
while($data_line = fgetcsv($csv_file,10000)) {
if ($i == 0) {
$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;
}
}
?>
Controller:
//导出模板的方法体:
public function exportCsv(){
$model=D('Tlibrary');
$datalist = array();
$csv_title = array('中文','英文','英文编写','西班牙','日文','俄文','备注','类型');
//csv导出
$csv = new Csv(); //实例化后才可以调用之前类文件定义好的方法
$csv->put_csv($datalist, $csv_title);
}
//批量导入
public function allinport(){
$model = D('Tlibrary');
if($_FILES['inportfile']['error']!=4){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 10485760 ;// 设置附件上传大小
$upload->exts = array('csv');// 设置附件上传类型
$upload->rootPath = 'Public/data/hr/xuelizhengshu/'; // 设置附件上传根目录
// 上传文件
$info = $upload->upload();
if(!$info) {
// 上传错误提示错误信息
$this->error($upload->getError());
}else{
//上传成功 获取上传文件信息
foreach($info as $file){
$path='Public/data/hr/xuelizhengshu/'.$file['savepath'].$file['savename'];
}
$handle = fopen($path,'r');
$csv = new Csv();
$result = $csv->input_csv($handle); // 解析csv
$len_result = count($result);
if($len_result == 0){
$this->error('此文件中没有数据!');
}
// $data_values = '';
for($i = 1;$i < $len_result+1;$i ++) { // 循环获取各字段值
$arr = array_values($result[$i]);
// $id =$arr[0];
$cn= iconv('gb2312','utf-8',$arr[0]); // 中文转码
$en = $arr[1];
$abben = $arr[2];
$sp = $arr[3];
$jp = $arr[4];
$ru = $arr[5];
$remarks = $arr[6];
$manager_id = session('manager_id');
$mdate = time();
if(iconv('gb2312','utf-8',$arr[7])=="办公"){
$flag = 0;
}else {
$flag = 1;
}
$data=array('cn'=>$cn,'en'=>$en,'abben'=>$abben,'sp'=>$sp,'jp'=>$jp,'ru'=>$ru,'remarks'=>$remarks,'manager_id'=>$manager_id,'mdate'=>$mdate,'flag'=>$flag);
$resultjs = $model ->add($data);
}
fclose($handle); // 关闭指针
$this->success('文件上传成功,数据已经导入!');
}
}
}
根据你的数据表的逻辑来更改添加的代码逻辑 就完成了