基于PHPExcel庫的EXCEL導入導出

mww8 10年前發布 | 23K 次閱讀 PHPExcel PHP開發

下面的事例只是完成了一個excel的上傳下載的基本功能,還有一些設置表格樣式、合并單元格等操作沒有體現在這里,大家可以參考PHPExcel的手冊,事例后面是我摘出來的PHPExcel的常見的一些操作,供大家參考。

       PHPExcel類是php一個excel表格處理插件,最近由于工作需要用到了這個插件,完成了一個excel導入導入的功能。現在將主要邏輯整理一下和大家分享,有需要的可以參考一下。

       下面的事例只是完成了一個excel的上傳下載的基本功能,還有一些設置表格樣式、合并單元格等操作沒有體現在這里,大家可以參考PHPExcel的手冊,事例后面是我摘出來的PHPExcel的常見的一些操作,供大家參考:

       將PHPExcel提供的API根據需要封裝成一個供上傳和下載使用的類,其實就是兩個函數,一個用于上傳一個用于下載,這里我就直接將代碼貼出來了。

<?php
/* PHPExcel庫可以從https://phpexcel.codeplex.com/下載,例子中用的版本是1.8.0 */
require_once dirname(__FILE__) . '/PHPExcel/PHPExcel.class.php';

class parseExcel
{
    function __construct()
    {
        /* do nothing */
    }

    /**
     * 將excel文件轉化為一個二維數組(這里還沒有考慮excel中的頁簽)
     * 將excel的內容全部讀取回去
     * 第一行為標題行,不在返回的數據里面
     * 
     * @param $file : excel文件名
     * @param $filed: 要讀取的列
     * 
     * @access  public
     * 
     * @return  對象的array,每行數據為一個對象,array的大小為行數(不包含標題)
     *          每一行是一個對象
     */
    public function excel2array($file, $fields = array())
    {
        /* 如果文件名為空或者要讀取的列為空,則返回一個空的數組 */
        if ($file == "" || count($fields) == 0)
        {
            return array();
        }

        /* 創建reader */
        $phpReader = new PHPExcel_Reader_Excel2007();
        if(!$phpReader->canRead($file))
        {
            /* 如果PHPExcel_Reader_Excel2007無法讀取excel,則銷毀剛才創建的對象,使用PHPExcel_Reader_Excel5來讀 */
            unset($phpReader);
            $phpReader = new PHPExcel_Reader_Excel5();
        }

        if(!$phpReader->canRead($file))
        {
            /* 文件無法讀取,返回空的數組 */
            return array();
        }

        $phpExcel     = $phpReader->load($file);

        /* 目前的實現只讀取第一個工作表 */
        $currentSheet = $phpExcel->getSheet(0);

        /* 拿到工作表的行數和列數 */
        $allRows      = $currentSheet->getHighestRow(); 
        $allColumns   = $currentSheet->getHighestColumn(); 
        $allColumns++;
        $currentColumn = 'A';

        /* 解析第一個行,記錄$fields中要讀取的行 */
        while($currentColumn != $allColumns)
        {
            $title = $currentSheet->getCell($currentColumn . '1')->getValue();
            $field = array_search($title, $fields);
            $columnKey[$currentColumn] = $field ? $field : '';
            $currentColumn++;
        }

        $dataList = array();

        /* 跳過標題行(第一行)開始讀取數據 */
        for($currentRow = 2; $currentRow <= $allRows; $currentRow++)
        {
            $currentColumn = 'A'; 
            $data          = new stdclass();
            $ignore        = true; /* 對于空行,需要忽略,這里通過記錄一個標記處理 */

            while($currentColumn != $allColumns)
            {
                $cellValue = trim($currentSheet->getCell($currentColumn . $currentRow)->getValue());

                if(empty($columnKey[$currentColumn]))
                {
                    $currentColumn++;
                    continue;
                }

                $field = $columnKey[$currentColumn];
                $currentColumn++;
                if (empty($cellValue))
                {
                    $data->$field = '';
                }
                else
                {
                    $data->$field = $cellValue;
                    $ignore = false;
                }
            }

            if ($ignore == true)
            {
                continue;
            }

            /* 設置沒有從excel中讀到的數據 */
            foreach(array_keys($fields) as $key)
            {
                if(!isset($data->$key)) 
                {
                    $data->$key = '';
                }
            }

            $dataList[] = $data;
        }

        return $dataList; 
    }

    public function setExcelFiled($count)
    {
        $letter = 'A';
        for($i = 1; $i <= $count; $i++) $letter++;
        return $letter;
    }

    /**
     * 將一個對象寫入到文件
     *
     * @param $data     : 要寫入到excel文件的數據
     *                    kind     :頁簽名稱
     *                    fields   : 標題行,輸入的文件要包含的字段
     *                    rows     :對象數組,每一個數據,這些數據會通過fields過濾,只保留fields的內容(和excel2array的返回值格式一致)
     *                    fileName : 要保存的文件名
     * @param $fileType : 輸入文件類型,包括xls和xlsx兩種類型
     * @param $savePath : 文件路徑
     *
     * @access  public
     *
     * @return  對象的array,每行數據為一個對象,array的大小為行數(不包含標題)
     *          如果輸入為空,則可能是由于參數不對或者excel文件無法讀取
     */
    public function export2excel($data, $savePath = '')
    {
        $this->phpExcel     = new phpExcel();

        $this->rawExcelData = $data;
        $this->fields       = $this->rawExcelData->fields;
        $this->rows         = $this->rawExcelData->rows;
        $this->fieldsKey    = array_keys($this->fields);

        if(!$this->rawExcelData->fileName) $this->rawExcelData->fileName = $this->rawExcelData->kind;

        $this->excelKey = array();
        for($i = 0; $i < count($this->fieldsKey); $i++) $this->excelKey[$this->fieldsKey[$i]] = $this->setExcelFiled($i);

        /* Set file base property */
        $excelProps = $this->phpExcel->getProperties();
        $excelProps->setCreator('ricky');
        $excelProps->setLastModifiedBy('ricky');
        $excelProps->setTitle('Office XLS Document');
        $excelProps->setSubject('Office XLS Document');
        $excelProps->setDescription('Document generated by PHPExcel.');
        $excelProps->setKeywords('office excel PHPExcel');
        $excelProps->setCategory('Result file');

        /* 處理第一個頁簽 */
        $this->phpExcel->setActiveSheetIndex(0);
        $sheetTitle = $this->rawExcelData->kind;
        $excelSheet = $this->phpExcel->getActiveSheet();

        /* 設置頁簽名稱 */
        if($sheetTitle) $excelSheet->setTitle($sheetTitle);
        foreach($this->fields as $key => $field) $excelSheet->setCellValueExplicit($this->excelKey[$key] . '1', $field, PHPExcel_Cell_DataType::TYPE_STRING);

        $i = 1;
        foreach($this->rows as $num => $row)
        {
            $i++;
            foreach($row as $key => $value)
            {
                if(isset($this->excelKey[$key]))
                {
                    $excelSheet->setCellValueExplicit($this->excelKey[$key] . $i, $value, PHPExcel_Cell_DataType::TYPE_STRING);
                }
            }
        }

        /* urlencode the filename for ie. */
        $fileName = $this->rawExcelData->fileName;
        if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false) $fileName = urlencode($fileName);

        $excelWriter = PHPExcel_IOFactory::createWriter($this->phpExcel, 'Excel5');
        $excelWriter->setPreCalculateFormulas(false);
        if($savePath == '')
        {
            header('Content-Type: application/vnd.ms-excel');
            header("Content-Disposition: attachment;filename=\"{$fileName}.xls\"");
            header('Cache-Control: max-age=0');

            $excelWriter->save('php://output');
        }
        else
        {
            $excelWriter->save($savePath);
        }
    }
}



測試代碼:

       測試代碼中完成了excel文件的上傳和下載:從本客戶端擇一個excel文件導入,然后完成解析后,再下載到客戶端。

       HTML代碼很簡單,沒有css、js,只有一個file空間和一個提交按鈕。如下所示:

<!doctype html>
<html>
    <body>
        <form action="excel.php" method="post" enctype="multipart/form-data">
            <label for="file">Filename:</label>
            <input type="file" name="file" id="file" /> 
            <br />
            <input type="submit" name="submit" value="Submit" />
        </form>
    </body>
</html>



       對應的后臺的代碼如下:
<?php 

function output($var)
{
    echo "<xmp class='a-left'>";
    print_r($var);
    echo "</xmp>";
}

include_once 'parseexcel.class.php';

/* 處理上傳的文件 */
if ($_FILES["file"]["error"] > 0)
{
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  exit;
}
move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

/**
 * excel格式:
 * 
 * 姓名         | 性別
 * -----------------
 * ricky | 男
 * xxxxx | xxx
 */

/* 定義要讀取的列,數組的值需要和excel的每一行的標題一致或子集 */
$fileds = array(
        'name' => '姓名',
        'sex'  => '性別',
);

$parse = new parseExcel();

/* 從上傳的文件中解析出數據 */
$rows = $parse->excel2array($_FILES["file"]["name"], $fileds);

/* 注意: 測試導入的時候,打開這個注釋行,測試下載的時候需要關閉該注釋行 */
//output($rows);exit;

/* 將數據原封不動在寫入一個新的文件,供用戶下載 */
$data = new stdClass();

/* excel的文件名 */
$data->fileName = 'ceshi';
/* 頁簽的名字 */
$data->kind     = 'ceshi';
/* excel的標題 */
$data->fields   = $fileds;
/* 要寫入的數據 */
$data->rows     = $rows;

$parse->export2excel($data);



       上述事例只是完成了一個excel的上傳下載的基本功能,還有一些設置表格樣式、合并單元格等沒有體現在這里,大家可以參考PHPExcel的手冊,下面是我摘出來的PHPExcel的常見的一些操作,供大家參考:
創建excel
$objPHPExcel = new PHPExcel();

創建一個worksheet
$objPHPExcel->createSheet();
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objWriter-save('php://output');

保存excel(2007)
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
非2007格式:$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); 
$objWriter->save("xxx.xlsx");

直接輸出到瀏覽器供下載
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"{$fileName}.xls\"");
header('Cache-Control: max-age=0');
$excelWriter->save('php://output');

設置excel的屬性:
創建人
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
最后修改人
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
標題
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
題目
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
描述
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
關鍵字
$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");
種類
$objPHPExcel->getProperties()->setCategory("Test result file");

設置當前的sheet
$objPHPExcel->setActiveSheetIndex(0);

設置sheet的name
$objPHPExcel->getActiveSheet()->setTitle('Simple');

設置單元格的值
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String');
$objPHPExcel->getActiveSheet()->setCellValue('A1', 12);
$objPHPExcel->getActiveSheet()->setCellValue('A1', true);
$objPHPExcel->getActiveSheet()->setCellValue('A1', '=SUM(C2:C4)');
$objPHPExcel->getActiveSheet()->setCellValue('A1', '=MIN(B2:C5)');

合并單元格
$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');

分離單元格
$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');

設置寬度
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);

設置字體
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);

設置對齊方式
$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);
$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

設置單元格border
$objPHPExcel->getActiveSheet()->getStyle('D1')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

設置border的color
$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getLeft()->getColor()->setARGB('FF993300');;
$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getRight()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getBottom()->getColor()->setARGB('FF993300');

設置填充顏色
$objPHPExcel->getActiveSheet()->getStyle('F1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('F1')->getFill()->getStartColor()->setARGB('FF808080');

加載圖片
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Logo');
$objDrawing->setDescription('Logo');
$objDrawing->setPath('./images/officelogo.jpg');
$objDrawing->setHeight(36);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objDrawing = new PHPExcel_Worksheet_Drawing();



 本文由用戶 mww8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!