PHPExcel 使用筆記


一、下載PHPExcel

  下載地址:https://github.com/PHPOffice/PHPExcel

二、讀取Excel文件內容插入數據庫

<?php
require_once 'Classes/PHPExcel.php';
require_once 'Classes/PHPExcel/IOFactory.php';
require_once 'Classes/PHPExcel/Reader/Excel5.php';

//連接數據庫
$db=new mysqli();
$db->connect('localhost','gg','123456','information');

$dir = './';
$templateName = 'data.xls';
//實例化Excel讀取類
$objReader = new PHPExcel_Reader_Excel2007();
    if(!$objReader->canRead($dir.$templateName)){
    $objReader = new PHPExcel_Reader_Excel5();
if(!$objReader->canRead($dir.$templateName)){
    echo '無法識別的Excel文件!';
    return false;
 }
}

$objPHPExcel=$objReader->load($dir.$templateName);
$sheet=$objPHPExcel->getSheet(0);//獲取第一個工作表
$highestRow=$sheet->getHighestRow();//取得總行數
$highestColumn=$sheet->getHighestColumn(); //取得總列數
//循環讀取excel文件,讀取一條,插入一條
for($j=1;$j<=$highestRow;$j++){//從第一行開始讀取數據
 $str='';
 for($k='A';$k<=$highestColumn;$k++){            //從A列讀取數據
 //這種方法簡單,但有不妥,以'\\'合並為數組,再分割\\為字段值插入到數據庫,實測在excel中,如果某單元格的值包含了\\導入的數據會為空        
  $str.=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue().'\\';//讀取單元格
 }
 //explode:函數把字符串分割為數組。
 $strs=explode("\\",$str);
 $sql="INSERT INTO `student`(`xh`,`name`) VALUES (
 '{$strs[0]}',
 '{$strs[1]}')";
 $db->query($sql);//這里執行的是插入數據庫操作
}
unlink($dir.$templateName); //刪除excel文件
?>

三、生成新的excel文件

<?php
error_reporting(E_ALL);
date_default_timezone_set('Asia/Shanghai');
require_once './Classes/PHPExcel.php';

$db=new mysqli();
$db->connect('localhost','gg','123456','information');


$objPHPExcel=new PHPExcel();
$objPHPExcel->getProperties()->setCreator('http://www.jb51.net')
        ->setLastModifiedBy('http://www.jb51.net')
        ->setTitle('Office 2007 XLSX Document')
        ->setSubject('Office 2007 XLSX Document')
        ->setDescription('Document for Office 2007 XLSX, generated using PHP classes.')
        ->setKeywords('office 2007 openxml php')
        ->setCategory('Result file');
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1','ID')
            ->setCellValue('B1','用戶名')
            ->setCellValue('C1','密碼')
            ->setCellValue('D1','地址');

$ret=$db->query('select * from user');
$ret->fetch_array();
$i=2;   
while ( $v=$ret->fetch_array()) {
   $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A'.$i,$v['id'])
            ->setCellValue('B'.$i,$v['username'])
            ->setCellValue('C'.$i,$v['password'])
            ->setCellValue('D'.$i,$v['address']);
 $i++;
}
$objPHPExcel->getActiveSheet()->setTitle('用戶信息');
$objPHPExcel->setActiveSheetIndex(0);
$filename=urlencode('信息統計表').'_'.date('Y-m-dHis');



//*生成xlsx文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'.xlsx"');
header('Cache-Control: max-age=0');
$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');


/*
*生成xls文件
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
*/

$objWriter->save('php://output');
exit;
?>

四、更新已有的Excel文件

<?php
require_once 'Classes/PHPExcel.php';
require_once 'Classes/PHPExcel/IOFactory.php';
require_once 'Classes/PHPExcel/Reader/Excel5.php';
//模板存放目錄
$dir = './';
$templateName = '模板.xls';
$outputFileName = '修改后模板.xlsx';
$txt="測試";

//實例化Excel讀取類
$PHPReader = new PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($dir.$templateName)){
 $PHPReader = new PHPExcel_Reader_Excel5();
 if(!$PHPReader->canRead($dir.$templateName)){
  echo '無法識別的Excel文件!';
  return false;
 }
}
//讀取Excel
$PHPExcel = $PHPReader->load($dir.$templateName);
//讀取工作表1
$currentSheet = $PHPExcel->getSheet(0);

//$currentSheet->setCellValue('D3',"123456789456444");//表頭賦值//
$currentSheet->setCellValueExplicit('D3',$txt,PHPExcel_Cell_DataType::TYPE_STRING);
//實例化Excel寫入類
$PHPWriter = new PHPExcel_Writer_Excel2007($PHPExcel);
ob_start();
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:attachment;filename="' .$outputFileName. '"');//輸出模板名稱
header("Content-Transfer-Encoding: binary");
header("Last-Modified:".gmdate("D, d M Y H:i:s")." GMT");
header('Pragma: public');
header('Expires: 30');
header('Cache-Control: public');
$PHPWriter->save('php://output');
?>

 

五、對於常見的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:單元格對象
        
(3)PHPExcel_Style:樣式對象,主要用來設置單元格的樣式:對齊方式、字體、邊框、填充等,跟我們之前學過的css樣式差不多,在這里如果想要設置對齊方式、字體大小、邊框顏色、等等都是通過樣式對象來完成的
    
    getActiveCell():獲得當前活動的單元格的名稱,返回string;如,A1
    getActiveSheet():獲得當前活動的工作表,返回工作表對象
    getAlignment():獲得對齊方式對象,返回對齊方式對象
    getBorders():獲得邊框對象,返回邊框對象
    getFill():獲得填充對象
    getFont():獲得字體對象
    setFont():設置字體,返回樣式對象

(3)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 

(3)PHPExcel_Style_Font:字體對象

    setBold():設置字體加粗
    setColor():設置字體顏色
    setItalic():設置字體傾斜
    setName():設置字體名
    setSize():設置字體大小
    setUnderline():設置字體下划線

(4)PHPExcel_Writer_Excel5:寫操作對象,主要用來輸出xls文件

    save(工作簿文件名):將工作簿對象中的數據保存到一個工作簿文件中

(4)PHPExcel_Writer_Excel2007:寫操作對象,主要用於輸出xlsx文件

    save(工作簿文件名):將工作簿對象中的數據保存到一個工作簿文件中

(5)PHPExcel_Reader_Excel5:讀操作對象,主要用於輸入xls文件
    
    canRead():當前reader對象是否能夠讀工作簿文件
    load():從一個工作簿文件中加載工作簿對象,也就是將工作簿文件中的數據加載到工作簿對象中來管理

(6)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');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM