php中excel以及cvs等导入以及导出
一般网站后台都有人员导入或者是订单导出之类的操作,今天分享一下几种php excel cvs等文件导入导出的办法。 第一种比较简单的,自己写的,不引用任何excel类。但是会有bug,代码如下:
首先 视图页面:
<div class="panel-body">
<form action="./index.php" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
<input type="hidden" name="leadExcel" value="true"> // 导入excel类型
<input type="hidden" name="ac" value="question" /> // 将文件导入到某位置
<label class="col-xs-12 col-sm-3 col-md-2 control-label"></label>
<div class="help-block">请先下载导入模板,然后按照模板样式添加试题。</div>
<div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label"></label>
<div class="col-sm-9 col-xs-12">
<input type="file" class="pull-left btn-default" name="inputExcel">
</div>
</div>
<div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label"></label>
<div class="col-sm-9 col-xs-12">
<input type="submit" class="btn pull-left btn-primary" value="导入数据">
<a class="btn btn-primary" href="../addons/ewei_exam/example/example_question.csv" style="margin-left: 20px;">下载导入模板</a>
</div>
</div>
</form>
</div>
然后是控制层页面
if($_GPC['leadExcel'] == "true")
{
$filename = $_FILES['inputExcel']['name'];
$tmp_name = $_FILES['inputExcel']['tmp_name']; $msg = uploadFile($filename, $tmp_name, $_GPC); //print_r($msg);exit;
if ($msg == 1) {
message('导入成功!', referer(), 'success');
} else {
message($msg, '', 'error');
}
}
最后uploadfile这个函数中是读取excel文件内容并插入数据库,可以写在函数中,最好写到excel类中
function uploadFile($file, $filetempname, $array)
{
if ($result = file_get_contents($filetempname)) {
$result = iconv('gbk', 'utf-8', $result);
if (empty($result)) {
return $msg = '导入失败';
}
$result = preg_replace('/\n/', 'h--h', $result);
$result = explode('h--h', $result);
foreach ($result as $key => $ques) {
$ques = explode(',', $ques);
if ($key == 0) {
continue;
}
$strs = array();
foreach ($ques as $questi) {
$strs[] = preg_replace('/\s/', '', trim($questi, "\""));
if ($array['ac'] == 'question') {
upload_question($strs, time(), $array);
}elseif ($array['ac'] == 'member') {
upload_member($strs, time());
}
}
}
$msg = '1';
} else {
$msg = "导入失败!";
}
return $msg;
} function upload_question($strs, $time, $array)
{
global $_W; //print_r($array);exit; $question_type = $strs[0];
$level = $strs[1];
$question = $strs[2];
$answer = $strs[3];
$answer1 = $strs[4];
$answer2 = $strs[5];
$answer3 = $strs[6];
$answer4 = $strs[7];
$answer5 = $strs[8];
$answer6 = $strs[9];
$explain = $strs[10]; $row_num = $array['row_num']; $insert = array();
//$insert['userid'] = $userid;
pdo_insert('ewei_exam_question', $insert);
}
}
$insert中是需要插入的数据,上面的都是获取到的数据。
这种方式比较简单,但是导入的时候对excel文件的要求比较高,而且必须是utf8的格式。
第二种是引用线上封装好的的phpexcel类,这种方式基本不会出现任何问题。介绍一种:
https://github.com/dhucaichao/phpexcel.git 我放在github上了,可以自己下载。引用的代码如下:
视图层代码和上面一种一样,获取excel文件信息的代码如下
// 批量导入
function importExecl($file='', $sheet=0){
$file = iconv("utf-8", "gb2312", $file); //转码
if(empty($file) OR !file_exists($file)) {
die('file not exists!');
}
load()->classs('PHPExcel');
$objRead = new PHPExcel_Reader_Excel2007(); //建立reader对象
if(!$objRead->canRead($file)){
$objRead = new PHPExcel_Reader_Excel5();
if(!$objRead->canRead($file)){
die('No Excel!');
}
} $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ'); $obj = $objRead->load($file); //建立excel对象
$currSheet = $obj->getSheet($sheet); //获取指定的sheet表
$columnH = $currSheet->getHighestColumn(); //取得最大的列号
$columnCnt = array_search($columnH, $cellName);
$rowCnt = $currSheet->getHighestRow(); //获取总行数 $data = array();
for($_row=1; $_row<=$rowCnt; $_row++){ //读取内容
for($_column=0; $_column<=$columnCnt; $_column++){
$cellId = $cellName[$_column].$_row;
$cellValue = $currSheet->getCell($cellId)->getValue();
// $cellValue = $currSheet->getCell($cellId)->getCalculatedValue();
if($cellValue instanceof PHPExcel_RichText){ //富文本转换字符串
$cellValue = $cellValue->__toString();
} $data[$_row][$cellName[$_column]] = $cellValue;
}
} return $data;
}
其中load()->classs('PHPExcel');是导入phpexcel类,我用的是框架自带的导入方式,不同框架有不同的导入方式,也可以死直接include进来。
$data是获取到的数据,可以导入数据库,例如:
function upload_staff($data)
{
global $_W;
foreach ($data as $key => $value){
if ($key == 1){
continue;
}
$insert = array(
'realname' => $value['A'],
'mobile' => $value['B'],
'email' => $value['C'],
'departmentid' => find_department($value['D']),
'position' => $value['E'],
'birthyear' => substr(strReplace($value['F']),0,4),
'birthmonth' => substr(strReplace($value['F']),5,2),
'birthday' => substr(strReplace($value['F']),8,2),
'entrytime' => strReplace($value['G']),
'company' => find_company($_W['uid'])
);
$id = find_is_exists($value['B']);
if ($id){
$return = pdo_update('mc_members', $insert, array('uid' => $id,'uniacid'=>$_W['uniacid']));
if (!$return){
return "第".($key-1)."条数据更新失败";
}
} else {
$insert['uniacid'] = $_W['uniacid'];
$id = pdo_insert('mc_members', $insert);
if (!$id){
return "第".($key-1)."条数据添加失败";
}
}
}
return 1;
}
同样,也可以将数据库中的数据导出到excel中:
$list1 = array('部门','职位','手机号','姓名','发放积分','备注');
$where = ' WHERE m.uniacid=:uniacid AND mobile <> :mobile AND d.uniacid = :duniacid';
$param = array(':uniacid'=>$_W['uniacid'],':mobile'=>'',':duniacid'=>$_W['uniacid']);
$lists = pdo_fetchall("SELECT d.name,m.position,m.mobile,m.realname FROM " . tablename('mc_members'). " AS m LEFT JOIN " . tablename('xfl_department'). " AS d ON m.departmentid = d.id " .$where,$param);
$a = exportExcel($list1,$lists,'员工列表','./',true);
header($a);
function exportExcel($title=array(), $data=array(), $fileName='', $savePath='./', $isDown=false){
load()->classs('PHPExcel');
$obj = new PHPExcel();
//横向单元格标识
$cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
$obj->getActiveSheet(0)->setTitle('sheet1'); //设置sheet名称
$_row = 1; //设置纵向单元格标识
if($title){
$_cnt = count($title);
$obj->getActiveSheet(0)->mergeCells('A'.$_row.':'.$cellName[$_cnt-1].$_row); //合并单元格
$obj->setActiveSheetIndex(0)->setCellValue('A'.$_row, '数据导出:'.date('Y-m-d H:i:s')); //设置合并后的单元格内容
$_row++;
$i = 0;
foreach($title AS $v){ //设置列标题
$obj->setActiveSheetIndex(0)->setCellValue($cellName[$i].$_row, $v);
$i++;
}
$_row++;
}
//填写数据
if($data){
$i = 0;
foreach($data AS $_v){
$j = 0;
foreach($_v AS $_cell){
$obj->getActiveSheet(0)->setCellValue($cellName[$j] . ($i+$_row), $_cell);
$j++;
}
$i++;
}
}
//文件名处理
if(!$fileName){
$fileName = uniqid(time(),true);
}
$objWrite = PHPExcel_IOFactory::createWriter($obj, 'Excel2007');
if($isDown){ //网页下载
header('pragma:public');
header("Content-Disposition:attachment;filename=$fileName.xls");
$objWrite->save('php://output');exit;
}
$_fileName = iconv("utf-8", "gb2312", $fileName); //转码
$_savePath = $savePath.$_fileName.'.xlsx';
$objWrite->save($_savePath);
return $savePath.$fileName.'.xlsx';
}
exportExcel返回的是数据导入后的excel文件的地址,可以直接header过去下载。
php中excel以及cvs等导入以及导出的更多相关文章
- 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)
前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...
- java中 Excel表实现数据导入导出
需要引入依赖: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> < ...
- java 调用jdbc 实现excel和csv的导入和导出
jdbc 的连接 实体类 package com.gpdi.mdata.web.manage.database.data;public class DBQueryData {private Strin ...
- docker中mysql数据库的数据导入和导出
导出数据 查看下 mysql 运行名称 docker ps 结果:  执行导出(备份)数据库命令: 由第一步的结果可知,我们的 mysql 运行在一个叫 mysql_server 的 docker ...
- 命令框中oracle dmp文件的导入和导出(仅做个人备忘)
1.dmp文件导出 (全部)exp 用户名/密码 rows=y indexes=n compress=n buffer=65536 feedback=100000 file=F:\test.dmp ...
- vue中excal表格的导入和导出
注意:vue中要实现表格的导入与导出,首先要install两个依赖, npm install -S file-saver xlsx 和 npm install -D script-loader.其 ...
- ASP.NET Core MVC上传、导入、导出知多少
前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天才研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...
- ES6 模块导入import 导出export 和module.export
ES6中新增了模块的导入和导出功能 在实际过程中可以使用 import 和 export 对模块进行导入和导出操作,具体如下 1. 名字导入/导出 (导入名字必须与导出的一致,导入时需要用花括号) ...
- [转]Java中导入、导出Excel
原文地址:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样 ...
随机推荐
- django自定义simple_tag和filter
1.自定义simple_tag: 1).在app目录名下创建templatetags目录,并新建__init__.py文件. 2).在templatetags目录下创建任意名字的py文件,例如rema ...
- ORACLE 12c RAC的常用管理命令
ORACLE 12c RAC的常用管理命令 一.查询 1.RAC查询 1.1.查询节点 [grid@swnode1 ~]$ su - grid [grid@swnode1 ~]$ /u01/app/1 ...
- java中annotation
什么是annotation(注解)? java.lang.annotation,接口Annotation.对于Annotation,是Java5的新特性,JDK5引入了Metadata(元数据)很容易 ...
- Oracle错误——tablespace 'XXXX' does not exist
错误 在使用IMP命令导入Oracle数据的时候,因为导出数据的数据库表空间和导入数据的数据库表空间不同,导致导入数据失败,出现:tablespace 'XXXX' does not exist 在网 ...
- win10 1803版本unable to start ssh-agent service, error :1058
PowerShell安装了pshazz或者posh-git,但是打开的时候提示 unable to start ssh-agent service, error :1058 1803的设置上面可以看到 ...
- Vivado HLS 工具
干什么的 Vivado HLS工具可以将C语言高级综合为硬件. 为什么要使用HLS 可以在更高的抽象层次描述功能,而不是在传统的RTL级别 一个潜在的用处是,系统设计划分成硬件部分和软件部分之后,软件 ...
- 基于create-react-app的打包后文件路径问题
改绝对路径为相对路径. https://segmentfault.com/q/1010000009672497直接在package.json里加 "homepage":" ...
- CentOS yum换源
1.备份系统自带yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.进入yum源配 ...
- HTML5 API分享
Facebook - http://developers.facebook.com/ 人人网开放平台 - http://dev.renren.com/ 51.com开放平台 - http://deve ...
- kafka consumer 配置详解
1.Consumer Group 与 topic 订阅 每个Consumer 进程都会划归到一个逻辑的Consumer Group中,逻辑的订阅者是Consumer Group.所以一条message ...