導入Excel基本思路:
- 接收前端傳過來的Excel文件
- 將Excel文件轉化爲一個數組
- 將數組導入到數據庫
從百度下載一個PHPExcel類:https://github.com/PHPOffice/PHPExcel
用IOFactory.php類
//導入Excel
public function importExcel()
{
require_once ROOT_PATH . 'PHPExcel/Classes/PHPExcel/IOFactory.php';//導入PHPExcel文件中的IOFactory.php類
$file = request()->file('file');//獲取文件,file是請求的參數名
$info = $file->move(ROOT_PATH . 'public' . DS . 'excel');//move將文件移動到項目文件的xxx
if($info){
$excel_path = $info->getSaveName(); //獲取上傳文件名
// $excel_suffix = $info->getExtension(); //獲取上傳文件後綴
$file_name = ROOT_PATH . 'public' . DS . 'excel' . DS . $excel_path; //上傳文件的地址
$obj_PHPExcel = \PHPExcel_IOFactory::load($file_name); //加載文件內容
// echo "<pre>";
$excel_array=$obj_PHPExcel->getsheet(0)->toArray(); //轉換爲數組格式
array_shift($excel_array); //刪除第一個數組(標題);
$arr = reset($excel_array); //獲取字段名
unset($excel_array[0]); //刪除字段名,剩下的都是存儲到數據庫的數據了!!
$data = [];
for($i = 0;$i < count($excel_array);$i++){
foreach ($arr as $key => $value){
$data[$i][$value] = $excel_array[$i+1][$key];//使數組的鍵值就是數據表的字段名
}
}
$res = GoodsModel::getInstance()->insertAll($data);
var_dump($res);
}
}
導出Excel:
方法一:用PHPExcel.php類
//導出Excel
public function exportExcel2(){
// 引入phpexcel核心類文件
require_once ROOT_PATH . 'PHPExcel/Classes/PHPExcel.php';
//實例化excel類
$objPHPExcel = new \PHPExcel();
// 操作第一個工作表
$objPHPExcel->setActiveSheetIndex(0);
// 設置sheet名
$objPHPExcel->getActiveSheet()->setTitle('xx列表');
// 設置表格寬度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);
// 列名錶頭文字加粗
$objPHPExcel->getActiveSheet()->getStyle('A1:J1')->getFont()->setBold(true);
// 列表頭文字居中
$objPHPExcel->getActiveSheet()->getStyle('A1:J1')->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// 列名賦值
$objPHPExcel->getActiveSheet()->setCellValue('A1', '貨品名稱');
$objPHPExcel->getActiveSheet()->setCellValue('B1', '規格型號');
$objPHPExcel->getActiveSheet()->setCellValue('C1', '包裝單位');
$objPHPExcel->getActiveSheet()->setCellValue('D1', '規格單位');
$objPHPExcel->getActiveSheet()->setCellValue('E1', '包裝規格');
$objPHPExcel->getActiveSheet()->setCellValue('F1', '標準售價(元)');
$field = ['name', 'spec_model', 'pack_unit', 'spec_unit','pack_spec', 'price'];//第二行列字段內容
$res = GoodsModel::getInstance()
->field($field)
->where(['company_id'=>$this->company_id])
->limit(2)//限制條數
->select();
// 數據起始行
$row_num = 2;
// 向每行單元格插入數據
foreach($res as $value)
{
// 設置所有垂直居中
$objPHPExcel->getActiveSheet()->getStyle('A' . $row_num . ':' . 'J' . $row_num)->getAlignment()
->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
// 設置價格爲數字格式
$objPHPExcel->getActiveSheet()->getStyle('F' . $row_num)->getNumberFormat()
->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
// 居中
$objPHPExcel->getActiveSheet()->getStyle('A' . $row_num . ':' . 'F' . $row_num)->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// 設置單元格數值
$objPHPExcel->getActiveSheet()->setCellValue('A' . $row_num, $value['name']);
$objPHPExcel->getActiveSheet()->setCellValue('B' . $row_num, $value['spec_model']);
$objPHPExcel->getActiveSheet()->setCellValue('C' . $row_num, $value['pack_unit']);
$objPHPExcel->getActiveSheet()->setCellValue('D' . $row_num, $value['spec_unit']);
$objPHPExcel->getActiveSheet()->setCellValue('E' . $row_num, $value['pack_spec']);
$objPHPExcel->getActiveSheet()->setCellValue('F' . $row_num, $value['price']);
// $objPHPExcel->getActiveSheet()->setCellValue('F' . $row_num, $value['state'] ? '√' : '×');
// $objPHPExcel->getActiveSheet()->setCellValue('G' . $row_num, date('Y-m-d h:i:s',$value['statetime']));
$row_num++;
}
$outputFileName = 'goods_' . time() . '.xls';//導出的文件名
$xlsWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
header("Content-Type: application/force-download");//告訴瀏覽器強制下載
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="' . $outputFileName . '"');//attachment作爲附件下載,inline在線下載,filename設置文件名
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");
$xlsWriter->save("php://output");
echo file_get_contents($outputFileName);
}
方法二:直接用頭部信息輸出excel格式文件,內容以表格形式展示 。這種方法可能會導致excel文件格式和擴展名不一致,文件無法用於導入,如果只是導出看看數據可用這種方法。推薦方法一
- 把數據從數據庫中查詢出來
- 把查詢出來的數據拼接到table標籤中
- 調用設置好的header(頭域)函數
//導出Excel
public function exportExcel($action,$id = []){
switch ($action){
case 'HP':
$comment = ['貨品名稱','規格型號','包裝單位','規格單位','包裝規格','標準售價(元)'];//第一行標題內容
$field = ['name', 'spec_model', 'pack_unit', 'spec_unit','pack_spec', 'price'];//第二行列字段內容
if($id){//查詢指定的幾條數據
$res = GoodsModel::getInstance()
->field($field)
->where(['company_id'=>$this->company_id,'id'=>['in',$id]])
->select();
}else{//查詢所有數據
$res = GoodsModel::getInstance()
->field($field)
->where(['company_id'=>$this->company_id])
// ->limit(2)//限制條數
->select();
}
break;
default:
$this->displayByError('行動有誤,撤退!!');
}
$strTable ='<table width="500" border="1">';
$strTable .= '<tr>';
//第一行的標題
foreach ($comment as $key => $value){
$strTable .= '<td style="text-align:left;font-size:16px;" width="*">'.$value.'</td>'."\r\n";
}
$strTable .= '</tr>';
//第二行的列字段
$strTable .= '<tr>';
foreach ($field as $key => $value){
$strTable .= '<td style="text-align:left;font-size:14px;" width="*">'.$value.'</td>'."\r\n";
}
$strTable .= '</tr>';
//第三行開始是導入數據庫的數據
$strTable .= '<tr>';
for ($i = 0;$i < count($res);$i++){
for ($j = 0; $j < count($field);$j++){
$strTable .= '<td style="text-align:left;font-size:12px;" rowspan="*">'.$res[$i][$field[$j]].'</td>'."\r\n";
}
$strTable .= '</tr>';
}
$strTable .='</table>';
unset($res);
$this->downloadExcel($strTable,'GoodsExcel');
exit();
}
/**
* 導出excel需要設置的header
* @param $strTable /表格內容
* @param $filename /文件名
*/
function downloadExcel($strTable,$filename)
{
header("Content-type: application/vnd.ms-excel");//將查詢結果導出到Excel
header("Content-Type: application/force-download");//告訴瀏覽器強制下載
header("Content-Disposition: attachment; filename=".$filename."_".date('Y-m-d').".xls");//attachment作爲附件下載,inline在線下載,filename設置文件名
header('Expires:0');//瀏覽器不會響應緩存
header('Pragma:public');//Public指示響應可被任何緩存區緩存。
echo '<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$strTable.'</html>';
}
導出Excel參考文獻:https://blog.csdn.net/qq_41211900/article/details/81068901