PHP 使用PHPExcel實(shí)現(xiàn)文件導(dǎo)入與導(dǎo)出功能

本人的這段例程是使用在Thinkphp的開發(fā)框架上,要是使用在其他框架也是同樣的方法故慈,很多人可能不能正確的實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出,問題基本上都是phpExcel的核心類引用路徑出錯(cuò)框全,如果有問題大家務(wù)必要對路勁是否引用正確進(jìn)行測試

很多文章都有提到關(guān)于使用phpExcel實(shí)現(xiàn)Excel數(shù)據(jù)的導(dǎo)入導(dǎo)出察绷,大部分文章都差不多,或者就是轉(zhuǎn)載的津辩,都會(huì)出現(xiàn)一些問題拆撼,下面是本人研究phpExcel的使用例程總結(jié)出來的使用方法,接下來直接進(jìn)入正題喘沿。

首先先說一下闸度,本人的這段例程是使用在Thinkphp的開發(fā)框架上,要是使用在其他框架也是同樣的方法蚜印,很多人可能不能正確的實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出莺禁,問題基本上都是phpExcel的核心類引用路徑出錯(cuò),如果有問題大家務(wù)必要對路勁是否引用正確進(jìn)行測試窄赋。

(一)導(dǎo)入Excel

第一哟冬,在前臺(tái)html頁面進(jìn)行上傳文件:如:

導(dǎo)入Excel表:

第二,在對應(yīng)的php文件進(jìn)行文件的處理

if (! empty ( $_FILES ['file_stu'] ['name'] ))

{

$tmp_file = $_FILES ['file_stu'] ['tmp_name'];

$file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );

$file_type = $file_types [count ( $file_types ) - 1];

/*判別是不是.xls文件寝凌,判別是不是excel文件*/

if (strtolower ( $file_type ) != "xls")

{

$this->error ( '不是Excel文件柒傻,重新上傳' );

}

/*設(shè)置上傳路徑*/

$savePath = SITE_PATH . '/public/upfile/Excel/';

/*以時(shí)間來命名上傳的文件*/

$str = date ( 'Ymdhis' );

$file_name = $str . "." . $file_type;

/*是否上傳成功*/

if (! copy ( $tmp_file, $savePath . $file_name ))

{

$this->error ( '上傳失敗' );

}

/*

*對上傳的Excel數(shù)據(jù)進(jìn)行處理生成編程數(shù)據(jù),這個(gè)函數(shù)會(huì)在下面第三步的ExcelToArray類中

注意:這里調(diào)用執(zhí)行了第三步類里面的read函數(shù),把Excel轉(zhuǎn)化為數(shù)組并返回給$res,再進(jìn)行數(shù)據(jù)庫寫入

*/

$res = Service ( 'ExcelToArray' )->read ( $savePath . $file_name );

/*

重要代碼 解決Thinkphp M较木、D方法不能調(diào)用的問題

如果在thinkphp中遇到M 、D方法失效時(shí)就加入下面一句代碼

*/

//spl_autoload_register ( array ('Think', 'autoload' ) );

/*對生成的數(shù)組進(jìn)行數(shù)據(jù)庫的寫入*/

foreach ( $res as $k => $v )

{

if ($k != 0)

{

$data ['uid'] = $v [0];

$data ['password'] = sha1 ( '111111' );

$data ['email'] = $v [1];

$data ['uname'] = $v [3];

$data ['institute'] = $v [4];

$result = M ( 'user' )->add ( $data );

if (! $result)

{

$this->error ( '導(dǎo)入數(shù)據(jù)庫失敗' );

}

}

}

}

第三:ExcelToArrary類,用來引用phpExcel并處理Excel數(shù)據(jù)的

class ExcelToArrary extends Service{

public function __construct() {

/*導(dǎo)入phpExcel核心類??? 注意 :你的路徑跟我不一樣就不能直接復(fù)制*/

include_once('./Excel/PHPExcel.php');

}

/**

* 讀取excel $filename 路徑文件名 $encode 返回?cái)?shù)據(jù)的編碼 默認(rèn)為utf8

*以下基本都不要修改

*/

public function read($filename,$encode='utf-8'){

$objReader = PHPExcel_IOFactory::createReader('Excel5');

$objReader->setReadDataOnly(true);

$objPHPExcel = $objReader->load($filename);

$objWorksheet = $objPHPExcel->getActiveSheet();

$highestRow = $objWorksheet->getHighestRow();

$highestColumn = $objWorksheet->getHighestColumn();

$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

$excelData = array();

for ($row = 1; $row <= $highestRow; $row++) {

for ($col = 0; $col < $highestColumnIndex; $col++) {

$excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();

}

}

return $excelData;

}

}

第四青柄,以上就是導(dǎo)入的全部內(nèi)容伐债,phpExcel包附在最后预侯。

(二)Excel的導(dǎo)出(相對于導(dǎo)入簡單多了)

第一,先查出數(shù)據(jù)庫里面要生成Excel的數(shù)據(jù)峰锁,如:

$data= M('User')->findAll();?? //查出數(shù)據(jù)

$name='Excelfile';??? //生成的Excel文件文件名

$res=service('ExcelToArrary')->push($data,$name);

第二萎馅,ExcelToArrary類,用來引用phpExcel并處理數(shù)據(jù)的

class ExcelToArrary extends Service{

public function __construct() {

/*導(dǎo)入phpExcel核心類??? 注意 :你的路徑跟我不一樣就不能直接復(fù)制*/

include_once('./Excel/PHPExcel.php');

}

/* 導(dǎo)出excel函數(shù)*/

public function push($data,$name='Excel'){

error_reporting(E_ALL);

date_default_timezone_set('Europe/London');

$objPHPExcel = new PHPExcel();

/*以下是一些設(shè)置 ,什么作者? 標(biāo)題啊之類的*/

$objPHPExcel->getProperties()->setCreator("轉(zhuǎn)彎的陽光")

->setLastModifiedBy("轉(zhuǎn)彎的陽光")

->setTitle("數(shù)據(jù)EXCEL導(dǎo)出")

->setSubject("數(shù)據(jù)EXCEL導(dǎo)出")

->setDescription("備份數(shù)據(jù)")

->setKeywords("excel")

->setCategory("result file");

/*以下就是對處理Excel里的數(shù)據(jù)虹蒋, 橫著取數(shù)據(jù)糜芳,主要是這一步,其他基本都不要改*/

foreach($data as $k => $v){

$num=$k+1;

$objPHPExcel->setActiveSheetIndex(0)

//Excel的第A列魄衅,uid是你查出數(shù)組的鍵值峭竣,下面以此類推

->setCellValue('A'.$num, $v['uid'])

->setCellValue('B'.$num, $v['email'])

->setCellValue('C'.$num, $v['password'])

}

$objPHPExcel->getActiveSheet()->setTitle('User');

$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.ms-excel');

header('Content-Disposition: attachment;filename="'.$name.'.xls"');

header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

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

exit;

}

第三,以上就是導(dǎo)出的全部內(nèi)容晃虫,phpExcel包附在最后皆撩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哲银,隨后出現(xiàn)的幾起案子扛吞,更是在濱河造成了極大的恐慌,老刑警劉巖荆责,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥比,死亡現(xiàn)場離奇詭異,居然都是意外死亡做院,警方通過查閱死者的電腦和手機(jī)盲泛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來山憨,“玉大人查乒,你說我怎么就攤上這事∮艟梗” “怎么了玛迄?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棚亩。 經(jīng)常有香客問我蓖议,道長,這世上最難降的妖魔是什么讥蟆? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任勒虾,我火速辦了婚禮,結(jié)果婚禮上瘸彤,老公的妹妹穿的比我還像新娘修然。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布愕宋。 她就那樣靜靜地躺著玻靡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪中贝。 梳的紋絲不亂的頭發(fā)上囤捻,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音邻寿,去河邊找鬼蝎土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绣否,可吹牛的內(nèi)容都是我干的誊涯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼枝秤,長吁一口氣:“原來是場噩夢啊……” “哼醋拧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淀弹,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤丹壕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后薇溃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菌赖,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年沐序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琉用。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡策幼,死狀恐怖邑时,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情特姐,我是刑警寧澤晶丘,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站唐含,受9級(jí)特大地震影響浅浮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捷枯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一滚秩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淮捆,春花似錦郁油、人聲如沸本股。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊末。三九已至蚕苇,卻和暖如春哩掺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩笤。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工嚼吞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹬碧。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓舱禽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恩沽。 傳聞我的和親對象是個(gè)殘疾皇子誊稚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容