Home > Backend Development > PHP Tutorial > 用php 解析execl 的问题? + 急急急急急急

用php 解析execl 的问题? + 急急急急急急

WBOY
Release: 2016-06-23 14:16:51
Original
913 people have browsed it

PHP 解析execl

我php 解析execl 我用的是 php-excel-reader 工具 来解析的,但是 我现在的情况是这样的
问题一:我在读取execl 时发现读取出来的 execl 里面带有星号( * ) ,所以在存入数据库时,也是
有星号的,我想的办法是 将读取出来的星号,用空格代替,但是在存入数据库时,还是不行,不知道是不是我
的替代的位置写的不对。。

问题二:重点
客户给出的execl 里面分上下2 部分,上面 是一张表中的数据,下面是另一张表中的数据,所以就是下解析这儿execl 时,要将这execl 上面的数据 对应的存到对应的表中,下面的内容,存到对应的表中,就是说

execl :

上面 :A 表的内容

下面 :B 表的内容

现在要将execl 里面解析到的数据 ,对应的存入到对应的表中。。

回复讨论(解决方案)

没有人朋友知道的。忘指点 

不会用php解析excel

不过如果急着用的话,又如果客户给出的excel表数量很有限的话

可以用navicat这个软件直接将表存入数据库 然后再用PHP来操作

我之前就是这样做的,绕开了自己不明白的地方.... 虽然对技术提升不利但是对于追求结果来说挺有效的...

另:navicat的导入功能很强大......

1)你通过PHP读取excel数据,除去表头的一行数据,那剩下的就是实际数据,根据判断是否有*号,替换就可。
2)你可以将上下表的内容分别存储到两个不同的excel中,分别读取信息即可。

回复 3 楼 的朋友,您给出的第1分方法是对的,正解, 第2个方法,将他们分成2个execl ,这样主要是客户部同意,说用软件就是简化操作,这样跟没有有什么区别。。我只能在想其他办法了。。。谢谢

回复 2 楼的朋友, navicat这个是 mysql 的一个开发工具,我是要将execl 上传后再存入数据库的,你给出的这个方法不是很好。。谢谢

第二个问题,最好的办法是一个sheet保存一个表的数据,这样导入时比较容易解释。如果实在要在一个sheet里保存两个表的数据,那么也可以定义好分隔条件(比如两个表中间空开2行),然后循环处理行,判断行是否分隔行,分隔行后的就是第二个表的数据了。

回复 6 楼  ,恩,您的这个想法还是不错了,我考虑下,在写代码。。谢谢 


效果是这样的 :当循环到 9920000 (河南省小计) 这里就停止了,因为不能将这条数据插入到数据库里面,应该是到这里就终止,并跳到下一次循环。我使用了break; ,continue; 这2个退出循环,都是将空值插入到数据库里面了。求我哪里写错了,我这里写的是循环 【 月销售计划 】这列,当到  9920000 就应该停止。
 

if($month_sales_plan=$data->sheets[0]['cells'][8][2]){
$month_sales_plan;
echo $month_sales_plan;
                        break;

 }
 else{
$month_sales_plan=$data->sheets[0]['cells'][$i][5];
 }

没看明白你的代码,建议:导入的excel表,必须是按规定格式的,而这个格式必须是程序可以解释的,然后在程序中解释成你要的数据就可以了。

其实我的需求是:大家可以看 8 楼 的图片,就是循环当遇到 小计,合计这样的字段时,就跳过,继续循环。。一直到循环结束。

即既没有给出代码,也没给出数据文件
只好做个示例了

$PHPExcel = new PHPExcel_Reader_Excel5();$sheet = $PHPExcel->load('test1.xls')->getActiveSheet();$allRow = $sheet->getHighestRow();for($i=1; $i<=$allRow; $i++) {  if($sheet->getCell("B$i")->getValue() != '')     echo $sheet->getCell("B$i")->getValue() . ' : ' . $sheet->getCell("C$i")->getValue(), '<br>';}
Copy after login
A : 4650000
B : 2480000
C : 2790000
D : 8370000
E : 2790000
F : 26660000

应该能看明白吧?!

11 楼的兄弟,我有点不明白, 您用的是什么工具phpexecl 吗??,我用的是excel_reader2.php 这个文件,phpexecl 我刚才下载了个1.7.9 版本的,我用我的 excel_reader2.php  不行 ,现在用phpexecl1.7.9版本运行您的代码,效果是这样的,如下图,里面没有数据,

11楼的朋友, 通过  echo $sheet->getCell("B$i")->getValue() 能取出对应的值,但是跟小计,跳过有什么关系,我没明白。。忘 指点。。

西气东输天然气购销日报表 : 
报表日期:5月27日8时至5月28日8时 : 
销气量(Nm3) : 
用户名称 : 
月销售计划1 : 河 南 省
46500002 : 
24800003 : 
2790000河南省小计 : 
=SUM(E5:E7)1 : 安 徽 省
83700002 : 
27900003 : 
26660000安徽省小计 : 
=SUM(E9:E11)1 : 江 苏 省

11 楼的兄弟, 我在里面加了一句输出的 语句 echo $sheet->getCell("E$i")->getValue()."
";

这里可能会出现一种情况,就是 月销售计划里面的   4650000,2480000,2790000 这些可能每个execl里面的内容不同所以根据 $sheet->getCell("E$i")->getValue() 来取肯定是不准确的,所以做好是根据小计,或=SUM 这样的字眼 去判断,也就是到 这样的字眼时,就跳过,继续循环,这个我就不会了,我写的判断好像不起作用。。

效果:
月销售计划
4650000
2480000
2790000
=SUM(E5:E7)
8370000
2790000
26660000
=SUM(E9:E11)
4650000
15500000
8680000
6200000
310000
2790000
3720000
4030000
3100000
4960000
2170000
1550000
2480000
3720000
1550000
=SUM(E13:E27)
6200000
6200000
4650000
4650000
1240000
1240000
=SUM(E8,E12,E28,E30,E32,E34)

具体应依据哪列去读哪列,与你的 execl 文件有关
我没看到,不好说

不是,我不知道要怎么去写这个判断语句。。

11 楼的兄弟,您看看这个execl , 怎么让, execl 中的 所有小计行,在存入数据库时,都不存数据库,

 求  解析execl 出现 这样的execl 的函数, SUM(J9:J11) ,怎么办,怎么将他转为对应的 具体数值。。求

当execl 中使用了SUM 这样的函数,解析出来的 就是如下图所示的

来个php 的大神,求解决方案,不胜感激

把你的 execl 文件放在公网上,并分享出来

22 楼的朋友, 我上传了,网址  http://download.csdn.net/my

22 楼的朋友, 我上传到我的  【资源】 里面了,您帮忙看下,我不知道为什么 解析出来的会是 函数。而不是数字,

还是没人回复我啊 

11 楼的兄弟,您看看这个execl , 怎么让, execl 中的 所有小计行,在存入数据库时,都不存数据库,

$data=array();//保存读到的数据
$cols;//列坐标 eg:A,B,C......。phpexcel有提供方法获得
$totalLine;//总行数,phpexcel有提供方法获得
$line=1;
for($line ;$line       $row=array();//一行数据
      foreach($cols as $col){
          $coor=$col.$line;//坐标 eg:A1,B1,C1.....
          $value;//通过phpexcel提供的方法拿到的对应$coor的值
          if(preg_match('/小计/',$value)){//此处做判断,
               break; //如果读到“小计”则换行
          }else{
              $row[]=$value;
          }
      }
      $data[$line]=$row;
}

//接下来把$data保存进数据库就ok了








恩,谢谢,我在试试

这么规则的excel表格,怎么不好读取了。如果怕直接插入有问题,可以将循环出来的数组存数组,手动筛除不需要的数据,避免逻辑判断(什么时候跳出循环。。),基本上也就很快搞定了。

28 楼 的朋友  手动筛选?? 不是很里面, 我不会是读取出来后,在让客户区筛选哪些存数据库吧,这样客户会不爽的。。

当读取到小计一行跳过啊··· 合并过的又不规则,要吗你转成cvs好很多

· 合并过的又不规则,要吗你转成cvs好很多???? 为什么要转成cvs 的?转成cvs 的就没有了吗?我是想,判断如果读到合计这样的字样就跳过。

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template