1. 程式人生 > >總結了下PHPExcel官方讀取的幾個例子

總結了下PHPExcel官方讀取的幾個例子

1.使用 PHPExcel_IOFactory 讀取檔案
	$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);		
2.使用一個特定的讀取類,讀取檔案
	$objReader = new PHPExcel_Reader_Excel5();					
	objPHPExcel = $objReader->load($inputFileName);
3.使用 PHPExcel_IOFactory 建立一個特定的讀取類
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);	
	$objPHPExcel = $objReader->load($inputFileName);
	讀取型別有:
		$inputFileType = 'Excel5';
		$inputFileType = 'Excel2007';
		$inputFileType = 'Excel2003XML';
		$inputFileType = 'OOCalc';
		$inputFileType = 'SYLK';
		$inputFileType = 'Gnumeric';
		$inputFileType = 'CSV';


4.使用 PHPExcel_IOFactory 來鑑別檔案應該使用哪一個讀取類
	$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objPHPExcel = $objReader->load($inputFileName);
5.只讀去資料,忽略裡面各種格式等(對於Excel讀去,有很大優化)
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setReadDataOnly(true);
	$objPHPExcel = $objReader->load($inputFileName);
6.載入Excel所有的工作表
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setLoadAllSheets();		// 載入所有的工作表
	$objPHPExcel = $objReader->load($inputFileName);
	$objPHPExcel->getSheetCount();		// 獲取工作表的個數
	$objPHPExcel->getSheetNames();		// 獲取所有工作表的名字陣列
7.載入單個的命名的工作表
	$sheetname = 'Data Sheet #2';		// 單個工作表,傳入字串
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setLoadSheetsOnly($sheetname);		// 載入單個工作表,傳入工作表名字(例如:'Data Sheet #2')
	$objPHPExcel = $objReader->load($inputFileName);
8.載入多個命名的工作表
	$sheetnames = array('Data Sheet #1', 'Data Sheet #2');		// 多個工作表,傳入陣列
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setLoadSheetsOnly($sheetnames);		// 載入多個工作表,傳入工作表名字陣列
	$objPHPExcel = $objReader->load($inputFileName);
9.自定義一個讀去過濾器
	class MyReadFilter implements PHPExcel_Reader_IReadFilter
	{
		public function readCell($column, $row, $worksheetName = '') {


			// 只讀去1-7行&A-E列中的單元格
			if ($row >= 1 && $row <= 7) {
				if (in_array($column,range('A','E'))) {
					return true;
				}
			}
			return false;
		}
	}
	$filterSubset = new MyReadFilter();
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setReadFilter($filterSubset);		// 設定例項化的過濾器物件
	$objPHPExcel = $objReader->load($inputFileName);
10.同樣是自定義一個讀去過濾器,但可配置讀去的行和列範圍
	class MyReadFilter implements PHPExcel_Reader_IReadFilter
	{
		private $_startRow = 0;		// 開始行
		private $_endRow = 0;		// 結束行
		private $_columns = array();	// 列跨度
		public function __construct($startRow, $endRow, $columns) {
			$this->_startRow	= $startRow;
			$this->_endRow		= $endRow;
			$this->_columns		= $columns;
		}
		public function readCell($column, $row, $worksheetName = '') {
			if ($row >= $this->_startRow && $row <= $this->_endRow) {
				if (in_array($column,$this->_columns)) {
					return true;
				}
			}
			return false;
		}
	}
	$filterSubset = new MyReadFilter(9,15,range('G','K'));
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setReadFilter($filterSubset);		// 設定例項化的過濾器物件
	$objPHPExcel = $objReader->load($inputFileName);
11.分塊讀取Excel,原理還是:自定義讀取過濾器
	class chunkReadFilter implements PHPExcel_Reader_IReadFilter
	{
		private $_startRow = 0;		// 開始行
		private $_endRow = 0;		// 結束行
		public function __construct($startRow, $chunkSize) {	// 我們需要傳遞:開始行號&行跨度(來計算結束行號)
			$this->_startRow	= $startRow;
			$this->_endRow		= $startRow + $chunkSize;
		}
		public function readCell($column, $row, $worksheetName = '') {
			if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
				return true;
			}
			return false;
		}
	}
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$chunkSize = 20;	// 定義每塊讀去的行數


	// 就可在一個迴圈中,多次讀去塊,而不用一次性將整個Excel表讀入到記憶體中
	for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
		$chunkFilter = new chunkReadFilter($startRow, $chunkSize);
		$objReader->setReadFilter($chunkFilter);	// 設定例項化的過濾器物件
		$objPHPExcel = $objReader->load($inputFileName);
		// 開始讀取每行資料,並插入到資料庫
	}
12.分塊讀取Excel的第2個版本
	class chunkReadFilter implements PHPExcel_Reader_IReadFilter
	{
		private $_startRow = 0;		// 開始行
		private $_endRow = 0;		// 結束行


		// 定義了一個讀去指定範圍行的方法
		public function setRows($startRow, $chunkSize) {
			$this->_startRow	= $startRow;
			$this->_endRow		= $startRow + $chunkSize;
		}
		public function readCell($column, $row, $worksheetName = '') {
			if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
				return true;
			}
			return false;
		}
	}
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$chunkSize = 20;	// 定義每塊讀去的行數


	// 在迴圈外部,例項化過濾器類,而不用迴圈內每次例項化(應該更優化)
	$chunkFilter = new chunkReadFilter();
	$objReader->setReadFilter($chunkFilter);
	for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {


		// 迴圈內部,使用例項化的物件的方法,來調整讀取的行範圍即可
		$chunkFilter->setRows($startRow,$chunkSize);
		$objPHPExcel = $objReader->load($inputFileName);
	}
13.讀取多個CSV檔案
	$inputFileNames = array('./sampleData/example1.csv','./sampleData/example2.csv');	// CSV檔案陣列
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);


	/*
		說明下面是幹啥的:
			1.先載入第一個CSV作為第一個工作表 | 設定工作表的標題
			2.依次將多個CSV再入到 objPHPExcel 物件中,依次追加到第N個工作表 | 設定工作表的標題
			3.獲取Excel此時所有的標題,通過標題來依次獲取工作表,然後對工作表進行操作!
	 */
	$inputFileName = array_shift($inputFileNames);		// 第一個CSV檔案
	$objPHPExcel = $objReader->load($inputFileName);	// 讀取第一個CSV檔案
	$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));	// 設定標題
	foreach($inputFileNames as $sheet => $inputFileName) {
		$objReader->setSheetIndex($sheet+1);	// 將工作表切換到下個工作表
		$objReader->loadIntoExisting($inputFileName,$objPHPExcel);		// 將下一個CSV檔案,載入到已存在的PHPExcel物件中
		$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));		// 設定當前工作表的標題
	}


	// 迴圈所有的工作表名稱
	$loadedSheetNames = $objPHPExcel->getSheetNames();
	foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
		$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);		// 通過 '工作表名稱' 來設定當前工作表為啟用狀態
		// 接著對當前啟用的工作表,進行讀取、資料庫寫入
	}
14.將一個大的CSV檔案,按 '塊' 分成多個工作表(結合了12&13的示例)
	class chunkReadFilter implements PHPExcel_Reader_IReadFilter
	{
		private $_startRow = 0;		// 開始行
		private $_endRow = 0;		// 結束行


		// 定義了一個讀去指定範圍行的方法
		public function setRows($startRow, $chunkSize) {
			$this->_startRow	= $startRow;
			$this->_endRow		= $startRow + $chunkSize;
		}
		public function readCell($column, $row, $worksheetName = '') {
			if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
				return true;
			}
			return false;
		}
	}
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$chunkSize = 100;	// 定義每塊讀去的行數


	// 在迴圈外部,例項化過濾器類,而不用迴圈內每次例項化(應該更優化)
	$chunkFilter = new chunkReadFilter();
	$objReader->setReadFilter($chunkFilter)
			  ->setContiguous(true);		// 這裡出現了一個沒見過的方法(先放著,忘記是幹啥的了)


	$objPHPExcel = new PHPExcel();
	$sheet = 0;		// 第一個工作表下標
	for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
		$chunkFilter->setRows($startRow,$chunkSize);
	    $objReader->setSheetIndex($sheet);		// 切換工作表
	    $objReader->loadIntoExisting($inputFileName,$objPHPExcel);		// 將讀取到的CSV塊,載入到工作表
	    $objPHPExcel->getActiveSheet()->setTitle('Country Data #'.(++$sheet));		// 設定工作表標題
	}


	// 迴圈所有的工作表名稱
	$loadedSheetNames = $objPHPExcel->getSheetNames();
	foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
		$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);		// 通過 '工作表名稱' 來設定當前工作表為啟用狀態
		// 接著對當前啟用的工作表,進行讀取、資料庫寫入
	}


15.使用 'Advanced Value Binder' 讀取通過 'tab' 分隔值的檔案
	PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );		// 設定單元格
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$objReader->setDelimiter("\t");		// 設定分隔符為 '\t'(tab分隔)
	$objPHPExcel = $objReader->load($inputFileName);
	$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));	// 設定標題
	$loadedSheetNames = $objPHPExcel->getSheetNames();		// 獲取所有工作表名稱


	1)格式化輸出
	foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
		$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
		$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);	// 注意4個引數的區別
	}
	2)未格式化輸出
	foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
		$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
		$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,false,true);	// 注意4個引數的區別
	}
	3)單元格原生值
	foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
		$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
		$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true);	// 注意4個引數的區別
	}
16.使用 'try/catch' 控制Excel載入時的異常
	try {
		$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
	} catch(PHPExcel_Reader_Exception $e) {
		die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
	}
17.獲取Excel的工作表名稱列表
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$worksheetNames = $objReader->listWorksheetNames($inputFileName);		// 列出工作表名稱
	foreach($worksheetNames as $worksheetName) {
		echo $worksheetName,'<br />';
	}
18.不載入整個檔案,或者Excel的工作表名稱列表
	$objReader = PHPExcel_IOFactory::createReader($inputFileType);
	$worksheetData = $objReader->listWorksheetInfo($inputFileName);			// 列出工作表列表
	foreach ($worksheetData as $worksheet) {
		echo '<li>', $worksheet['worksheetName'], '<br />';
		echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '<br />';
		echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows'];
		echo '</li>';
	}
19.全程,有一個方法:
	$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true);
	getActiveSheet() - 獲取當前啟用的工作表
	toArray() - 將當前啟用的工作表,解析全部放入陣列中