ホームページ > バックエンド開発 > PHPチュートリアル > PHPExcelライブラリに基づくEXCELのインポートとエクスポート

PHPExcelライブラリに基づくEXCELのインポートとエクスポート

WBOY
リリース: 2016-06-23 13:32:23
オリジナル
1191 人が閲覧しました

X e PHPEXCEL クラスは、PHP と Excel のテーブル処理プラグインです。最近、Excel のインポートとインポート機能を完了する必要があるため、このプラグインを使用しました。ここでメインのロジックを整理して共有します。必要に応じて参照してください。

次の例では、Excel のアップロードとダウンロードの基本的な機能のみが完了しています。ここには反映されていないテーブル スタイルの設定やセルの結合などのいくつかの操作もあります。次の例は PHPExcel I です。参考までにいくつかの一般的な操作を示します:

PHPExcel が提供する API を、必要に応じてアップロードおよびダウンロード用のクラスにカプセル化します。実際には、アップロード用とダウンロード用の 2 つの関数があります。投稿しました。

<?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 はなく、ファイル スペースと送信ボタンのみです。以下に示すように:

<!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 の一般的な操作をいくつか示します。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート