Yii2使用PHPExcel讀取excel

來源:互聯網
上載者:User
個人使用過程中儲存一些使用PHPExcel的經驗,以便後來翻閱:
與PHP的Yii架構結合,可以便於使用。而且根本不用網上所說的修改Yii的自動負載檔案等方法。
具體使用方法:
下載phpoffice http://phpexcel.codeplex.com/releases/view/119187
下載後首級目錄結構是 Classes, Documentation, Examples, changelog.txt, install.txt, license.txt.
下載後要做的就是讓Yii載入PHPExcel. lele模仿yii2-swiftmailer的載入方式,修改項目根路徑下的composer.json, 在"require"中加入"phpoffice/phpexcel": "dev-develop",然後用命令列進入根目錄,執行composer update, (好像不用手動下載phpexcel,composer會自動下好。。。)完成後可以在php中使用$PHPExcel = new \PHPExcel();來得到一個執行個體。切記,new時一定要加\, 不然會報類找不到的錯誤(lele不知道為什麼要加\, 有誰知道請在評論裡說一下)。
OK, 能用了之後呢,寫一些使用的代碼:
$filePath = "../file/test.xlsx"; // 要讀取的檔案的路徑
$PHPExcel = new \PHPExcel(); // 拿到執行個體,待會兒用
$PHPReader = new \PHPExcel_Reader_Excel2007(); // Reader很關鍵,用來讀excel檔案
if (!$PHPReader->canRead($filePath)) { // 這裡是用Reader嘗試去讀檔案,07不行用05,05不行就報錯。注意,這裡的return是Yii架構的方式。
$PHPReader = new \PHPExcel_Reader_Excel5();
if (!$PHPReader->canRead($filePath)) {
$errorMessage = "Can not read file.";
return $this->render('error', ['errorMessage' => $errorMessage]);
}
}
$PHPExcel = $PHPReader->load($filePath); // Reader讀出來後,載入給Excel執行個體
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
以上就可以讀excel了,下面遍曆輸出這個二維表格。PHPExcel的方法名字比較語義化。
$allSheet = $PHPExcel->getSheetCount(); // sheet數
$currentSheet = $PHPExcel->getSheet(0); // 拿到第一個sheet(活頁簿?)
$allColumn = $currentSheet->getHighestColumn(); // 最高的列,比如AU. 列從A開始
$allRow = $currentSheet->getHighestRow(); // 最大的行,比如12980. 行從0開始
$result = new ReadFileResult(); // result是我自己寫的一個存放結果的實體類
for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
echo $currentRow;
$lineVal = [];
for ($currentColumn="A"; $currentColumn <= $allColumn; $currentColumn++) {
$val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue(); // ord把字母轉為ascii碼,A->65, B->66....這兒的坑在於AU->65, 後面的U沒有計算進去,所以用索引方式遍曆是有缺陷的。
array_push($lineVal, $val);
}
array_push($result->content, $lineVal);
}
看開發文檔發現,還有兩個非常好用的遍曆方式。
一,用toArray把這個sheet轉為二維數組。
$currentSheet->getStyle('A2:A6')->getNumberFormat()->setFormatCode('yyyy-mm-dd'); // 轉為A2到A6的時間格式
$result->content = $currentSheet->toArray('', true, true); // 把當前sheet轉為二維數組
二,用PHPExcel內建的行列迭代器。這樣會穩妥許多。
foreach ($currentSheet->getRowIterator() as $row) { // 行迭代器
$cellIterator = $row->getCellIterator(); // 拿到行中的cell迭代器
$cellIterator->setIterateOnlyExistingCells(false); // 設定cell迭代器,遍曆所有cell,哪怕cell沒有值
$lineVal = [];
foreach ($cellIterator as $cell) {
if ($cell->getDataType() == \PHPExcel_Cell_DataType::TYPE_NUMERIC) { // 這裡是比較cell中資料類型是不是number
$cellStyleFormat = $cell->getStyle( $cell->getCoordinate() )->getNumberFormat(); // 接下來這兩句是拿到這個number的格式
$formatCode = $cellStyleFormat->getFormatCode(); // 如果是普通的數字,formatCode將為General, 如果是如6/12/91 12:00的時間格式,formatCode將為/d/yy h:mm(反正就是時間格式了)
echo $cell->getCoordinate() . " " . $formatCode; echo "
";
if (preg_match("/m\/d\/yy h:mm/i", $formatCode)) {
$value = gmdate("Y-m-d H:i:s", \PHPExcel_Shared_Date::ExcelToPHP($cell->getValue())); // 這裡是將Excel的時間按格式轉為PHP的時間
} else {
$value = $cell->getValue();
}
} else {
$value = $cell->getValue();
}
if ($cell->getColumn() == 'I') { // 拿到列座標
$value = "0" . $value;
}
array_push($lineVal, $value . " " . $cell->getColumn());
}
array_push($result->content, $lineVal);
}
lele從yanhui_wei同學一篇文章看到了TA對PHPExcel類及方法的總結,寫的不錯,特摘抄下來:

對於常見的excel報表操作,我們需要掌握如下幾個類庫就可以了:
(1)PHPExcel:活頁簿對象
excel文檔處理對象主要用來管理我們的excel文檔,怎麼來管理(通過屬性和方法來管理)?大家知道,類主要是由屬性和方法來組成,通過php程式的手段來管理excel文檔,其實就是通過本對象的屬性和方法來管理,下面我們就來看一下PHPExcel類中都有那些屬性和方法,這些屬性和方法主要用來管理excel文檔的那些方面
getProperties():獲得當前活動狀態工作表的屬性對象,返回屬性對象
getActiveSheet():獲得當前活動狀態的工作表,返回工作表對象
getActiveSheetIndex():獲得當前活動狀態工作表的索引值,返回int
setActiveSheetIndex():設定當前活動狀態工作表的索引,返回工作表對象
getSheetByName():通過工作表名稱得到當前工作表對象,返回工作表對象
getDefaultStyle():獲得excel文檔預設的樣式(所有工作表的樣式),返回樣式對象
createSheet():在當前使用中工作表後建立一個新的工作表
getSheetCount():獲得excel文檔中工作表的數量,返回int
getSheetNames():獲得excel文檔中所有工作表名稱組成的數組
(2)PHPExcel_Worksheet:工作表對象
工作表對象,主要用來管理我們的工作表,怎麼管理?也是通過屬性和方法來管理,但是工作表對象大部分情況下可通過excel文檔對象來擷取
toArray():把工作表中的資料轉換成數組
fromArray():從數組中擷取資料填充到工作表,返回工作表對象
getCell():獲得單元格對象
getCellByColumnAndRow():通過列索引和行索引獲得指定單元格,返回單元格對象
getDefaultStyle():獲得工作表預設的樣式,返回樣式對象
getHighestColumn():獲得工作表的最大列,返回列的名稱
getColumnDimension():獲得當前列
getStyle():獲得指定單元格的樣式,返回樣式對象
getParent():獲得父類對象,返回excel文檔對象
getTitle():獲得工作表的標題或名稱,返回字串類型
setCellValue():設定單元格的值,返回工作表對象或單元格對象,完全取決於參數的值
setCellValueByColumnAndRow():通過列索引和行索引設定單元格的值,傳回型別同上
setCellValueExplicit():設定單元格的值,並顯示指定資料類型,返回工作表對象
setCellValueExplicitByColumnAndRow():通過列和行索引設定單元格值
setTitle():設定工作表標題
(3)PHPExcel_Cell:單元格對象

(4)PHPExcel_Style:樣式對象,主要用來設定單元格的樣式:對齊、字型、邊框、填充等,跟我們之前學過的css樣式差不多,在這裡如果想要設定對齊、字型大小、邊框顏色、等等都是通過樣式對象來完成的
getActiveCell():獲得當前活動的單元格的名稱,返回string;如,A1
getActiveSheet():獲得當前活動的工作表,返回工作表對象
getAlignment():獲得對齊對象,返回對齊對象
getBorders():獲得邊框對象,返回邊框對象
getFill():獲得填充對象
getFont():獲得字型對象
setFont():設定字型,返回樣式對象
(5)PHPExcel_Style_Alignment:對齊對象
getHorizontal():獲得水平置中方式
getVertical():獲得垂直置中方式
setHorizontal():設定水平置中方式,返回對齊對象
setVertical():設定垂直置中方式,返回對齊對象
置中方式:
HORIZONTAL_CENTER
HORIZONTAL_CENTER_CONTINUOUS
HORIZONTAL_GENERAL
HORIZONTAL_JUSTIFY
HORIZONTAL_LEFT
HORIZONTAL_RIGHT
VERTICAL_BOTTOM
VERTICAL_CENTER
VERTICAL_JUSTIFY
VERTICAL_TOP
(6)PHPExcel_Style_Font:字型對象
setBold():設定字型加粗
setColor():設定字型顏色
setItalic():設定字型傾斜
setName():設定字型名
setSize():設定字型大小
setUnderline():設定字型底線
(7)PHPExcel_Writer_Excel5:寫操作對象,主要用來輸出xls檔案
save(活頁簿檔案名稱):將活頁簿對象中的資料儲存到一個活頁簿檔案中
(8)PHPExcel_Writer_Excel2007:寫操作對象,主要用於輸出xlsx檔案
save(活頁簿檔案名稱):將活頁簿對象中的資料儲存到一個活頁簿檔案中
(9)PHPExcel_Reader_Excel5:讀操作對象,主要用於輸入xls檔案
canRead():當前reader對象是否能夠讀活頁簿檔案
load():從一個活頁簿檔案中載入活頁簿對象,也就是將活頁簿檔案中的資料載入到活頁簿對象中來管理
(10)PHPExcel_IOFactory:讀寫操作對象
createReader():根據參數的不同,建立不同的讀對象:主要作用是讀取活頁簿檔案中的資料
createWriter():根據參數的不同,返回不同的寫對象:主要作用是將PHPExcel活頁簿對象中的資料寫入到一個活頁簿檔案中
load():從活頁簿檔案中載入PHPExcel活頁簿對象,即:將活頁簿檔案中資料載入到PHPExcel活頁簿對象中來管理
PHPExcel對象:是一個活頁簿對象
include_once "PHPExcel/Writer/Excel5.php";//主要用於其它低版本,且檔案名稱尾碼為xls的檔案,如果我們希望產生尾碼名為xls格式的excel檔案,建議引入此類庫
include_once "PHPExcel/Writer/Excel2007.php";//主要用於excel2007格式,檔案名稱尾碼為xlsx的excel檔案,如果我們希望產生尾碼名為xlsx格式的excel檔案,建議引入此類庫
$objWriter = new PHPExcel_Writer_Excel5($objExcel);//建立一個檔案格式寫入對象執行個體,此對象主要用來寫入內容到指定格式的檔案,如,寫入內容到尾碼名為xls格式的excel檔案等,用於其它板式的格式
$objWriter = new PHPExcel_Writer_Excel2007($objExcel);//建立一個檔案格式寫入對象執行個體,此對象主要用來寫入內容到指定格式的檔案,如,寫入內容到尾碼名為xls格式的excel檔案等,用於excel2007格式
$objWriter->setOffice2003Compatibility(true);//相容office2003
//設定文檔基本屬性
$objProps = $objExcel->getProperties(); //得到PHPExcel_document文檔對象
$objProps->setCreator("Zeal Li"); //設定作者
$objProps->setLastModifiedBy("Zeal Li"); //設定最後修改時間
$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"); //分類
$objExcel->setActiveSheetIndex(0);//設定使用者開啟excel檔案時,看到的首張sheet,如果沒有設定,預設為最後一次操作的sheet
$objActSheet->setTitle('測試Sheet');//設定當前活動的活頁簿名稱
//根據單元格名稱設定單元格內容,由PHPExcel根據傳入的內容自動判斷單元格的內容類型
$objActSheet->setCellValue('A1', '字串內容'); // 字串內容
$objActSheet->setCellValue('A2', 26); // 數值
$objActSheet->setCellValue('A3', true); // 布爾值
$objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式
/顯式指定單元格的內容類型為字串類型
$objActSheet->setCellValueExplicit('A5','847475847857487584',PHPExcel_Cell_DataType::TYPE_STRING);
//合并單元格
$objActSheet->mergeCells('B1:C22');
//設定列的寬度
$objActSheet->getColumnDimension('B')->setAutoSize(true);
$objActSheet->getColumnDimension('A')->setWidth(30);
//設定行的高度
$objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(11.5);
//格式:主要用來對單元格進行操作,如,設定字型、設定對齊、設定邊框等
$objStyleA5 = $objActSheet->getStyle('A5');//擷取A5單元格的樣式
//設定單元格的字型
$objFontA5 = $objStyleA5->getFont(); //獲得字型
$objFontA5->setName('宋體');//設定字型名稱
$objFontA5->setSize(10); //設定字型大小
$objFontA5->setBold(true);//設定字型加粗
$objFontA5->getColor()->setARGB('FF999999');//設定字型顏色
//設定單元格的對齊
$objAlignA5 = $objStyleA5->getAlignment();//獲得對齊
$objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);//水平居右
$objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直置中
//設定單元格的邊框
$objBorderA5 = $objStyleA5->getBorders();//擷取邊框
$objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//邊框樣式
$objBorderA5->getTop()->getColor()->setARGB('FFFF0000');//頂部邊框的顏色
$objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//左樣式
$objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//右樣式
//設定單元格的填充色
$objFillA5 = $objStyleA5->getFill();//填充
$objFillA5->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//填滿類型
$objFillA5->getStartColor()->setARGB('FFEEEEEE');
//計算單元格的值
$objPHPExcel->getActiveSheet()->setCellValue('B7', '=SUM(B5:C5)');
$objPHPExcel->getActiveSheet()->getCell('B7')->getCalculatedValue();
//如果要擷取單元格的一個值,首先需要通過工作表的getCell方法擷取到一個單元格對象,然後再通過單元格對象的getValue方法得到單元格的值,如果單元格的值是通過計算得到的,則需要使用getCalculatedValue方法擷取單元格的值,設定單元格的值,我們只需要通過工作表的setCellValue方法來設定即可
//$dateTimeNow=time();
$objPHPExcel->getActiveSheet()->setCellValue('C10', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow ));//41105.75
$objPHPExcel->getActiveSheet()->getStyle('C10')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);//18:00:54,只是換了一種顯示方式,並不會改變原來值的類型
echo gettype($objPHPExcel->getActiveSheet()->getCell('C10')->getValue());//double
echo $objPHPExcel->getActiveSheet()->getCell('C10')->getValue();//41105.75
//'2010-10-21'一定要放在引號中,否則顯示的值為,1979 文本(推薦)
$objPHPExcel->setActiveSheetIndex(0)->setCellValueExplicit("D1", '2010-10-21', PHPExcel_Cell_DataType::TYPE_STRING); //特徵:字串類型都是居左顯示
//添加一個新的worksheet
$objExcel->createSheet();//建立一個新的工作表
$objExcel->getSheet(1)->setTitle('測試2');//設定當前工作表的標題
//保護單元格
$objExcel->getSheet(1)->getProtection()->setSheet(true);
$objExcel->getSheet(1)->protectCells('A1:C22', 'PHPExcel');
//輸出內容到excel檔案,並將檔案儲存在伺服器上
$objWriter->save("test.xls");
//強制輸出內容到瀏覽器下載
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$outputFileName.'"');
header("Content-Transfer-Encoding: binary");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$objWriter->save('php://output');//參數-表示直接輸出到瀏覽器,供用戶端下載
//excel讀取對象
$PHPReader = new PHPExcel_Reader_Excel5();//建立一個excel檔案的讀取對象
$PHPExcel = $PHPReader->load($filePath);//讀取一張excel表,返回excel檔案對象
$currentSheet = $PHPExcel->getSheet(0);//讀取excel檔案中的第一張工作表
$allColumn = $currentSheet->getHighestColumn();//取得當前工作表最大的列號,如,E
$allRow = $currentSheet->getHighestRow();//取得當前工作表一共有多少行
//設定活頁簿預設的樣式
$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(8);
//合并單元格
$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

以上就介紹了Yii2使用PHPExcel讀取excel,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.