解决方案 »

  1.   

    1  你可以用varchar类型来存储,就不需要number_format了。
    2、var_dump(); 一下时间看看有不有变化。
      

  2.   


    1:输出的是
    string(19) "5.9335552883783E+14"
    varchar 类型 存入的也是 5.9335552883783E+14 没法用啊2:不变的
      

  3.   

    include 'Plugin/PHPExcel/Classes/PHPExcel/IOFactory.php';
    $excel = PHPExcel_IOFactory::load('2.xls');
    $sheet = $excel->getActiveSheet();
    echo $sheet->getCell('A1')->getValue(), ' ', $sheet->getCell('A2')->getValue();
    5.9335552883783E+14 41728.732916667读出来就是这样,该如何处理?
    想想再说
      

  4.   

    先解决时间的问题读出的时间是天数
    excel 的日期是从 1900-01-01 开始计算的(php 是从 1970-01-01)
    两者间有一个天数差 25569
    时间是格林威治时间
    所以有
    $d = 25569;
    $t = 24 * 60 * 60;
    echo gmdate('Y-m-d H:i:s', (41728.732916667 - $d) * $t);2014-03-30 17:35:24
      

  5.   

    解决科学计数法的问题
    echo $sheet->getCell('A1')->getValue(); //5.9335552883783E+14
    改成
    echo $sheet->getCell('A1')->getFormattedValue(); //593355528837832但这对日期效果不好
    echo $sheet->getCell('A2')->getFormattedValue();
    得 3/30/14 17:35
    还是差强人意点
      

  6.   

    getFormattedValue 不就是了吗?还要怎么样?
    Formatted 格式化
    getFormattedValue 就是读取在 excel 中看到的被格式化的数据593355528837832 在 excel 中本身就显示为 5.9335552883783E+14
    当需要显示成 593355528837832 时,你要设置单元格格式 
      

  7.   

    用excel解决方法试试,在数字签名添加一个标点  ‘
     
      

  8.   

     public function read($filename,$encode='utf-8'){
    //         vendor('Excel.PHPExcel');
            import('Org.Util.PHPExcel');
    //         $upload = \PHPExcel_IOFactory::
            $objReader = \PHPExcel_IOFactory::createReader(Excel5); 
            $objReader->setReadDataOnly(true); 
            $objPHPExcel = $objReader->load($filename); 
            $objWorksheet = $objPHPExcel->getActiveSheet(); 
            $highestRow = $objWorksheet->getHighestRow(); 
            $highestColumn = $objWorksheet->getHighestColumn(); 
            $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn); 
            $excelData = array(); 
            for ($row = 1; $row <= $highestRow; $row++) { 
                for ($col = 0; $col < $highestColumnIndex; $col++) { 
                    $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                } 
            } 
            return $excelData; 
            
        } 
        public function excel(){
            $this->display();    
        }
        public function runexcel(){
            if (! empty ( $_FILES ['file_stu'] ['name'] )) 
            
             {
                $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
                $file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );
                $file_type = $file_types [count ( $file_types ) - 1];
                 /*判别是不是.xls文件,判别是不是excel文件*/
                 if (strtolower ( $file_type ) != "xls")              
                {
                      $this->error ( '不是Excel文件,重新上传' );
                 }
                /*设置上传路径*/
                 $savePath = './Uploads/';
                /*以时间来命名上传的文件*/
                 $str = date ( 'Ymdhis' ); 
                 $file_name = $str . "." . $file_type;
                 /*是否上传成功*/
                 if (! copy ( $tmp_file, $savePath . $file_name )) 
                  {
                      $this->error ( '上传失败' );
                  }
                /*
            
                   *对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中
            
                  注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入
            
                */
              $res = $this->read ( $savePath . $file_name );
               /*
            
                    重要代码 解决Thinkphp M、D方法不能调用的问题   
            
                    如果在thinkphp中遇到M 、D方法失效时就加入下面一句代码
            
                */
    //            spl_autoload_register ( array ('Think', 'autoload' ) );
               
               /*对生成的数组进行数据库的写入*/
              unset($res[1]);
              $r = 0;
              $d = 25569;
              $t = 24 * 60 * 60;
               foreach ( $res as $k => $v ) 
               {
                   if ($k != 0) 
                  {
                  
                      $data ['order_number'] = $v[0];
                      $data ['member_name'] = $v[1];
                      $data ['member_alipay'] = $v[2];
                      $data ['member_payment'] = $v[3];
                      $data ['member_postage'] = $v[4];
                      $data ['membe_integral'] = $v[5];
                      $data ['aggregate_amount'] = $v[6];
                      $data ['rebate_integral'] = $v[7];
                      $data ['member_actual_payments'] = $v[8];
                      $data ['member_actual_integral'] = $v[9];
                      $data ['order_status'] = $v[10];
                      $data ['member_message'] = $v[11];
                      $data ['consignee_name'] = $v[12];
                      $data ['consignee_address'] = $v[13];
                      $data ['Shipping_method'] = $v[14];
                      $data ['telephone_number'] = $v[15];
                      $data ['mobile_phone'] = $v[16];
                      $va = gmdate('Y-m-d H:i:s', ($v[17]- $d) * $t);
                      $vb = gmdate('Y-m-d H:i:s', ($v[18]- $d) * $t);
                      $data ['create_time'] = strtotime($va);
                      $data ['payment_time'] = strtotime($vb);
                      $data ['baby_title'] = $v[19];
                      $data ['baby_species'] = $v[20];
                      $data ['logistics_number'] = $v[21];
                      $data ['logistics_company'] = $v[22];
                      $data ['order_res'] = $v[23];
                      $data ['boby_number'] = $v[24];
                      $data ['shop_id'] = $v[25];
                      $data ['shop_name'] = $v[26];
                      $data ['order_closure'] = $v[27];
                      $data ['seller_service_fee'] = $v[28];
                      $data ['buyers_service_fee'] = $v[29];
                      $data ['commercial_invoice'] = $v[30];
                      $data ['phone_orders'] = $v[31];
                      $data ['Phase_order_information'] = $v[32];
                      $data ['deposit_ranking'] = $v[33];
                      $data ['modified_sku'] = $v[34];
                      $data ['modified_orders_address'] = $v[35];
                      $data ['error_info'] = $v[36];
    //                    show_bug($data);die;
                      
                      $r++;
                      $result = M ( 'financial' )->add ( $data ); 
                      
                      
                     if (! $result) 
                     {
                          $this->error ( '导入数据库失败' );
                      }
                  }
               }
               $this->success("导入成功,共导入" . $r . "条数据" ,U('excel'),3);
            }
        }
    我的代码好像用不了getFormattedValue();设置单元格格式 已经试过了 没有用
      

  9.   

    把你弟16 行的 getValue() 换成 getFormattedValue()
    另外你这个大数也已经超出 mysql int 类型的表示范围,应使用 vchar 或 blogint 
      

  10.   


    我把 16行改成getFormattedValue()  ,没反应
    112行取消注释 show_dug 就是var_dump 打印$data , $res
    都是显示
    ["order_number"]=>
      string(19) "5.9335552883783E+14"数据类型已经是varchar(25)了
      

  11.   

    可能与你的 excel 文件有关
    我的代码是基于 #4 贴图示意的
      

  12.   

    不会吧 我的excel 就是这样的啊
      

  13.   

    你可以把你的 xls 文件放到云盘上,只要几行就可以了
      

  14.   

    好的哦
    http://yunpan.cn/QNeRvzh56XrI6 (访问密码:a3ac)
      

  15.   

    php读取excel的时候把这数字当成了数值类型,有没有办法在读取的时候强制指定为字符串类型?
      

  16.   

    $excel = PHPExcel_IOFactory::load('test.xls');
    $sheet = $excel->getActiveSheet();$w = $sheet->getHighestColumn(); //取得最大的列号
    $h = $sheet->getHighestRow(); //取得一共有多少行//列与字段对照表
    $dict = array(
      'A' => 'order_number',
      'B' => 'member_name',
      'C' => 'member_alipay',
      'D' => 'member_payment',
      'E' => 'member_postage',
      'F' => 'membe_integral',
      'G' => 'aggregate_amount',
      'H' => 'rebate_integral',
      'I' => 'member_actual_payments',
      'J' => 'member_actual_integral',
      'K' => 'order_status',
      'L' => 'member_message',
      'M' => 'consignee_name',
      'N' => 'consignee_address',
      'O' => 'Shipping_method',
      'P' => 'telephone_number',
      'Q' => 'mobile_phone',
      'R' => 'create_time',
      'S' => 'payment_time',
      'T' => 'baby_title',
      'U' => 'baby_species',
      'V' => 'logistics_number',
      'W' => 'logistics_company',
      'X' => 'order_res',
      'Y' => 'boby_number',
      'Z' => 'shop_id',
      'AA' => 'shop_name',
      'AB' => 'order_closure',
      'AC' => 'seller_service_fee',
      'AD' => 'buyers_service_fee',
      'AE' => 'commercial_invoice',
      'AF' => 'phone_orders',
      'AG' => 'Phase_order_information',
      'AH' => 'deposit_ranking',
      'AI' => 'modified_sku',
      'AJ' => 'modified_orders_address',
      'AK' => 'error_info',
    );
    $w++; //最大的列号加一
    for($y=2; $y<=$h; $y++) { //按行读取
      $t = array();
      for($x='A'; $x!=$w; $x++) {
        if($y == 1) $t[$dict[$x]] = $sheet->getCell("$x$y")->getValue();
        elseif(in_array($x, array('R', 'S'))) {
          $d = $sheet->getCell("$x$y")->getValue();
          $t[$dict[$x]] = $d ? gmdate('Y-m-d H:i:s', ($d - 25569) * 86400) : '';
        }else $t[$dict[$x]] = $sheet->getCell("$x$y")->getFormattedValue();
      }
      print_r($t); //这里可做入库操作
    }
    都是这样的格式Array
    (
        [order_number] => 593355528837832
        [member_name] => wangfeilixin123
        [member_alipay] => [email protected]
        [member_payment] => 296
        [member_postage] => 12
        [membe_integral] => 0
        [aggregate_amount] => 308
        [rebate_integral] => 0
        [member_actual_payments] => 0
        [member_actual_integral] => 0
        [order_status] => 交易关闭
        [member_message] => 
        [consignee_name] => 王飞
        [consignee_address] => 辽宁省 葫芦岛市 绥中县 肖家菜市场东门王艳海鲜行(125200)
        [Shipping_method] => 快递
        [telephone_number] => 
        [mobile_phone] => 18204296511
        [create_time] => 2014-03-30 17:35:24
        [payment_time] => 
        [baby_title] => 
        [baby_species] => 0
        [logistics_number] => 
        [logistics_company] => 
        [order_res] => 
        [boby_number] => 0
        [shop_id] => 0
        [shop_name] => 
        [order_closure] => 买家未付款
        [seller_service_fee] => 0
        [buyers_service_fee] => 0元
        [commercial_invoice] => 
        [phone_orders] => 手机订单
        [Phase_order_information] => 
        [deposit_ranking] => 
        [modified_sku] => 
        [modified_orders_address] => 
        [error_info] => 
    )
      

  17.   

    你 #10 的代码不是在循环里面 $result = M ( 'financial' )->add ( $data ); 的吗?
    在 print_r($t); 的位置
    $result = M ( 'financial' )->add ( $t );
    不就可以了吗
      

  18.   

    多谢啊 导入成功了,
    可是'R' => 'create_time',  'S' => 'payment_time', 这2个字段在数据库显示都是为2014 ,没有的就是为空   
      

  19.   

    [create_time] => 2014-03-30 17:35:24
    可能是你的字段不是 datetime 或 vchar 吧?
      

  20.   

    我用的int  ,那我试试varchar
      

  21.   

    用 int 也是可以的,就是unix时间戳了
    gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)
    改为
    ($d - 25569) * 86400
      

  22.   

    哦 想起来来了 我用int 是因为我想用时间戳, 我转成时间戳保证到数据库就好了. 
    varchar 型的 时间 可以作为分页排序的判断条件吗?
      

  23.   

    varchar 型的时间,做判断时比较麻烦
      

  24.   

    我想以时间戳的形式存 
    写成
    $t[$dict[$x]] = $d ? strtotime(gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)) : '';
    可是怎么手机号变成负数时间戳了, 2014 还是有  用的int(10)
      

  25.   

    转换时间戳没有那么麻烦,#27已经给了手机号应该是 varchar 类型或无符号整型
      

  26.   

    现在就是手机就是 varchar(60)啊
      

  27.   

    现在 只有2个异常   数据中 
    手机号(mobile_phone)显示 1.5728490093888e15  
    订单付款时间(payment_time)  有值显示 2014  没值显示0
      

  28.   

    真服了你了!
    手机号 是Q列,怎么能做时间戳换算呢?
    订单付款时间 是S列,为什么不做时间戳换算呢?数组 $dict 是列号与字段名的对照,不要弄错了
    if(in_array($x, array('R', 'S'))) 是判断当前列是否需要做特殊处理(比如转换成时间戳)