phpexcel

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');
    }

}

代碼下載鏈接
http://download.csdn.net/detail/u012329424/9267103

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章