专栏首页梦_之_旅【CSDN同名】PhpSpreadsheet读取excel【包含图片】

PhpSpreadsheet读取excel【包含图片】

composer require phpoffice/phpspreadsheet=1.8.2

安装 phpspreadsheet

$reader           = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); //实例化阅读器对象。
$spreadsheet      = $reader->load($filename);  //将文件读取到到$spreadsheet对象中
$sheet            = $spreadsheet->getSheet(0);//sheet
$highestColumn    = $sheet->getHighestColumn(); // 取得总列数
$highestRow       = $sheet->getHighestRow(); // 取得总行数
      for ($col = 1; $col <= $highestColumnIndex; ++$col) //列数是以A列开始
        {
            $column_name = $sheet->getCellByColumnAndRow($col, 1)->getFormattedValue();
            if(in_array($column_name,array_keys($format_column)))$column[] = ['clo' => $col,'key' => $format_column[$column_name]];
        }
        // 2 根据以上确定的列直接循环取值
        for ($row = 2; $row <= $highestRow; ++$row) //行号从1开始
        {
            $row_data = [];
            foreach ($column as $item){
                switch ($item['key']) {
                    case "tax":
                        $value = $sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue();
                        if(strpos($value, "%") > 0) $value = (float)$value/100;
                        $row_data[$item['key']] = $value;
                        break;
                    case "num" :
                        $row_data[$item['key']] = (int)$sheet->getCellByColumnAndRow($item['clo'], $row)->getCalculatedValue(true);
                        break;
                    case "money":
                        $res  = $sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue();
                        $row_data[$item['key']] =  str_replace(['¥', ','], '', $res);//一般先取出结果,然后自己处理比较方便。
                        break;
                    case "time":
                        $date = $sheet->getCellByColumnAndRow($item['clo'], $row)->getValue();
                        if(!$date){
                            $row_data[$item['key']] = null;
                        }else{
                            $row_data[$item['key']] = gmdate('Y-m-d', ($date - 25569) * 24 * 3600); //gmdate返回UTC的时间
                        }
                        break;
                    default :
                        $row_data[$item['key']]= Common::trim($sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue());
                }
            }
            if(count($row_data) != count($format_column)) throw new ApiException(Code::EXCEL_FORMAT_ERROR);
            //空数据过滤
            $res_data[] = $row_data;
        }
        $this->filterData($res_data);
        return array_values($res_data);

//过滤空数据
    private function filterData(&$row_data)
    {
        foreach ($row_data as $key => $item){
            $is_null = false;
            foreach ($item as $iv) {
                if(!empty($iv)) {
                    $is_null = true;    break;
                }
            }
            if($is_null == false ) unset($row_data[$key]);
        }
    }

这里导入的时候会报错:

simplexml_load_string(): Entity: line 2: parser error : Input is not proper UTF-8...

我看到里边报错的地方在Properties.php,当我输出$propertyData是乱码的,所以对其进行转码

到了这里是没有任何问题的,但当我把写的转码删除居然又成功了,经过反复思考,我觉得是Properties.php这个文件的编码问题,当我用编辑器修改的时候,编码就变回正常的UTF-8了,个人想法是这样的,如果遇到不同看法的可以留言给我,谢谢!

作者:Mark 出处:https://mp.csdn.net/console/editor/html/105730455

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • easyui 分页组件的使用

    梦_之_旅
  • sea.js简单配置

    require(jquery); 内部处理是先替换 alias, 再替换 paths, 1) require('jquery') 当前解析为 jquer...

    梦_之_旅
  • 新安装的MySQL必须调整的10项配置

    还在为新安装的mysql服务,不知道修改哪些默认配置而发愁吗?mysql可调整参数有100多个,到底要立即!马上!调整哪些最重要的参数?

    梦_之_旅
  • 20181021_ARTS_week17

    Improving your Async functions with WebWorkers

    Bob.Chen
  • ConcurrentHashMap (JDK7) 详解

    tomas家的小拨浪鼓
  • 移除数组中指定的元素 原

    新建一个数组,把符合条件的数据通过push方法放进去比较简单,但是如果数据量比较多的时候就很消耗内存,性能比较差。现在有2种方法不重新创建数组,只改变原数组,完...

    tianyawhl
  • 算法09 五大查找之:哈希查找

    前面的几篇文章分别总结了:顺序查找、二分查找、索引查找、二叉排序树。这一篇文章要总结的是五大查找的最后一个:哈希查找(也称为散列查找)。提起哈希,我的第一印象就...

    nnngu
  • 秒杀商品超卖事故:Redis分布式锁请慎用!

    基于Redis使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。

    一个优秀的废人
  • 飞天茅台超卖事故:Redis分布式锁请慎用!

    基于 Redis 使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为 Redis 分布式锁造成的事故分析及解决方案。

    架构师修炼
  • 超卖 100 瓶茅台的事故分析

    本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。我们项目中的抢购订单采用的是分布式锁来解决的,有一次,运营做了一个飞天茅台的抢购...

    程序猿DD

扫码关注云+社区

领取腾讯云代金券