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模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样 ...
随机推荐
- Angular ( 一 ) angular的安装
1. 全局安装angular 脚手架工具 npm install -g @angular/cli 2. 打开到创建目录: 3. 创建项目 ng new my-app 4. 打开项目 5. 安装依赖 n ...
- 2017-12-26--mysql(5.6.15),linux下安装使用
本文档的目的是,指导使用者安装.配置.还原所需要用到的mysql数据库.仅提供linux版本服务器的安装说明,且linux版本为64位的Centos6.4.同时,会提供的mysql安装包(MySQL- ...
- Flutter进阶—点击、拖动和其他手势
Flutter中的手势系统有两个层次.第一层具有原始指针事件,其描述了穿过屏幕的指针(例如触摸.鼠标和触控笔)的位置和移动.第二层具有手势,其描述由一个或多个指针移动组成的语义动作. 指针指针代表用户 ...
- MyTests
目录 About Tests Selenium自动化测试 Pyppeteer Explain About Tests 扯淡!测试之瞎扯淡 Selenium自动化测试 什么是Selenium? Sele ...
- mysql批量更新数据
CREATE PROCEDURE `sp_update_temp_data`( out po_returnvalue ) ) leave_top:BEGIN #Routine body goes he ...
- 工作流Activiti入门教程
https://blog.csdn.net/chenweifu365/article/details/79032758/
- Python3 tkinter基础 Radiobutton variable 默认选中的按钮
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 容器中的诊断与分析4——live diagnosis——LTTng
官网地址 LTTng 简介&使用实战 使用LTTng链接内核和用户空间应用程序追踪 简介: LTTng: (Linux Trace Toolkit Next Generation),它是用于跟 ...
- Python - 如何统计序列中元素出现的频次
1.用内置的count()方法,该方法返回子字符串在字符串中出现的次数(同样适用于列表)2.用collections模块的Counter类 示例: from collections import Co ...
- python程序—利用socket监控端口
利用socket监控服务器端口,端口不通时,发邮件提醒 import yagmail #导入yagmail模块 import re #导入re模块,进行正则匹配 import socket #导入so ...