1,前臺簡單的form或者是ajaxfileupload.js提交
<head>
<meta charset="UTF-8">
<title></title>
<script src="js/jquery-1.7.2.min.js"></script>
<script src="js/ajaxfileupload.js"></script>
</head>
<body>
<script>
jQuery(function(){
$("#buttonUpload").click(function(){
//加載圖標
/* $("#loading").ajaxStart(function(){
$(this).show();
}).ajaxComplete(function(){
$(this).hide();
});*/
//上傳文件
$.ajaxFileUpload({
url: 'excelOperate.php',//處理腳本
secureuri: false,
fileElementId: 'fileToUpload',//file控件id
dataType: 'json',
success: function (data, status) {
if (typeof(data.error) != 'undefined') {
if (data.error != '') {
alert(data.error);
if(data.responsefile){
window.location.href = data.responsefile;
}
} else {
alert(data.message);
//window.location.href = data.responsefile;
}
}
},
error: function (data, status, e) {
alert(e);
}
});
return false;
})
})
</script>
<!--jqueryUpload 適合上傳成功和失敗的文件(已經在服務器上的,然後window.location.href 重定向下載)-->
<div id="upload">
<input id="fileToUpload" type="file" size="20" name="fileToUpload" class="input">
<button id="buttonUpload">上傳</button>
</div>
<!--form 則可以提交給隱藏的iframe,傳遞數據流下載(也就是不保存excel文件直接向瀏覽器返回excel數據流)-->
<div>
<form method="post" action="excelOperate.php" enctype="multipart/form-data">
<h3>導入Excel表:</h3><input type="file" name="fileToUpload" />
<input type="submit" value="導入" />
</form>
<!-- target="excelDownload" <iframe src="" name="excelDownload" frameborder="0" ></iframe>-->
</div>
2,後臺處理(關鍵)
處理一:
<?php
/**
* Date: 11/13/2015
* Time: 9:57 AM
*/
$result = array(
"error" => "",
"message" => "",
"responsefile" => ""
);
$fileElementName = 'fileToUpload';//html中上傳文件的input的name
$allowType = array(".xls",".xlsx",".csv"); //允許上傳的文件類型
$num = strrpos($_FILES[$fileElementName]['name'] ,'.');
$fileSuffixName = strtolower(substr($_FILES[$fileElementName]['name'],$num,8));//此數可變
$upFilePath = 'd:/'; //最終存放路徑
if(!empty($_FILES[$fileElementName]['error'])) {
switch ($_FILES[$fileElementName]['error']) {
case '1':
$error = '傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值';
break;
case '2':
$error = '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值';
break;
case '3':
$error = '文件只有部分被上傳';
break;
case '4':
$error = '沒有文件被上傳';
break;
case '6':
$error = '找不到臨時文件夾';
break;
case '7':
$error = '文件寫入失敗';
break;
default:
$error = '未知錯誤';
}
$result['error'] = $error;
exit(json_encode($result));
}
if(empty($_FILES[$fileElementName]['tmp_name']) || $_FILES['fileToUpload']['tmp_name'] == 'none') {
$result['error'] = '沒有上傳文件.';
exit(json_encode($result));
}
if(!in_array($fileSuffixName,$allowType)) {
$result['error'] = '不允許上傳的文件類型';
exit(json_encode($result));
}
/*
* 如果需要上傳文件到指定指定則指向下面的$upFilePath,如果只是處理數據則 $data->read($_FILES[$fileElementName]['tmp_name']);//讀取excel累世這種直接讀取緩存文件中的數據是一樣的
if(@move_uploaded_file($_FILES[$fileElementName]['tmp_name'],$upFilePath) === FALSE){
$error = '上傳失敗';
exit(json_encode($result));
}*/
//開始處理excel
//excel驗證(標識符)todo
//讀取excel
//將include設置爲./Classses/ 路徑
set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');
include 'PHPExcel/IOFactory.php';
//讀出excel數據
$exceldata = excelRead(($_FILES[$fileElementName]['tmp_name']));
//讀出錯返回錯誤json
//你自己對應的數據處理和篩選
//如果要保存或者是輸出對應反饋excel
excelWrite('data',$a = array(), $exceldata, false, 5);
/**
* @param $filename
* @return array
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
*/
function excelRead($filename){
$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();
}
/*可篩選固定的列
$excelData[$row]['id'] = $objPHPExcel->getActiveSheet()->getCell("A".$row)->getValue();//ID
$excelData[$row]['name'] = $objPHPExcel->getActiveSheet()->getCell("D".$row)->getValue();//姓名
*/
}
return $excelData;
}
/**
* @param array $data 一個二維數組,結構如同從數據庫查出來的數組
* @param array $title excel的第一行標題,一個數組,如果爲空則沒有標題
* @param string $filename 下載的文件名
* 但是對07以上的excel出錯
*
* exportexcel($arr,array('id','賬戶','密碼','暱稱'),'文件名!');
*/
function excelWrite1($data=array(),$title=array(),$filename='report'){
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=".$filename.".xls");
header("Pragma: no-cache");
header("Expires: 0");
//導出xls 開始
if (!empty($title)){
foreach ($title as $k => $v) {
$title[$k]=iconv("UTF-8", "GB2312",$v);
}
$title= implode("\t", $title);
echo "$title\n";
}
if (!empty($data)){
foreach($data as $key=>$val){
foreach ($val as $ck => $cv) {
$data[$key][$ck]=iconv("UTF-8", "GB2312", $cv);
}
$data[$key]=implode("\t", $data[$key]);
}
echo implode("\n",$data);
}
}
/*列索引*/
function getExcelColumnValue($index){
$array = range('A', 'Z');
$columnValue = '';
if ($index >= 26) {
$columnValue = getExcelColumnValue(intval($index / 26) - 1) . $array[$index % 26];
} else {
$columnValue = $array[$index] . $columnValue;
}
return $columnValue;
}
/**
* @param $fileName
* @param $headArr
* @param $data excel數據
* @param bool|false $colNum 默認不限制列數,防止有些很末尾的列數隱藏數值而中間都是空的
* @param bool|false $local 默認瀏覽器下載excel
* @throws PHPExcel_Exception
*/
function excelWrite($fileName, $headArr, $data,$local = false, $colNum = false)
{
if (empty($data) || !is_array($data)) {
die("data must be a array");
}
if (empty($fileName)) {
exit;
}
if(is_numeric($colNum) && is_int($colNum+0) && ((int)$colNum > 0) ) {
$colNumCount = true;
}
$date = date("Y_m_d", time());
/* if($local) {
//03兼容格式
$fileName .= "_{$date}.xls";
}else{
$fileName .= "_{$date}.xlsx";
}*/
$fileName .= "_{$date}.xls";
//創建新的PHPExcel對象
$objPHPExcel = new PHPExcel();
$objProps = $objPHPExcel->getProperties();
if(is_array($headArr) && !empty($headArr)){
//設置表頭
$columindex = 0;
foreach ($headArr as $key => $v) {
if($colNumCount ) {
if(((int)$columindex < (int)$colNum)) {
$colum = getExcelColumnValue($columindex);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);
$columindex++;
}
}else{
$colum = getExcelColumnValue($columindex);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);
$columindex++;
}
}
$row = 2;
}else{
$row = 1;
}
$objActSheet = $objPHPExcel->getActiveSheet();
$objPHPExcel->getActiveSheet()->getStyle( 'A1:E1')->getFill()->getStartColor()->setARGB('FF0094FF');
//$objPHPExcel->getActiveSheet()->getStyle( 'A1:E1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
/*$objPHPExcel->getActiveSheet()->getStyle( 'A3:A10')->applyFromArray(
array(
'font' => array (
'bold' => true
),
'alignment' => array (
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT ,
),
'borders' => array (
'top' => array (
'style' => PHPExcel_Style_Border::BORDER_THIN
)
),
'fill' => array (
'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR ,
'rotation' => 90,
'startcolor' => array (
'argb' => 'FFA0A0A0'
),
'endcolor' => array (
'argb' => 'FF0094FF'
)
)
)
);*/
foreach ($data as $key => $rows) { //行寫入
$columindex = 0;
foreach ($rows as $keyName => $value) {// 列寫入
if($colNumCount){
if(((int)$columindex < (int)$colNum)) {
$colum = getExcelColumnValue($columindex);
//寬度
//$objActSheet->getColumnDimension($colum)->setAutoSize(true);
//顏色
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF808080');
$objActSheet->setCellValue($colum . $row, $value);
$columindex++;
}
} else {
$colum = getExcelColumnValue($columindex);
//寬度
//$objActSheet->getColumnDimension($colum)->setAutoSize(true);
//顏色
//$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF808080');
$objActSheet->setCellValue($colum . $row, $value);
$columindex++;
}
}
$row++;
}
$fileName = iconv("utf-8", "gb2312", $fileName);
//重命名錶
$objPHPExcel->getActiveSheet()->setTitle('Simple');
//設置活動單指數到第一個表,所以Excel打開這是第一個表
$objPHPExcel->setActiveSheetIndex(0);
//將輸出重定向到一個客戶端web瀏覽器(Excel2007)
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
if($local) {
$objWriter->save($fileName); //腳本方式運行,保存在當前目錄
}else{
//$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');這個中可以輸出xlsx
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"$fileName\"");
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
}
exit;
}
處理二:
<?php
/**
* Date: 2015/11/16
* Time: 18:20
*/
$result = array(
"error" => "",
"message" => "",
"responsefile" => ""
);
$fileElementName = 'fileToUpload';//html中上傳文件的input的name
$allowType = array(".xls",".xlsx",".csv"); //允許上傳的文件類型
$num = strrpos($_FILES[$fileElementName]['name'] ,'.');
$fileSuffixName = strtolower(substr($_FILES[$fileElementName]['name'],$num,8));//此數可變
$upFilePath = 'd:/'; //最終存放路徑
if(!empty($_FILES[$fileElementName]['error'])) {
switch ($_FILES[$fileElementName]['error']) {
case '1':
$error = '傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值';
break;
case '2':
$error = '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值';
break;
case '3':
$error = '文件只有部分被上傳';
break;
case '4':
$error = '沒有文件被上傳';
break;
case '6':
$error = '找不到臨時文件夾';
break;
case '7':
$error = '文件寫入失敗';
break;
default:
$error = '未知錯誤';
}
$result['error'] = $error;
exit(json_encode($result));
}
if(empty($_FILES[$fileElementName]['tmp_name']) || $_FILES['fileToUpload']['tmp_name'] == 'none') {
$result['error'] = '沒有上傳文件.';
exit(json_encode($result));
}
if(!in_array($fileSuffixName,$allowType)) {
$result['error'] = '不允許上傳的文件類型';
exit(json_encode($result));
}
/*
* 如果需要上傳文件到指定指定則指向下面的$upFilePath,如果只是處理數據則 $data->read($_FILES[$fileElementName]['tmp_name']);//讀取excel累世這種直接讀取緩存文件中的數據是一樣的
if(@move_uploaded_file($_FILES[$fileElementName]['tmp_name'],$upFilePath) === FALSE){
$error = '上傳失敗';
exit(json_encode($result));
}*/
//開始處理excel
//excel驗證(標識符)todo
//讀取excel
//將include設置爲./Classses/ 路徑
set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');
include 'PHPExcel/IOFactory.php';
include('PHPExcel.php');
$excelData = excelRead(($_FILES[$fileElementName]['tmp_name']));
$excelHeader = array('a1','a2','a3','a4','a5','a6','a7','a8','a9','a10');
excelWrite('aaa', $excelData,$excelHeader, false);
function excelRead($excelfile){
if(is_null($excelfile)){
exit('excel文件不存在');
}
$exceldata = array();
$reader = PHPExcel_IOFactory::createReaderForFile($excelfile); #Excel2007
$reader->setReadDataOnly(true);
$excel= $reader->load($excelfile);
$sheet=$excel->getActiveSheet();
$highestRow = $sheet->getHighestRow(); // 取得總行數,從一開始
$highestColumm = $sheet->getHighestColumn(); // 取得總列數,從0開始
//檢查excel存在於AZ位置上的密碼是否爲20021514
/*$key = $sheet -> getCellByColumnAndRow( 51 , 1 ) -> getValue();//按照索引取
if( $key != '20021514' ){}else{}*/
//不包含excel頭行
for($row = 2 ;$row <= $highestRow ;$row++){
//直接選擇列
$i = $row - 2;
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(0 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(1 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(2 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(3 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(4 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(5 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(6 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(7 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(8 , $row)->getValue());
$exceldata[$i][] = trim($sheet->getCellByColumnAndRow(9 , $row)->getValue());
}
//對數據做相應處理
return $exceldata;
}
function excelWrite($filename, $exceldata, $excelHeader, $local =false, $uploadPath = './upload/41'){
$writer = new PHPExcel();
$writer -> setActiveSheetIndex(0);
$writer_sheet = $writer-> getActiveSheet();
$writerow = 1;
if(is_array($excelHeader) && !empty($excelHeader)){
foreach($excelHeader as $k => $v){
$writer_sheet ->setCellValueByColumnAndRow($k, $writerow, $v);
}
$writerow++;
}
foreach($exceldata as $data){
foreach($data as $k =>$v){
$writer_sheet -> setCellValueByColumnAndRow($k, $writerow, $v);
}
$writerow++;
}
//假設,之後加個默認上傳路徑
$filename = $filename.".xls" ;
$filename = iconv("utf-8", "gb2312", $filename);
if($local){
$output = $uploadPath."/".$filename ;
$PHPExcelWriter = PHPExcel_IOFactory::createWriter($writer, 'Excel5');
$PHPExcelWriter -> save($output);
/* header("Content-type: application/force-download");
header("Content-Disposition: attachment; Filename=\"$filename\"");
header("Content-Length: ".Filesize($output));
@readFile($output);*/
}else{
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"$filename\"");
header('Cache-Control: max-age=0');
$PHPExcelWriter = PHPExcel_IOFactory::createWriter($writer, 'Excel5');
$PHPExcelWriter->save('php://output');
}
}