我创建了一个从.xls文件中读取数据并将其转换为.csv的脚本,然后我有一个脚本,它接受.csv并将其放入一个数组中,然后我有一个带有foreach循环的脚本并且最后应该回显结束变量,但它没有回声,只是一个空白页面。该文件写得很好,这是肯定的,但我不知道脚本是否读取了csv,因为如果我在读取后放入一个echo,它只会返回空白。
这是我的代码:
<?php
ini_set('memory_limit', '300M');
$username = 'test';
function convert($in) {
require_once 'Excel/reader.php';
$excel = new Spreadsheet_Excel_Reader();
$excel->setOutputEncoding('CP1251');
$excel->read($in);
$x=1;
$sep = ",";
ob_start();
while($x<=$excel->sheets[0]['numRows']) {
$y=1;
$row="";
while($y<=$excel->sheets[0]['numCols']) {
$cell = isset($excel->sheets[0]['cells'][$x][$y]) ? $excel->sheets[0]['cells'][$x][$y] : '';
$row.=($row=="")?"\"".$cell."\"":"".$sep."\"".$cell."\"";
$y++;
}
echo $row."\n";
$x++;
}
return ob_get_contents();
ob_end_clean();
}
$csv = convert('usage.xls');
$file = $username . '.csv';
$fh = fopen($file, 'w') or die("Can't open the file");
$stringData = $csv;
fwrite($fh, $stringData);
fclose($fh);
$maxlinelength = 1000;
$fh = fopen($file);
$firstline = fgetcsv($fh, $maxlinelength);
$cols = count($firstline);
$row = 0;
$inventory = array();
while (($nextline = fgetcsv($fh, $maxlinelength)) !== FALSE )
{
for ( $i = 0; $i < $cols; ++$i )
{
$inventory[$firstline[$i]][$row] = $nextline[$i];
}
++$row;
}
fclose($fh);
$arr = $inventory['Category'];
$texts = 0;
$num2 = 0;
foreach($inventory['Category'] as $key => $value) {
$val = $value;
if (is_object($value)) { echo 'true'; }
if ($value == 'Messages ') {
$texts++;
}
}
echo 'You have used ' . $texts . ' text messages';
?>
答案 0 :(得分:2)
一旦你回来了。你不能在函数中做任何其他事情:
return ob_get_contents();
ob_end_clean();//THIS NEVER HAPPENS
因此ob
永远不会刷新,也不会有任何输出。
答案 1 :(得分:0)
我看到那里有很多重复无用的操作。为什么不简单地使用从Excel文件中提取的数据构建数组?然后,您可以使用fputcsv()
写出该数组,而不是自己构建CSV字符串。
然后将csv写入文件,然后读回文件并将其处理回数组。这引出了一个问题......为什么?在您从excel文件中读取的那一刻,您已经获得了原始的单个数据位,那么为什么所有这些花哨的礼物包装只会将它们全部分开?