phpoffice/phpspreadsheet 操作导入导出

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:05   189   0
<p>下载phpoffice/phpspreadsheet</p>
<pre class="blockcode"><code class="language-html hljs">composer require phpoffice/phpspreadsheet 1.8.2</code></pre>
<p>这个版本兼容PHP5和PHP7</p>
<p>1、新建Excel.php文件</p>
<pre class="blockcode"><code>&lt;?php


namespace app\admin\controller;


use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use think\Controller;

class Excel extends Controller
{
    /**
     * 使用PHPEXECL导入
     *
     * &#64;param string $file      文件地址
     * &#64;param int    $sheet     工作表sheet(传0则获取第一个sheet)
     * &#64;param int    $columnCnt 列数(传0则自动获取最大列)
     * &#64;param array  $options   操作选项
     *                          array mergeCells 合并单元格数组
     *                          array formula    公式数组
     *                          array format     单元格格式数组
     *
     * &#64;return array
     * &#64;throws Exception
     */
    function importExecl($file &#61; &#39;&#39;, $sheet &#61; 0, $columnCnt &#61; 0, &amp;$options &#61; [])
    {
        try {
            /* 转码 */
            $file &#61; iconv(&#34;utf-8&#34;, &#34;gb2312&#34;, $file);

            if (empty($file) OR !file_exists($file)) {
                $msg[&#39;code&#39;] &#61; 0;
                $msg[&#39;tips&#39;] &#61; &#39;文件不存在!&#39;;
                return $msg;
                //throw new \Exception(&#39;文件不存在!&#39;);
            }

            /** &#64;var Xlsx $objRead */
            $objRead &#61; IOFactory::createReader(&#39;Xlsx&#39;);

            if (!$objRead-&gt;canRead($file)) {
                /** &#64;var Xls $objRead */
                $objRead &#61; IOFactory::createReader(&#39;Xls&#39;);

                if (!$objRead-&gt;canRead($file)) {
                    $msg[&#39;code&#39;] &#61; 0;
                    $msg[&#39;tips&#39;] &#61; &#39;只支持导入Excel文件!&#39;;
                    return $msg;
                    //throw new \Exception(&#39;只支持导入Excel文件!&#39;);
                }
            }

            /* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取Excel效率 */
            empty($options) &amp;&amp; $objRead-&gt;setReadDataOnly(true);
            /* 建立excel对象 */
            $obj &#61; $objRead-&gt;load($file);
            /* 获取指定的sheet表 */
            $currSheet &#61; $obj-&gt;getSheet($sheet);

            if (isset($options[&#39;mergeCells&#39;])) {
                /* 读取合并行列 */
                $options[&#39;mergeCells&#39;] &#61; $currSheet-&gt;getMergeCells();
            }

            if (0 &#61;&#61; $columnCnt) {
                /* 取得最大的列号 */
                $columnH &#61; $currSheet-&gt;getHighestColumn();
                /* 兼容原逻辑,循环时使用的是小于等于 */
                $columnCnt &#61; Coordinate::columnIndexFromString($columnH);
            }

            /* 获取总行数 */
            $rowCnt &#61; $currSheet-&gt;getHighestRow();
            $data   &#61; [];

            /* 读取内容 */
            for ($_row &#61; 1; $_row &lt;&#61; $rowCnt; $_row&#43;&#43;) {
                $isNull &#61; true;

                for ($_column &#61; 1; $_column &lt;&#61; $columnCnt; $_column&#43;&#43;) {
                    $cellName &#61; Coordinate::stringFromColumnIndex($_column);
                    $cellId   &#61; $cellName . $_row;
                    $cell     &#61; $currSheet-&gt;getCell($cellId);

                    if (isset($options[&#39;format&#39;])) {
                        /* 获取格式 */
                        $format &#61; $cell-&gt;getStyle()-&gt;getNumberFormat()-&gt;getFormatCode();
                        /* 记录格式 */
                        $options[&#39;format&#39;][$_row][$cellName] &#61; $format;
                    }

                    if (isset($options[&#39;formula&#39;])) {
                        /* 获取公式,公式均为&#61;号开头数据 */
                        $formula &#61; $currSheet-&gt;getCell($cellId)-&gt;getValue();

                        if (0 &#61;&#61;&#61; strpos($formula, &#39;&#61;&#39;)) {
                            $options[&#39;formula&#39;][$cellName . $_row] &#61; $formula;
                        }
                    }

                    if (isset($format) &amp;&amp; &#39;m/d/yyyy&#39; &#61;&#61; $format) {
                        /* 日期格式翻转处理 */
                        $cell-&gt;getStyle()-&gt;getNumberFormat()-&gt;setFormatCode(&#39;yyyy/mm/dd&#39;);
                    }

                    $data[$_row][$cellName] &#61; trim($currSheet-&gt;getCell($cellId)-&gt;getFormattedValue());

                    if (!empty($data[$_row][$cellName])) {
                        $isNull &#61; false;
                    }
                }

                /* 判断是否整行数据为空,是的话删除该行数据 */
                if ($isNull) {
                    unset($data[$_row]);
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP