后台操作數據庫時經常會在數據和Excel之間進行大量地導入導出操作,從我的親身經歷來看最近導表也不下百份,以往的shell腳本已經不能滿足現在的需求了,所以剛好就碰到了Laravel Excel這款強大的工具,不過網上的資料也許太多導致之前安裝都出了一些問題,所以專程記錄一下避免以后再繞彎路。
之前我把Excel數據導入數據庫都是通過shell腳本處理,先把excel的內容拷貝到一個txt文檔里,注意所有的excel單位格必須填充內容(null值填寫為'空'或者'無'),然后所有數據不能換行,並且去除txt文件如 ‘,’’和空格這些符號,最后再用readline方法,以' '為分隔符獲取每一列的數據:
cat temp.txt|awk 'NR>1'|while read line do myDate=`echo $line|awk -F' ' '{printf("%s",$1)}'` myIn=`echo $line|awk -F' ' '{printf("%s",$2)}'` myOut=`echo $line|awk -F' ' '{printf("%s",$3)}'` remark=`echo $line|awk -F' ' '{printf("%s",$4)}'` 'mysql -hxxx -uxxx -pxxx --default-character-set=utf8'-N -e"
insert into t_record(myDate,myIn,myOut,remark) values('$myDate','$myIn','$myOut','$remark');
" done
這種方法比較復雜,對txt的要求比較高,一旦數據量大一些或者存在換行的情況就十分容易出錯,恰好自己現在開發的項目用到Laravel框架,所以就索性全部用其自帶的Excel來完優化導表過程吧。
安裝:
Laravel Excel是一款既可以執行Excel數據導入也可以執行Excel導出的工具,其官方文檔可以參考http://www.maatwebsite.nl/laravel-excel/docs。在安裝這個插件之前首先確保你的電腦或者服務器安裝了composer,沒安裝的可以參考http://www.jianshu.com/p/256547b495c2,當你在命令行下輸入composer出現幾個大大的Composer時說明已經安裝成功了。
首先打開要添加插件的那個項目的composer.json文件,由於我當時用的是Lavarel4所以在require部分添加''maatwebsite/excel'':''~1.3'',如果是Laravel5則添加 ''maatwebsite/excel'':''~2.1.0'',隨后執行composer update命令就可以把所需要的文件夾下載到你的項目中。值得注意的是如果你只想更新Excel這個插件 可以直接執行 composer update maatwebsite/excel 命令,因為執行composer update會把所有需要更新的內容都update一遍,網絡差,耗時長的情況下簡直是噩夢,所以建議需要哪個東西才更新哪個,不要一下子全部更新了。
更新成功后,在你的vendor目錄下會出現maatwebsite和phpoffice這兩個文件夾,如果沒有繼續回去更新吧(試試國內的鏡像)。然后在config/app.php內引入兩行說明:
在providers的數組里添加'Maatwebsite\Excel\ExcelServiceProvider'
在aliases里添加'Excel' => 'Maatwebsite\Excel\Facades\Excel'
最后再在項目的根目錄下執行php artisan config:publish maatwebsite/excel命令,如果是5則執行php artisan vendor:publish就完成整個安裝過程,其實整個過程並不復雜,只要看到那兩個文件夾出現了,就有十之八九了。
使用:
首先在具體的Controller的Php文件里加上 use Maatwebsite\Excel\Facades\Excel;
然后可以通過創建一個Excel對象或者直接調用Excel類里的方法來實現導出導入功能
//創建對象導入數據(類的話直接使用 Excel::load()方法)
$excel = App::make('excel');//excel類
$excel->load("/temp.xlsx", function($reader) //reader讀取excel內容
{ $reader = $reader->getSheet(0);//excel第一張sheet
$results = $reader->toArray(); unset($results[0]);//去除表頭
if ($results) { foreach ($results as $key => $value) { $data = []; $data['myDate'] = $value[0] == null ? '':trim($value[0]); $data['myIn'] = $value[1] == null ? '' : trim($value[1]); $data['myOut'] = $value[2] == null ? '' : trim($value[2]); $data['remark'] = $value[3] == null ? '' : trim($value[3]); $res = DB::table('t_record')->insertGetId($data); } } });
//使用類的方法導出excel
//創建一個文件並導出
$test='第一個位置'; Excel::create("new.xlsx", function($excel) use($test) { //創建sheet
$excel->sheet('sheet1',function($sheet) use($test) { //填充每個單元格的內容
$sheet->cell('A1',function($cell) use ($test) { $cell->setValue($test); }); }); })->export('xls'); //讀取一個文件並導出
Excel::load("new.xlsx", function($excel) { //讀取sheet
$excel->sheet('sheet1',function($sheet) { //修改每個單元格的內容
$sheet->cell('A1',function($cell) { $cell->setValue('1'); }); }); })->export('xls');
除此之外還有例如為excel設置標題、字體大小、單元格的大小、背景顏色、寬度、高度、水平、垂直居中、外邊距、內邊距等等,功能十分強大,讓你感覺你不僅僅是在導出一個excel而是在寫一個html+css的頁面,具體的需求功能可以參考其API文檔。好了,以后的excel與數據庫的交互不用愁了!!