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文件:
<form method="post" action="__URL__/import" enctype="multipart/form-data">
<h3>导入Excel表:</h3><input type="file" name="file_stu" />
<input type="submit" value="导入" />
</form>
在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');
}
}
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了,导出时候就会弹出一个对话框,保存即可。