PHP Excel導入
僅個人開發記錄,方便以後查看。輕噴。也請多多指正。
包含:
- ajax導入(最後)。
- 文件上傳。
- 導入excel獲取。、
- 導出錯誤excel。
後臺導入方法
public function import(){
if (!IS_POST) {
$this->error("訪問錯誤,請確認後重試!");
}
$upload = new Upload(); // 實例化上傳類
$upload->maxSize = 3145728; // 設置附件上傳大小
$upload->exts = array('xls', 'xlsx', 'txt'); // 設置附件上傳類
$upload->autoSub = false;
$upload->rootPath = './Uploads/';
$upload->savePath = '/***/'; // 設置附件上傳目錄
$upload->saveName = date('YmdHis',time());
$info = $upload->uploadOne($_FILES['excel']);
if (!$info) {
$this->error($upload->getError());
}
$filename = './Uploads' . $info['savepath'] . $info['savename'];
$ext = $info['ext'];
*//public 方法獲取excel中的數據*
$excels = $this->importGet($filename, $ext);
if (empty($excels)) {
$this->error('數據爲空,請確認後重試!');
}else{
$proj_id=rsa_decode($excels[1]['C'],getChoosekey()) ;
$pc_id=rsa_decode($excels[1]['H'],getChoosekey());
unset($excels[1]);
unset($excels[2]);
$excels=array_merge($excels);
$back_excel = [];
$back_excel['in_all'] = count($excels);
*//存放錯誤數據下標*
$key_arr = [];
*//存放正確下標*
$right_arr=[];
*//開始驗證excel數據
//驗證完成後 錯誤數據下標存入$key_arr 正確數據存入$right_arr*
$key_arr = array_unique($key_arr);
$key_arr = array_merge($key_arr);
$right_arr= array_unique($right_arr);
$right_arr = array_merge($right_arr);
$repeat_arr = [];
for ($i = 0; $i < count($key_arr); $i++) {
if (isset($excels[$key_arr[$i]])) {
$repeat_arr[] = $excels[$key_arr[$i]];
unset($excels[$key_arr[$i]]);
}
}
$excels = array_merge($excels);
*//如果錯誤數據不爲空 則輸出*
if ($repeat_arr) {
$back_excel['in_error'] = count($repeat_arr);
import("Org.Util.PHPExcel");
import("Org.Util.PHPExcel.Writer.Excel5");
import("Org.Util.PHPExcel.IOFactory.php");
*//創建PHPExcel對象,注意,不能少了*
$PHPExcel = new \PHPExcel();
*//激活表格*
$filename = "error-" . date('YmdHis',time()) . ".xls";
$PHPExcel->getActiveSheet()->getStyle('A')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
...
$PHPExcel->getActiveSheet()->getStyle('L')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
*//設置excel格式*
$PHPExcel->getActiveSheet()->getStyle("A")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
...
$PHPExcel->getActiveSheet()->getStyle("L")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
*//設置每列名稱*
$PHPExcel->getActiveSheet()->setCellValue('B1', '');
..
$PHPExcel->getActiveSheet()->setCellValue('J1', "");
$PHPExcel->getActiveSheet()->getStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$PHPExcel->getActiveSheet()->getStyle('A1:J1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID); // 背景填充方式
$PHPExcel->getActiveSheet()->getStyle('A1:J1')->getFill()->getStartColor()->setARGB('00dc93d5'); // 背景色
// $PHPExcel->getActiveSheet()->getStyle('A1:E1')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
*//設置寬度*
$PHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(50);
...
$PHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(20);
*//將值傳入*
for ($i = 0; $i < count($repeat_arr); $i++) {
$PHPExcel->getActiveSheet()->setCellValueExplicit("A" . ($i + 2), $repeat_arr[$i]['A'], \PHPExcel_Cell_DataType::TYPE_STRING);
..
$PHPExcel->getActiveSheet()->setCellValue("L" . ($i + 2), $repeat_arr[$i]['L']);
}
*//將錯誤數據下載地址存入*
$filePath = './Uploads/weixresever/resever_error/' . $filename;
$objWriter->save($filePath);
$back_excel['error_path'] = $filePath;
}
*//用戶填寫了的數據*
$back_excel['in_yx']=(count($repeat_arr) + count($right_arr)) ;
*//正確導入數目*
$back_excel['right']=count($right_arr);
*//錯誤數據數目*
$back_excel['error']=count($repeat_arr);
echo json_encode($back_excel);
exit;
}
}
... prompt'''
獲取excel數據的方法
public function importGet($filename, $exts = 'xls'){
import("Org.Util.PHPExcel");
//創建PHPExcel對象,注意,不能少了\
$PHPExcel=new \PHPExcel();
//如果excel文件後綴名爲.xls,導入這個類
if($exts == 'xls'){
import("Org.Util.PHPExcel.Reader.Excel5");
$PHPReader=new \PHPExcel_Reader_Excel5();
}else {
import("Org.Util.PHPExcel.Reader.Excel2007");
$PHPReader=new \PHPExcel_Reader_Excel2007();
}
//載入文件
$PHPExcel=$PHPReader->load($filename);
//獲取表中的第一個工作表,如果要獲取第二個,把0改爲1,依次類推
$currentSheet=$PHPExcel->getSheet(0);
//獲取總列數 J
$allColumn=$currentSheet->getHighestColumn();
//獲取總行數 54
$allRow=$currentSheet->getHighestRow();
if (empty($allRow)||$allRow<3)
{
$this->error('文件內容爲空');
}else{
$data = array();
for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
//從哪列開始,A表示第一列
for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {
//數據座標
$address = $currentColumn . $currentRow;
//讀取到的數據,保存到數組$arr中
if ($currentColumn === 'A') {
$data[$currentRow][$currentColumn] = (string) $currentSheet->getCell($address)->getValue();
} else {
$data[$currentRow][$currentColumn] = (string) $currentSheet->getCell($address)->getValue();
}
}
}
return $data;
}
}
... prompt'''
**
前臺ajax
**
$(document).on('click', "$selector", function() {
var $form = $(this).parent().parent().parent();
var $formData = new FormData($form[0]);
// console.log($form.attr('action')); return false;
var options = {
url: $form.attr('action'),
type: 'POST',
dataType: 'JSON',
async: false,
cache: false,
data: $formData,
// 告訴jQuery不要去處理髮送的數據
processData : false,
// 告訴jQuery不要去設置Content-Type請求頭
contentType : false,
success: function (data) {
// console.log(data);return false;
if(data.hasOwnProperty("in_error")){
layer.closeAll();
layer_alert('存在異常數據!,一共填寫了'+data['in_yx']+'條,導入成功'+data['right']+"條,點擊確認後下載異常數據.",function () {
layer.closeAll();
window.open("http://"+window.location.host+data['error_path']);
window.location.reload();
});
}else if(data.hasOwnProperty("in_all")){
layer.closeAll();
layer_msg('全部導入成功');
window.location.reload();
}else{
layer_msg(data.info);
}
},
error: function () {
gritter_alert("導入失敗,請確認後重試!");
}
};
$.ajax(options);
return false;
});
... prompt'''
public function comeon($name){
echo "Relax yourself , everything will be better ".$name;
}
$this->comeon(' ');