PHP通过PHPExcel类导入导出excel

 更新时间:2016年11月25日 15:41  点击:1972
PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格

导出类

PHPExcel类导出excel,同时对PHPExcel做了些精简处理,基本上可以满足数据导出excel的功能

代码如下:

<?php

 代码如下 复制代码

//载入PHPExcel类
require './phpexcel/PHPExcel.php';

//创建一个excel对象实例
$objPHPExcel = new PHPExcel();

//设置文档基本属性
$objProps = $objPHPExcel->getProperties();
$objProps->setCreator("Lao Mao");
$objProps->setLastModifiedBy("Lao Mao");
$objProps->setTitle("Office XLS Test Document");
$objProps->setSubject("Office XLS Test Document, Demo");
$objProps->setDescription("Test document, generated by PHPExcel.");
$objProps->setKeywords("office excel PHPExcel");
$objProps->setCategory("Test");

//设置当前的sheet索引,用于后续的内容操作。
//一般只有在使用多个sheet的时候才需要显示调用。
//缺省情况下,PHPExcel会自动创建第一个sheet被设置SheetIndex=0
$objPHPExcel->setActiveSheetIndex(0);

//设置当前活动sheet的名称
$objActSheet = $objPHPExcel->getActiveSheet();
$objActSheet->setTitle('测试Sheet');

//设置单元格内容www.111cn.net
//这里的数据可以从数据库中读取,然后再做循环处理
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'a1');
$objPHPExcel->getActiveSheet()->SetCellValue('A2', 'a2');
$objPHPExcel->getActiveSheet()->SetCellValue('A3', 'a3');
$objPHPExcel->getActiveSheet()->SetCellValue('A4', 'a4');
$objPHPExcel->getActiveSheet()->SetCellValue('A5', 'a5');

$objPHPExcel->getActiveSheet()->SetCellValue('B1', 'b1');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'b2');
$objPHPExcel->getActiveSheet()->SetCellValue('B3', 'b3');
$objPHPExcel->getActiveSheet()->SetCellValue('B4', 'b4');
$objPHPExcel->getActiveSheet()->SetCellValue('B5', 'b5');

$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'c1');
$objPHPExcel->getActiveSheet()->SetCellValue('C2', 'c2');
$objPHPExcel->getActiveSheet()->SetCellValue('C3', 'c3');
$objPHPExcel->getActiveSheet()->SetCellValue('C4', 'c4');
$objPHPExcel->getActiveSheet()->SetCellValue('C5', 'c5');

//输出文档
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);

//设置header头部信息,并输出到浏览器
//header('Content-Type: application/vnd.ms-excel');
//header("Content-Disposition:attachment; filename=demo.xls");
//header('Cache-Control: max-age=0');
//$objWriter->save('php://output');

//保存至某一位置
$objWriter->save(dirname(__FILE__) . '/demo.xls');


 

导入excel的方法:

 代码:

 代码如下 复制代码

<?php
//载入PHPExcel类
include(dirname(__FILE__).'/phpexcel/PHPExcel.php');

$Obj = new PHPExcel_Reader_Excel5();
$Obj->setReadDataOnly(true);

//读取demo.xls文件
$phpExcel = $Obj->load(dirname(__FILE__).'/output.xls');

//获取当前活动sheet
$objWorksheet = $phpExcel->getActiveSheet();

//获取行数
$highestRow = $objWorksheet->getHighestRow();

//获取列数
$highestColumn = $objWorksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

//循环输出数据 www.111cn.net
$data = array();
for($row = 1; $row <= $highestRow; ++$row) {
 for($col = 0; $col < $highestColumnIndex; ++$col) {
  $val = $objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
  $data[$row][$col] = trim($val);
 }
}

echo '<pre>';
print_r($data);
echo '</pre>';

但是这种方式有缺陷,老版本的excel有个数据上限,最多65536行数据,这时我们就无法通过excel来实现大数据的导出, 但我估计也没几个有这么我数据吧,当然如果有可以考虑使用csv来操作

Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度

PHP扩展下载:https://github.com/krakjoe/pthreads

PHP手册文档:http://php.net/manual/zh/book.pthreads.php

在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:

 代码如下 复制代码

<?php
include 'include/CurlLoad.class.php'; // 引入读取库
/**
 * 多线程抓取内容
 * @param array $url 待抓取URL列表集合
 * @return 成功返回指定内容,失败返回NULL
 */
function vget($url) {
 $ret = BaiduSRLinksGet ( $url, 1 ); // 获取结果列表地址
 if ($ret != null) {
  if (array_key_exists ( "links", $ret )) {
   $infos = array ();
   $number = count ( $ret ['links'] );
   for($i = 0; $i < $number; $i ++) {//循环创建线程对象
    $thread_array [$i] = new baidu_thread_run ( $ret ['links'] [$i] );
    $thread_array [$i]->start ();
   }
   foreach ( $thread_array as $thread_array_key => $thread_array_value ) {//检查线程是否执行结束
    while ( $thread_array [$thread_array_key]->isRunning () ) {
     usleep ( 10 );
    }
    if ($thread_array [$thread_array_key]->join ()) {//如果执行结束,取出结果
     $temp = $thread_array [$thread_array_key]->data;
     if ($temp != null)
      $infos ['res'] [] = $temp;
    }
   }
   $infos ['pages'] = $ret ['pages'];
   $infos ['status'] = "1";
  } else
  $infos = null;
 } else
  $infos = null;
 return $infos;
}
/**
 * 获取百度搜索结果列表URL
 *
 * @param string $url
 *         搜索结果页URL
 * @param int $format
 *         默认$format=0,获取默认地址;$format=1获取跳转后真实地址
 * @return NULL multitype:array()
 */
function BaiduSRLinksGet($url, $format = 0) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  preg_match_all ( "/"url":"(?<links>.*)"}/", $html, $rets ); // 搜索结果链接筛选
  if (! array_key_exists ( 'links', $rets )) // 如果数组中不包含Links键名,表示获取失败
   return null;
  $ret = array ();
  if ($format == 1) {
   $number = count ( $rets ['links'] );
   for($i = 0; $i < $number; $i ++) {
    $headr_temp = CurlLoad::Get_Headers ( $rets ['links'] [$i], 1 ); // 通过headr获取真实地址
    if (array_key_exists ( "Location", $headr_temp ))
     $ret ['links'] [$i] = $headr_temp ['Location'];
    else
     $ret ['links'] = $rets ['links'];
   }
  } else
   $ret ['links'] = $rets ['links'];
  preg_match_all ( '/href="?/s?wd=site%3Apan.baidu.com%20(?<url>.+?)&ie=utf-8">/', $html, $out );
  unset ( $out ['url'] [0] );
  $number = count ( $out ['url'] );
  for($i = 1; $i < $number; $i ++) {
   preg_match_all ( '/&pn=(.*)/', $out ['url'] [$i], $temp );
   $ret ['pages'] [$temp [1] [0] / 10] = base64_encode ( $out ['url'] [$i] );
  }
  return $ret;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
/**
 * 百度网盘资源信息获取
 *
 * @param string $url
 *         网盘资源页URL
 * @return NULL array
 */
function PanInfoGet($url) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  if (preg_match_all ( "/文件名:(?<name>.*) 文件大小:(?<size>.*) 分享者:(?<user>.*) 分享时间:(?<date>.*) 下载次数:(?<number>[0-9]+)/", $html, $ret ) == 0)
   return null;
  $rets ['name'] = $ret ['name'] [0];
  $rets ['size'] = $ret ['size'] [0];
  $rets ['user'] = $ret ['user'] [0];
  $rets ['date'] = $ret ['date'] [0];
  $rets ['number'] = $ret ['number'] [0];
  $rets ['link'] = $url;
  return $rets;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
function WriteLog($str) {
 $file = fopen ( "../error.log", "a+" );
 fwrite ( $file, "Warning:" . date ( "Y/m/d H:i:s" ) . ":" . $str . "rn" );
 fclose ( $file );
}
/**
 * 多线程抓取对象
 * @author MuXi
 *
 */
class baidu_thread_run extends Thread {
 public $url;
 public $data;
 public function __construct($url) {
  $this->url = $url;
 }
 public function run() {
  if (($url = $this->url)) {
   $this->data = PanInfoGet ( $url );//线程执行方法
  }
 }
}
?>

下面我来给各位同学简单的分享两个利用php操作csv格式文件的例子,一个是对csv输出下载,另一个是利用php的fgetcsv函数、fputcsv函数进行读写操作。

导入、导出CSV文件

 代码:

 代码如下 复制代码

class csv
{
 private $resource;

 /**
  * @param string $fileName 文件路径
  * @param string $mode     文件访问类型:w:写入、r:只读
  */
 public function __construct($fileName, $mode)
 {
  $this->resource = fopen($fileName, $mode);
 }

 public function __destruct()
 {
  fclose($this->resource);
 }

 /**
  * 导入CSV www.111cn.net
   * @param array $data
  * @return int
  */
 public function export($data)
 {
  fputcsv($this->resource, $data);
 }

 /**
  * 导出CSV
  * @return array
  */
 public function import()
 {
  $tmp = array();
  while($data = fgetcsv($this->resource))
  {
   $tmp[] = $data;
  }

  return $tmp;
 }
}

这里我们主要用到了php fgetcsv函数、fputcsv函数。


CSV文件下载

 代码如下 复制代码

function exportUserTask()
{
 //获取数据库数据
 /*
  * $result = array(
  *   array(value1,value2,value3,value4,value5,value6),
  *   array(value1,value2,value3,value4,value5,value6),
  * );
  */

 $handle = fopen('php://output', "w");
 header('Content-Type: application/csv');
 header('Content-Disposition: attachment; filename="test.csv"');

 //表头 www.111cn.net
 fputcsv($handle, array('用户UID', '用户名', '进行中', '已完成', '已失败', '总计'));

 foreach($result as $value)
 {
  fputcsv($handle, $value);
 }

 fclose($handle);
}

需要提醒的是在导入、导出数据过程注意中文乱码问题,这主要是数据编码格式问题,使用过程根据实际情况对数据进行转码。

下面我们一起来看一个PHP模拟QQ登录,发送和接收信息的例子,希望此例子对各位同学会有所帮助。
 代码如下 复制代码


<?php
header(‘Content-type: text/html; charset=utf-8′);
$sid = qqLogin(‘发送信息的QQ’,'发送信息的QQ密码’);   //登录帐号
sendMsg($sid,’接收信息的QQ’,'聊天内容’);            //发送消息

$data = getMsg($sid,’接收信息的QQ’);               //获取和某个帐号的聊天记录

if(!empty($data)){
foreach($data as $v){
echo $v['title'].’<br />’;
echo $v['msg'].’<br />’;
echo ‘————————<br />’;
}
}

function qqLogin($qq_num,$qq_pwd){                //登录帐号
$data = httpGet(‘http://pt.3g.qq.com/’);
$action = preg_match(“/action=”(.+)?”/”, $data, $matches);
$action = $matches[1];
$params = array();
$params["login_url"] = ‘http://pt.3g.qq.com/s?aid=nLogin’;
$params["sidtype"] = 1;
$params["loginTitle"] = ‘手机腾讯网’;
$params["bid"] = 0;
$params["qq"] = $qq_num;
$params["pwd"] = $qq_pwd;
$params["loginType"] =1;
$data = httpPost($action, $params,1);
$action = preg_match(“/sid=(.+?)&/”, $data, $matches);
$sid = $matches[1];
if($sid){
return $sid;
}else {
echo ‘登录失败’;
}
}

function sendMsg($sid,$to_num,$msg){            //发送消息
$params = array();
$params["msg"] = $msg;
$params["u"] = $to_num;
$params["saveURL"] = 0;
$params["do"] = “send”;
$params["on"] = 1;
$params["aid"] = “发送”;
$url = “http://q16.3g.qq.com/g/s?sid=” . $sid;
$data = httpPost($url, $params);
if(preg_match(‘/消息发送成功/’,$data)) echo ‘发送成功<br />’;
else  echo ‘发送失败’;

}

function getMsg($sid,$qq_num) {                    //获取消息
$url = “http://q16.3g.qq.com/g/s?sid=” . $sid . “&u=” . $qq_num . “&saveURL=0&aid=nqqChat”;
$data = httpGet($url);
preg_match_all(‘/<div class=”main-module bm-gray”>s+<p class=”(?:ft-s-gray|ft-s ft-cl2)”>(.+?)</p>s+<p>(.+?)</p></div>/s’,str_replace(“rn”,”",$data),$m);
foreach($m[1] as $k=>$v){
$tmp['title']=$v;
$tmp['msg']=$m[2][$k];
$r[]=$tmp;
}
return $r;
}

function httpGet($url,$header=0){                //GET请求
$opt = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => $header,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT=>’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13′
);
return curlRun($opt);
}

function httpPost($url,$data,$header=0){         //POST请求
$opt = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => $header,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_USERAGENT=>’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13′
);
return curlRun($opt);
}

function curlRun($opt){
$ch = curl_init();
curl_setopt_array($ch,$opt);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}

?>

字节换算功能函数就是把kb转换在mb,gb,tg,eb,pb之类的单位,这个对于我们文件上传是非常的有用的,下面给各位分享一个函数。
 代码如下 复制代码

//字节换算
function conversion($size) {
$kb = 1024; // 1KB(Kibibyte,千字节)=1024B,
$mb = 1024 * $kb; //1MB(Mebibyte,兆字节,简称“兆”)=1024KB,
$gb = 1024 * $mb; // 1GB(Gigabyte,吉字节,又称“千兆”)=1024MB,
$tb = 1024 * $gb; // 1TB(Terabyte,万亿字节,太字节)=1024GB,
$pb = 1024 * $tb; //1PB(Petabyte,千万亿字节,拍字节)=1024TB,
$fb = 1024 * $pb; //1EB(Exabyte,百亿亿字节,艾字节)=1024PB,
$zb = 1024 * $fb; //1ZB(Zettabyte,十万亿亿字节,泽字节)= 1024EB,
$yb = 1024 * $zb; //1YB(Yottabyte,一亿亿亿字节,尧字节)= 1024ZB,
$bb = 1024 * $yb; //1BB(Brontobyte,一千亿亿亿字节)= 1024YB
 
if ($size &lt; $kb) {
return $size . " B";
} else if ($size &lt; $mb) {
return round($size / $kb, 2) . " KB";
} else if ($size &lt; $gb) {
return round($size / $mb, 2) . " MB";
} else if ($size &lt; $tb) {
return round($size / $gb, 2) . " GB";
} else if ($size &lt; $pb) {
return round($size / $tb, 2) . " TB";
} else if ($size &lt; $fb) {
return round($size / $pb, 2) . " PB";
} else if ($size &lt; $zb) {
return round($size / $fb, 2) . " EB";
} else if ($size &lt; $yb) {
return round($size / $zb, 2) . " ZB";
} else {
return round($size / $bb, 2) . " YB";
}
 
}
[!--infotagslink--]

相关文章

  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • 详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)

    这篇文章主要介绍了在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • C# 导出Excel的6种简单方法实现

    C# 导出 Excel 的6种简单方法:数据表导出到 Excel,对象集合导出到 Excel,数据库导出到 Excel,微软网格控件导出到 Excel,数组导出到 Excel,CSV 导出到 Excel,你都会了吗?需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • R语言导入导出数据的几种方法汇总

    这篇文章主要给大家总结介绍了R语言导入导出数据的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
  • phpexcel导入xlsx文件报错xlsx is not recognised as an OLE file 怎么办

    phpexcel是一款php读写excel的插件了,小编有一个这样的功能要来实现,但是在导入xlsx时发现xlsx is not recognised as an OLE file 了,但是导入xls是没有问题了,碰到这种...2016-11-25
  • C#数据导入到EXCEL的方法

    今天小编就为大家分享一篇关于C#数据导入到EXCEL的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
  • 让C# Excel导入导出 支持不同版本Office

    让C# Excel导入导出,支持不同版本的Office,感兴趣的小伙伴们可以参考一下...2020-06-25
  • java导出csv格式文件的方法

    这篇文章主要为大家详细介绍了java导出csv格式文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-12-31
  • Go 自定义package包设置与导入操作

    这篇文章主要介绍了Go 自定义package包设置与导入操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • Vue通过Blob对象实现导出Excel功能示例代码

    这篇文章主要介绍了Vue通过Blob对象实现导出Excel功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-01
  • php中使用PHPExcel操作excel(xls)文件

    PHPExcel是php的一个插件,它可以实现读取excel文件也就是xls文件了,下面我们就来看一个PHPExcel操作excel(xls)文件例子,希望能帮助到各位。 读取中文的xls、csv文件...2016-11-25
  • C#导出数据到excel如何提升性能

    这篇文章主要介绍了C#导出数据到excel如何提升性能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-13
  • C# Winform实现导入和导出Excel文件

    这篇文章主要为大家详细介绍了C# Winform实现导入和导出Excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • PHP导入导出Excel文件的方法

    下面我来给大家介绍在php中操作excel两个实例,一个是利用PHP-ExcelReader导入excel并输出,另一种是直接输入excel并导出,下面看实例。 借助PHP-ExcelReader这个开...2016-11-25
  • php利用ExcelFileParser把excel导入数据库

    这是一款实用的php教程利用excelfileparser把excel导入数据库教程哦。 代码如下 复制代码 <!doctype html public "-//w3c//dtd xhtml 1.0 transi...2016-11-25
  • 基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理

    在很多系统模块里面,我们可能都需要进行一定的数据交换处理,这样可以很好的达到用户操作体验感,接下来通过本文给大家介绍基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理相关知识,非常具有参考价值,感兴趣的朋友一起学习吧...2016-05-14
  • mysql导出查询结果到csv的实现方法

    下面小编就为大家带来一篇mysql导出查询结果到csv的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-26
  • SQL导出到MYSQL的简单方法

      从sql导出到mysql的方法很多,现介绍一种无需编程,直接利用sql和mysql里的图形界面进行导入导出的简单方法。   前提是已经安装了sqlserver客户端和mysql的图形界...2016-11-25
  • 纯JS将table表格导出到excel的方法

    这篇文章主要介绍了纯JS将table表格导出到excel的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-10-01
  • MySQL 导出数据为csv格式的方法

    方案有很多种,我这里简单说一下:1. into outfile复制代码 代码如下: SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY...2015-10-23