1. 程式人生 > 實用技巧 >PHPSpreadsheet資料的寫入和讀取Excel

PHPSpreadsheet資料的寫入和讀取Excel

1、使用composer安裝

composer require phpoffice/phpspreadsheet

2、寫入Excel

common(應用公共檔案,app/common.php),方便呼叫:

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

function exportData($head, $body, $name = '', $version = '2007',$title='Export Data')
{
    try {
        // 輸出 Excel 檔案頭
if(empty($name)){ $name =date('Y-m-d-H-i-s'); } $spreadsheet = new Spreadsheet(); $sheetPHPExcel = $spreadsheet->setActiveSheetIndex(0); $char_index = range('A', 'Z');//陣列,從A-Z //處理超過26列 $a = 'A'; foreach ($char_index as
$item){ $char_index[] = $a . $item; } // Excel 表格頭 foreach ($head as $key => $val) { $sheetPHPExcel->setCellValue("{$char_index[$key]}1", $val); } $spreadsheet->getActiveSheet()->setTitle($title); // Excel body 部分 foreach
($body as $key => $val) { $row = $key + 2; $col = 0; foreach ($val as $k => $v) { $spreadsheet->getActiveSheet()->setCellValue("{$char_index[$col]}{$row}", $v); $col++; } } // 版本差異資訊 $version_opt = [ '2007' => [ 'mime' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'ext' => '.xlsx', 'write_type' => 'Xlsx', ], '2003' => ['mime' => 'application/vnd.ms-excel', 'ext' => '.xls', 'write_type' => 'Xls', ], 'pdf' => ['mime' => 'application/pdf', 'ext' => '.pdf', 'write_type' => 'PDF', ], 'ods' => ['mime' => 'application/vnd.oasis.opendocument.spreadsheet', 'ext' => '.ods', 'write_type' => 'OpenDocument', ], ]; header('Content-Type: ' . $version_opt[$version]['mime']); header('Content-Disposition: attachment;filename="' . $name . $version_opt[$version]['ext'] . '"'); header('Cache-Control: max-age=0'); $objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx'); return $objWriter->save('php://output'); } catch (Exception $e) { return $e->getMessage(); } }

Index控制器:

    public function export(Article $model)
    {
        $header = ['編號', '標題', '內容'];

        $body = [];
        $data = $model::select();
//        halt($data);
        foreach ($data as $item) {
            $record = [];
            $record['id'] = $item->id;
            $record['title'] = $item->title;
            $record['content'] = $item->content;
            $body[] = $record;
        }
        return exportData($header, $body, 'Article_' . date('YmdHis'));
    }

3、讀取Excel

HTML,form裡有type='text'和type='file'

<script src="http://localhost/think/public/static/js/jquery-1.11.1.min.js"></script>
<form action="" enctype="multipart/form-data" id="document-form" method="post">
    <input type="text" name="id" id="id" value="11"/>
    <input type="file" name="file" id="file"/> <br><br><br>
</form>
<input type="submit" id="submit" value="上傳" />

如果直接使用serialize,是獲取不了type="file"的的資料,只能獲取type='text'的資料:

var formData= $("#document-form").serialize();

我們可以使用formData,這樣就可以獲取type="file"和type='text'的資料

//通過FormData建構函式建立一個空物件
var formData = new FormData();
//可以通過append()方法來追加資料
formData.append("file", $("#file")[0].files[0]);
formData.append("id", $("#id").val());

如果form裡有很多個type="file"和type='text',一個個新增到formData太麻煩;但可以通過迴圈全部新增

//$.fn.serializeFiles()=function(){}的呼叫把方法擴充套件到了物件的prototype上,所以例項化一個jQuery物件的時候,它就具有了這些方法。
    $.fn.serializeFiles = function() {
        var form = $(this),formData = new FormData();//通過FormData建構函式建立一個空物件
        var formParams = form.serializeArray();//帶有name和value的json,比如{name: "username1", value: "a"}

        //通過append()方法來追加資料,type="file"
        $.each(form.find('input[type="file"]'), function(i, tag) {
            $.each($(tag)[0].files, function(i, file) {
                formData.append(tag.name, file);
            });
        });

        //通過append()方法來追加資料,type="text"
        $.each(formParams, function(i, val) {
            formData.append(val.name, val.value);
        });

        return formData;
    };



    $("#submit").click(function () {
        var formData= $("#document-form").serializeFiles();

        $.ajax({
            url: "{:url('importE')}",
            data        : formData,
            cache       : false,
            type        : 'POST',
            processData : false, // 使資料不做處理
            contentType : false, // 不要設定Content-Type請求頭
            success: function(res){
                //成功之後
            }
        })
    })

注:ajax裡processData和contentType都設定false,否則報錯

Index控制器:

    //匯入Excel
    public function importE(){
        /*$spreadsheet = new Spreadsheet();
        $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file['tmp_name']);//載入excel
        $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);//讀取excel檔案內容
        halt($sheetData);*/

        // 獲取活動工作簿
        // 建立讀操作
        $file = $_FILES['file'];
        $param = $this->request->param();
        halt($file);
        $reader = IOFactory::createReader('Xlsx');

        // 開啟檔案 載入excel表格
        $spreadsheet = $reader->load($file['tmp_name']);
        $sheet = $spreadsheet->getActiveSheet();

        // 獲取內容的最大列 如:D
        $highest = $sheet->getHighestColumn();

        // 獲取內容的最大行 如:4
        $row = $sheet->getHighestRow();

        $data = [];// 用於儲存表格資料
        for ($i = 2; $i <= $row; $i++) {
            // 獲取行數的資料
            $rowData = [
                "title" => $sheet->getCellByColumnAndRow(2, $i)->getValue(),
                "content" => $sheet->getCellByColumnAndRow(3, $i)->getValue(),
            ];
            $data[] = $rowData;
        }

        //直接新增
        Article::insertAll($data);


        //或者把陣列轉換成JSON格式輸出
        $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
        return json($sheetData);
    }

我這篇文章只是簡單的介紹,如果想看詳解請看下面這篇文章,各種屬性和方法都有解釋:

PHP使用PhpSpreadsheet操作Excel例項詳解