一笑·科奉

ThinkPHP5+PHPExcel实现导入或导出Excel文件功能

作者: 一笑, 写于: 2017-09-20 17:20:40

一、准备

事先安装好:

1、Thinkphp5+

2、Composer如何安装Composer请点这里

在cmd.exe命令窗口,执行如下命令,没出现如下提示,就是没有安装。(如何安装Composer请点这里

composer

image.png

3、确保thinkphp项目目录下有composer.json文件(注:有此文件不代表安装了composer,只是代表thinkphp支持composer安装插件而已。thinkphp5以上版本都会有支持composer,这个特别重要,如果你的项目目录下没有composer.json文件,请重新下载thinkphp5,并覆盖现有文件。)。

image.png

二、安装phpexcel

打开cmd命令行窗口,首先定位到你的项目目录,

image.png

然后执行如下命令:

composer require phpoffice/phpexcel

执行完,返回如下成功提示。(之前就安装过,所以直接读取的缓存)

image.png

如果执行以上语句没有反应,可以更换成中国镜像源再试,更换方法为(Windows/Linux/Mac)执行:

参考:https://pkg.phpcomposer.com/ 

composer config -g repo.packagist composer https://packagist.phpcomposer.com

项目目录的\vendor 文件夹中,已自动多出phpoffice/phpexcel,说明安装成功了。

image.png

三、使用 - 引用

在需使用phpexcel的controller文件头部用use引用phpexcel,代码如下(比如我用默认的controller:Index.php做测试):

打开application\index\controller\Index.php,在其头部增加如下引用:

use PHPExcel_IOFactory;
use PHPExcel;

Index.php代码变为如下:

image.png

然后在Index.php中,增加如下两个方法:

//导出excel
public function download(){}
//读取excel
public function read(){}

至此,准备工作已经完成,接下来就是实际代码实现了。

其实,所有的实现,phpexcel都有相应的简单明了的示例,不用看我下边的代码,去看示例也是极好的。

导出或下载示例:

image.png

四、使用 - 导出Excel

在上一步download方法中增加如下代码:

public function download(){	
	// Create new PHPExcel object
	$objPHPExcel = new PHPExcel();
	
	// Set document properties
	$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
	->setLastModifiedBy("Maarten Balliauw")
	->setTitle("Office 2007 XLSX Test Document")
	->setSubject("Office 2007 XLSX Test Document")
	->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
	->setKeywords("office 2007 openxml php")
	->setCategory("Test result file");
	
	
	// Add some data
	$objPHPExcel->setActiveSheetIndex(0)
	->setCellValue('A1', 'Hello')
	->setCellValue('B2', 'world!')
	->setCellValue('C1', 'Hello')
	->setCellValue('D2', '科奉');
	
	// Miscellaneous glyphs, UTF-8
	$objPHPExcel->setActiveSheetIndex(0)
	->setCellValue('A4', '一笑')
	->setCellValue('A5', 'www.kefong.com');
	
	// Rename worksheet
	$objPHPExcel->getActiveSheet()->setTitle('Simple');
	
	
	// Set active sheet index to the first sheet, so Excel opens this as the first sheet
	$objPHPExcel->setActiveSheetIndex(0);
	
	
	// Redirect output to a client’s web browser (Excel2007)
	header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	header('Content-Disposition: attachment;filename="01simple.xlsx"');
	header('Cache-Control: max-age=0');
	// If you're serving to IE 9, then the following may be needed
	header('Cache-Control: max-age=1');
	
	// If you're serving to IE over SSL, then the following may be needed
	header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
	header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
	header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
	header ('Pragma: public'); // HTTP/1.0
	
	$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
	$objWriter->save('php://output');
	exit;
}

然后在地址栏内输入:http://你的项目地址/index.php/index/index/download/

下载并打开,就看到我们用phpexcel生成的excel文件了。

image.png

五、读取Excel

在上一步增加的read()方法中增加如下代码:

function read(){
	try {
		//判断待读取的excel文件是否存在
		if (!file_exists('test.xlsx')) {
			throw new \Exception('excel file:test.xlsx不存在');
		}
		//声明需要读取excel的格式为excel2007
		$objReader = PHPExcel_IOFactory::createReader('Excel2007');
		//加载excel文件
		$objPHPExcel = $objReader->load('test.xlsx');
		//循环读取每个工作表
		foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
			//输出工作表名
			echo 'Worksheet - ' , $worksheet->getTitle().'<br />';
			//循环当前工作表中的每行数据
			foreach ($worksheet->getRowIterator() as $row) {
				echo '    Row number - ' , $row->getRowIndex().'<br />';
				$cellIterator = $row->getCellIterator();
				$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
				//循环当前行的每一列
				foreach ($cellIterator as $cell) {
					if (!is_null($cell)) {
						echo 'Cell - ' , $cell->getCoordinate() , ' - ' , $cell->getCalculatedValue().'<br />';
					}
				}
				//或者可以直接指定读取当前行的某一列
				echo '当前行的A列:'. $objPHPExcel->getSheet(0)->getCell('A' . $row->getRowIndex())->getValue() .'<br />';
			}
		}
		//直接读取第一个工作表的指定单元格
		echo 'getCellByColumnAndRow(0,1):' . $objPHPExcel->getSheet(0)->getCellByColumnAndRow(0,1)->getValue() . '<br />';
		//获取这样也可以
		echo "getCell('A1'):" . $objPHPExcel->getSheet(0)->getCell('A1')->getValue() . '<br />';
	} catch (Exception $e) {
		throw $e;
	}
}

在测试执行读取以上读取excel方法前,首先要新建一个excel文件放到/public/目录,如下:

image.png

写入如下内容:

image.png

执行:http://项目域名/index.php/index/index/read/,执行后效果如下:

image.png

至此完成了,基本的生成与读取excel的功能。

另外,如需将excel中的数据写入数据库中,可用如下代码:

public function import(){
	try {
		//判断待读取的excel文件是否存在
		if (!file_exists('data.xlsx')) {
			throw new \Exception('excel file:test.xlsx不存在');
		}
		//声明需要读取excel的格式为excel2007
		$objReader = PHPExcel_IOFactory::createReader('Excel2007');
		//加载excel文件
		$objPHPExcel = $objReader->load('data.xlsx');
		//读取默认工作表
		$worksheet = $objPHPExcel->getSheet(0);
		//$allColumn = $worksheet->getHighestColumn();//取得最大的列号
		$allRow = $worksheet->getHighestRow();//取得一共有多少行
		//循环每行数据
		for($i = 0; $i< $allRowas; $i++){
			$data = array();
			$data['name'] = $worksheet->getCell('A'.$i)->getValue();
			$data['value']= $worksheet->getCell('B'.$i)->getValue();
			//写入数据库
			Db::name('table1')->save($data);
		}
	} catch (Exception $e) {
		throw $e;
	}
}

注:测试以上代码时,记得先准备一个excel和数据库哦(我是以thinkphp5已配置好数据库作为前提的哦)

以下是示例代码中用到的excel:

image.png

六、补充说明

phpexcel的功能,不仅如此。我们还可以利用phpexcel:

1、修改指定excel文件,或先导入事先准备好的模板,然后在此基础上增加需要动态生成的内容。参考示例:30template.php

2、插入图片

3、改变单元格样式

等等,可下载其开发手册:https://github.com/PHPOffice/PHPExcel/blob/1.8/Documentation/PHPExcel%20developer%20documentation.doc 

image.png

分类: PHP, 浏览: 2110, 评论: 0
原创文章转载请注明:转自《一笑·科奉》 原文地址:https://www.kefong.com/post/50.html