php excel前台导出,ThinkPHP Excel导入导出示例

ThinkPHP官方的帖子感觉写的很含糊,还是借鉴了另外一篇博客http://home.51.com/love0221/diary/item/10053281.html,才跑成功了,其中出了一些小问题,也是通过各种百度才得以解决,分享如下:

一、前期准备

下载PHPExcel包,解压出PHPExcel文件夹和PHPExcel.php文件,放到/ThinkPHP/Extend/Vendor目录下

可以在ThinkPHP同目录下新建一个Public文件夹,在路径/Public/upfile/Excel下存放上传的excel文件

在你的数据库中建一张测试用的表,比如:think_kucun,假设有4个field分别为name1, name2, name3, name4。 二、导入

新建一个模版类,用于上传excel文件:

导入Excel表:

在Action的.class.php文件中实现导入的函数:

public function import(){

if (!empty ( $_FILES ['file_stu'] ['name'])){

$tmp_file = $_FILES ['file_stu'] ['tmp_name'];

$file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );

$file_type = $file_types [count ( $file_types ) - 1];

/*判别是不是.xls文件,判别是不是excel文件*/

if (strtolower($file_type)!="xls" && strtolower($file_type)!="xlsx")

{

$this->error ( '不是Excel文件,重新上传' );

}

/*设置上传路径*/

$savePath = './Public/upfile/Excel/';

//echo $savePath;

/*以时间来命名上传的文件*/

$str = date ('Ymdhis');

$file_name = $str.".".$file_type;

/*是否上传成功*/

if (!copy ($tmp_file,$savePath.$file_name)) {

$this->error ('上传失败');

}

/*读取Excel内容,函数具体实现后文有说明*/

$res = readExcel($savePath.$file_name,"UTF-8",$file_type);

/*重要代码 解决Thinkphp M、D方法不能调用的问题

如果在thinkphp中遇到M 、D方法失效时就加入下面一句代码

*/

spl_autoload_register ( array ('Think', 'autoload' ) );

/*对生成的数组进行数据库的写入*/

foreach ( $res as $k => $v ) {

if ($k != 0) {

$data ['name1'] = $v[0];

$data ['name2'] = $v[1];

$data ['name3'] = $v[2];

$data ['name4'] = $v[3];

$result = M ('kucun')->add($data);

if ($result===false) {

$this->error ('导入数据库失败');

}

}

}

$this->success('导入成功','__URL__/read');

}

}

在工程目录的Common目录下新建common.php文件,实现readExcel()函数,不过实际上xlsx导入会出错,不知道和PHPExcel的版本是不是有关系,还希望解决此问题的网友前来讨论:

function readExcel($file_name,$encode,$file_type)

{

//引用PHPExcel相关类,放在vendor目录下即可如此引用

Vendor("PHPExcel");

Vendor("PHPExcel.IOFactory");

if(strtolower ($file_type)=='xls')//判断excel表类型为2003还是2007

{

Vendor("Excel.PHPExcel.Reader.Excel5");

$objReader = PHPExcel_IOFactory::createReader('Excel5');

}elseif(strtolower ($file_type)=='xlsx')

{

Vendor("Excel.PHPExcel.Reader.Excel2007");

$objReader = PHPExcel_IOFactory::createReader('Excel2007');

}

$objReader->setReadDataOnly(true);

$objPHPExcel = $objReader->load($file_name);

$objWorksheet = $objPHPExcel->getActiveSheet();

$highestRow = $objWorksheet->getHighestRow();

$highestColumn = $objWorksheet->getHighestColumn();

$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

$excelData = array();

for ($row = 1; $row <= $highestRow; $row++) {

for ($col = 0; $col < $highestColumnIndex; $col++) {

$excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();

}

}

return $excelData;

}

导入完毕。

三、导出

在Action的.class.php文件中实现导出的函数:

public function export(){

spl_autoload_register(array('Think','autoload'));

$data= M('kucun')->select(); //查出数据

$name='Excelfile'; //生成的Excel文件文件名

pushExcel($data,$name);

}

在common.php里实现pushExcel():

function pushExcel($data,$name='Excel')

{

/* 导出excel函数*/

Vendor("PHPExcel");

Vendor("PHPExcel.IOFactory");

error_reporting(E_ALL);

date_default_timezone_set('Europe/London');

$xlsTitle = iconv('utf-8','gb2312',$name);//文件名称

$objPHPExcel = new PHPExcel();

/*以下是一些设置 ,什么作者 标题啊之类的*/

$objPHPExcel->getProperties()->setCreator("SEIEE")

->setLastModifiedBy("SEIEE")

->setTitle("Data export")

->setSubject("Data export")

->setDescription("Data Backup")

->setKeywords("excel")

->setCategory("result file");

/*以下就是对处理Excel里的数据, 横着取数据,主要是这一步,其他基本都不要改,这里最好能够做成对$data的遍历*/

foreach($data as $k => $v){

$num=$k+1;

$objPHPExcel->setActiveSheetIndex(0)

//Excel的第A列,uid是你查出数组的键值,下面以此类推

->setCellValue('A'.$num, $v['name1'])

->setCellValue('B'.$num, $v['name2'])

->setCellValue('C'.$num, $v['name3']);

}

$objPHPExcel->getActiveSheet()->setTitle('Sheet1');

$objPHPExcel->setActiveSheetIndex(0);

ob_end_clean(); //清空缓存

header("Pragma: public"); //下面是一堆header的设置,测试的时候加了好多,现在不清楚哪个没用

header("Expires: 0");

header('Content-Type: application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');

header("Content-Type: application/force-download");

header("Content-Type: application/octet-stream");

header("Content-Type: application/download");

header('Content-Disposition: attachment;filename="'.$name.'.xls"');

header('Cache-Control: max-age=0');

header("Content-Transfer-Encoding:binary");

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

$objWriter->save('php://output');

exit;

}

这里注意一个很重要的问题,有些人可能在导出的时候网页出现乱码,是因为php文件有BOM头,所以用notepad++把php文件改成无BOM头编码就OK了,导出时候就会弹出一个对话框,保存即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值