用phpexcel导,入,中目前出现2个数据格式问题 phpexcel 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1 你可以用varchar类型来存储,就不需要number_format了。2、var_dump(); 一下时间看看有不有变化。 1:输出的是string(19) "5.9335552883783E+14"varchar 类型 存入的也是 5.9335552883783E+14 没法用啊2:不变的 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读出来就是这样,该如何处理?想想再说 先解决时间的问题读出的时间是天数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 解决科学计数法的问题echo $sheet->getCell('A1')->getValue(); //5.9335552883783E+14改成echo $sheet->getCell('A1')->getFormattedValue(); //593355528837832但这对日期效果不好echo $sheet->getCell('A2')->getFormattedValue();得 3/30/14 17:35还是差强人意点 getFormattedValue 不就是了吗?还要怎么样?Formatted 格式化getFormattedValue 就是读取在 excel 中看到的被格式化的数据593355528837832 在 excel 中本身就显示为 5.9335552883783E+14当需要显示成 593355528837832 时,你要设置单元格格式 用excel解决方法试试,在数字签名添加一个标点 ‘ 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();设置单元格格式 已经试过了 没有用 把你弟16 行的 getValue() 换成 getFormattedValue()另外你这个大数也已经超出 mysql int 类型的表示范围,应使用 vchar 或 blogint 我把 16行改成getFormattedValue() ,没反应112行取消注释 show_dug 就是var_dump 打印$data , $res都是显示["order_number"]=> string(19) "5.9335552883783E+14"数据类型已经是varchar(25)了 可能与你的 excel 文件有关我的代码是基于 #4 贴图示意的 不会吧 我的excel 就是这样的啊 你可以把你的 xls 文件放到云盘上,只要几行就可以了 好的哦http://yunpan.cn/QNeRvzh56XrI6 (访问密码:a3ac) php读取excel的时候把这数字当成了数值类型,有没有办法在读取的时候强制指定为字符串类型? $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] => ) 你 #10 的代码不是在循环里面 $result = M ( 'financial' )->add ( $data ); 的吗?在 print_r($t); 的位置$result = M ( 'financial' )->add ( $t );不就可以了吗 多谢啊 导入成功了,可是'R' => 'create_time', 'S' => 'payment_time', 这2个字段在数据库显示都是为2014 ,没有的就是为空 [create_time] => 2014-03-30 17:35:24可能是你的字段不是 datetime 或 vchar 吧? 我用的int ,那我试试varchar 用 int 也是可以的,就是unix时间戳了gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)改为($d - 25569) * 86400 哦 想起来来了 我用int 是因为我想用时间戳, 我转成时间戳保证到数据库就好了. varchar 型的 时间 可以作为分页排序的判断条件吗? varchar 型的时间,做判断时比较麻烦 我想以时间戳的形式存 写成$t[$dict[$x]] = $d ? strtotime(gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)) : '';可是怎么手机号变成负数时间戳了, 2014 还是有 用的int(10) 转换时间戳没有那么麻烦,#27已经给了手机号应该是 varchar 类型或无符号整型 现在就是手机就是 varchar(60)啊 现在 只有2个异常 数据中 手机号(mobile_phone)显示 1.5728490093888e15 订单付款时间(payment_time) 有值显示 2014 没值显示0 真服了你了!手机号 是Q列,怎么能做时间戳换算呢?订单付款时间 是S列,为什么不做时间戳换算呢?数组 $dict 是列号与字段名的对照,不要弄错了if(in_array($x, array('R', 'S'))) 是判断当前列是否需要做特殊处理(比如转换成时间戳) 【Smarty】上传到服务器上,显示【无法载入】 大家看看得到文件的大小的函数 关于php中的HTTP_Request对象的 怎么修改购物车中商品的数量? 求大神给出一个GD库的大概描述 ubantu 下如何测试编写的php网页 imagejpeg()说不能打开文件。 php 如何返回sql(postgresql)查询的错误码 请问一个图片叠加问题 php为何无法连接Oracle? SlightPHP框架的PHP网站转移到IIS下如何配置 header已经发送,为什么还是返回false
2、var_dump(); 一下时间看看有不有变化。
1:输出的是
string(19) "5.9335552883783E+14"
varchar 类型 存入的也是 5.9335552883783E+14 没法用啊2:不变的
$excel = PHPExcel_IOFactory::load('2.xls');
$sheet = $excel->getActiveSheet();
echo $sheet->getCell('A1')->getValue(), ' ', $sheet->getCell('A2')->getValue();
5.9335552883783E+14 41728.732916667读出来就是这样,该如何处理?
想想再说
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
echo $sheet->getCell('A1')->getValue(); //5.9335552883783E+14
改成
echo $sheet->getCell('A1')->getFormattedValue(); //593355528837832但这对日期效果不好
echo $sheet->getCell('A2')->getFormattedValue();
得 3/30/14 17:35
还是差强人意点
Formatted 格式化
getFormattedValue 就是读取在 excel 中看到的被格式化的数据593355528837832 在 excel 中本身就显示为 5.9335552883783E+14
当需要显示成 593355528837832 时,你要设置单元格格式
// 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();设置单元格格式 已经试过了 没有用
另外你这个大数也已经超出 mysql int 类型的表示范围,应使用 vchar 或 blogint
我把 16行改成getFormattedValue() ,没反应
112行取消注释 show_dug 就是var_dump 打印$data , $res
都是显示
["order_number"]=>
string(19) "5.9335552883783E+14"数据类型已经是varchar(25)了
我的代码是基于 #4 贴图示意的
http://yunpan.cn/QNeRvzh56XrI6 (访问密码:a3ac)
$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] =>
)
在 print_r($t); 的位置
$result = M ( 'financial' )->add ( $t );
不就可以了吗
可是'R' => 'create_time', 'S' => 'payment_time', 这2个字段在数据库显示都是为2014 ,没有的就是为空
可能是你的字段不是 datetime 或 vchar 吧?
gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)
改为
($d - 25569) * 86400
varchar 型的 时间 可以作为分页排序的判断条件吗?
写成
$t[$dict[$x]] = $d ? strtotime(gmdate('Y-m-d H:i:s', ($d - 25569) * 86400)) : '';
可是怎么手机号变成负数时间戳了, 2014 还是有 用的int(10)
手机号(mobile_phone)显示 1.5728490093888e15
订单付款时间(payment_time) 有值显示 2014 没值显示0
手机号 是Q列,怎么能做时间戳换算呢?
订单付款时间 是S列,为什么不做时间戳换算呢?数组 $dict 是列号与字段名的对照,不要弄错了
if(in_array($x, array('R', 'S'))) 是判断当前列是否需要做特殊处理(比如转换成时间戳)