首頁  >  文章  >  後端開發  >  Yii2使用PHPExcel讀取excel

Yii2使用PHPExcel讀取excel

WBOY
WBOY原創
2016-08-08 09:22:041542瀏覽

個人使用過程中保存一些使用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 = "CanRenot read filefile."
    $errorMessage = "Can not read file."
 ); 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     echo $currentRow;
   $lineVal  = []; currentColumn="A"; $currentColumn     $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)-> 將字母轉給字母();為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迭代器 Ce IteratorOn-setIterateates ); // 設定cell迭代器,遍歷所有cell,就算cell沒有值
    $lineVal = [];
    foreach ($cellIterator as $cell) {
        if ($cell->getDataType() ==celcelcelcococable_cPE_cPE_getDataType() ==celcelo_cNU000PE_cPE_ ) { // 這裡是比較cell中資料型別是不是number
            $cellStyleFormat = $cell->getStyle( $cell->getCoordinate() )->getNumberFormat(); // 接下來這兩個句子是拿到這個number的格式
            $formatCode = $cellStyleFormat->getFormatCode(); // 如果是普通的數字,formatCode將為General, 如果是如6/12/91 12:00的時間格式,formatCode將為/d/yy :mm(反正就是時間格式了)
            echo $cell->getCoordinate() . " " . $formatCode; echo "
";
       含, $formatCode)) {
                $value = gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($cell->getValue()));時間
            } else {
                $value = $cell->getValue();
       $value = $cell->getValue();
        }
        if ($cell->getColumn() == ' I') { // 取得列座標
            $value = "0" . $value;
        }
        array_push($lineVal, $.  array_push($ result->content, $lineVal);
}
lele從yanhui_wei同學一篇文章看到了TA對PHPExcel類別及方法的總結,寫的不錯,特摘抄下來:
    
對於常見的掌握工作,我們需要常見的掌握以下幾個類別庫就可以了:
(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:對齊方式物件
getHorizo​​ntal():取得水平居中方式
getVertical():取得垂直居中方式
setHorizo​​ntal():設定水平居中方式,返回對齊方式物件
setVertical():設定垂直居中方式,返回對齊方式物件
居中方式:
HORIZONTAL_CENTER 
HORIZONTAL_CENTER_CONTINUOUSL_CENTER 
HORIZONTAL_CENTER_CONTINUOUSL_CENTER 
HORIZONTAL_CENTER_CONTINUOUS_HOUSOUSLON ZONTAL_LEFT 
HORIZONTAL_RIGHT 
VERTICAL_BOTTOM 
VERTICAL_CENTER 
VERTICAL_JUSTIFY 
VERTICAL_TOP
(6)PHPExcel_Style_Font:字體物件
setBold():設定字體加粗
setColor():設定字體顏色
setItalic():設定字體傾斜
setName():設定字體顏色
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();  
$objProps = $objExcel->getProperties(); ("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-Key excel PHPExcel"); //關鍵字
$objProps->setCategory("Test"); //分類
$objExcel->setActiveSheetIndex(0);//設定使用者開啟excel檔案時,看到的首張excelet,如果沒有設置,預設為最後一次操作的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->getColumnDimension('B')->setAutoSize(true);
$objActSheet->getColumnDimension('A')->setWidth(30);
//設定行的高度存在->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->HOsetHowCat​​didDDMDicR3DJ );//水平居右 
$objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
//設定儲存格的邊框 
$objCorderA5 = $objptyle5-get/Lget 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_IN)(L$ PHPExcel_Style_Border::BORDER_THIN);//右樣式
//設定儲存格的填滿色
$objFillA5 = $objStyleA5->getFill();//填餡 
$objFillA5-setmobjillType(PHP)(FillType(PHP)(Fill);類型 
$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->getActive-Sheet()->Style( >setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);//18:00:54,只是換了一種顯示方式,並不會改變原來值的型別
echo gettype($objPHPExcel->getActiveSheet()-10Cell('C ')->getValue());//double
echo $objPHPExcel->getActiveSheet()->getCell('C10')->getValue();//41105.75
//'2010-10-21'一定要放在引號中,否則顯示的值為,1979               文字(建議)
$objPHPExcel->setActiveSheetIndex(0)->setCellValueExplicit("D1", '2010-100)->setCellValueExplicit("D1", '2010-100)->,Data0-Oplicit("D1", '2010-100)->,Data0-Oplicit("D1", '2010-109); :字串型別都是居左顯示
//新增一個新的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-Type: application/download"); 
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檔案物件
$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('A1818 :E22');

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

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

🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn