PHPExcel在Windows下出錯 修復方案

環境

Steps

  1. 安裝好PHPExcel,能夠使用composer安裝;php

  2. 第一個錯誤是phpzip庫沒有找到,ZipArchive and lib-zip.dll
    PHPExcel 依賴 lib_zip庫,須要在PHP的php.conf文件中打開。PHP5.3+默認有這個庫,可是XAMPP TMD竟然沒有。要看有沒有能夠打開 XAMPP_ROOT/php/ext/ (in Windows) 文件夾看有沒有 lib_zip.dll
    若是沒有能夠從 官網 下載,拖到 lib_zip.dll 上面的文件夾中。but,好像不行,須要從新編譯PHP。git

  3. PHPExcel內置的zip庫 PCLZIP
    phpexcel 有一個 Pclzip 類,做爲 lib_zip 缺失的狀況下的備胎,具體能夠看( from stackoverflow )
    須要在加載IOFactory方法前 添加一句PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);來切換到內置的zip庫。github

  4. 路徑有問題 Classes/Shared/ZipArchive.php
    可是內置的 Classes/Shared/ZipArchive.php 類有個不兼容Windows路徑的錯誤須要更正一下,在方法 public function getFromName($fileName)(141行)。
    找到的錯誤是傳進來的 $fileName 包含的路徑是這樣的の xl/_rels/workbook.xml.rels(即便在windows下也是斜線模式,*nix)可是實際在 $list 數組中的倒是Windows的反斜線風格 xl\_rels\workbook.xml.rels,斜線和反斜線不匹配,So 問題來了。
    須要在匹配的if判斷中添加反斜線的匹配!!!!!!!!!!!!!windows

# before
if (strtolower($list[$i]["filename"]) == strtolower($fileName) || strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
# after
if (strtolower($list[$i]["filename"]) == strtolower($fileName) || str_replace("/", "\u{5c}", strtolower($fileName)) == strtolower($list[$i]["filename"]) || strtolower($list[$i]["stored_filename"]) == strtolower($fileName) || str_replace("/", "\u{5c}", strtolower($fileName)) == strtolower($list[$i]["stored_filename"])) {
# \u{5c} is backslash

還會有一個問題就是 "**Variable contents is not defined", so 再小改一下數組

# before
        if ( is_array($extracted) && $extracted > 0 ) {
            $contents = $extracted[0]["content"];
        }
    return $contents;
#after
        $contents = "";
        if ( is_array($extracted) && $extracted > 0 ) {
            $contents = $extracted[0]["content"];
        return $contents;
        }
    return false;

如今能夠在PHP7(Windows)中使用了composer

相關文章
相關標籤/搜索