【问题标题】:Format text to fit in columns in Excel格式化文本以适应 Excel 中的列
【发布时间】:2014-04-24 07:06:57
【问题描述】:

我在一个数组中有这个文本块:

"Stefan Olsson"
"Kungsvägen"
"Skolgatan"
xxxx-xx-xx
0735xxxxxx,
"Pär Davidsson"
"Skolgatan"
"Myntvägen"
xxxx-xx-xx
0709xxxxxx,

我将此类内容解析为 CSV 文件,以供以后在 Excel 中使用。但是,我想从该文本中提取以适应 Excel 中的不同列。所以,当我在 Execel 中打开 CSV 文件时,我希望名称在一列中,除 etcetc 之外的列中的地址。我怎样才能做到这一点?我应该使用 PHPExcel 吗?还是可以用普通的旧 PHP 来完成?

这是我的 PHP 代码

$gatunamn = $_POST['gata'];
$ort = $_POST['omrade'];
$csv_data = array();



$newSpider->fetchPage($gatunamn, $ort, $offset=0);
$obj = json_decode($newSpider->html);


echo "<div id='rightcontent'><table id='one-column-emphasis'>";
echo "<th><input type='checkbox' name='csv_all' id='csv_all'></th><th>Namn</th><th>Adress</th><th>Adress2</th><th>Adress3</th><th>Personnummer</th><th>Telefonnummer</th><th>Telefonnummer2</th>";
$antal_sidor = round($obj->search->wp->totalHits / $obj->search->wp->pageSize); 
echo "<td></td>";
foreach($obj->search->wp->features as $fish) //Loopar ut 50st (pageSize)
{
    echo "<tr>";
    echo "<td><input type='checkbox' value='csv' class='csv'></td>";
    echo "<td>" . $fish->name . "</td>";
    $csv_data[] .= utf8_decode($fish->name);

    foreach($fish->addresses as $ad)
    {
        echo "<td>" . $ad->label . " " . $ad->postcode . " " . $ad->area . "</td>";
        $csv_data[] .= utf8_decode($ad->label . " " . $ad->postcode . " " . $ad->area);
    }   
    if(!empty($fish->dateOfBirth))
    {
        $convert_date = substr($fish->dateOfBirth, 0, -3); //Gör om datum från timestamp
        echo "<td>" . date("Y-m-d", $convert_date) . "</td>";
        $convert_datee = date("Y-m-d", $convert_date);
        $csv_data[] .= $convert_datee;


    }
    if(!empty($fish->phoneNumbers))
    {
        foreach($fish->phoneNumbers as $ph)
        {
            echo "<td>" . $ph . "</td>";
            $csv_data[] .= $ph . ",";

        }
    }       

    echo "</tr>";

}
echo "</table>";
$j = 0;
for($i = 1; $i <= $antal_sidor; $i++)
{
    echo  "<a href='curl2.php?gatunamn=$gatunamn&ort=$ort&offset=$j'>" . $i . "</a> ";
    $j += 100;
}
echo "</div>";
echo "<div id='debug'><pre>";   
    var_dump($csv_data);
echo "</pre></div>";

}
if(isset($_POST['export']))
{

    $fp = fopen("eniroo.csv","w");
    foreach(explode(",", implode("\n",$csv_data)) as $rad) {
       fputcsv($fp, array(implode(',', str_getcsv($rad, "\n"))));
    }
    echo "<div id='csv_info'>";
    echo "<a href='eniro.csv'>Hämta CSV-fil</a>";
    echo "</div>";


}

【问题讨论】:

  • 这可以在 php 中完成,但我认为您忘记了所需的输出示例。
  • @kevinabelita:想要的输出样本?输出如上所示。
  • 如果你只想写csv,那么使用PHP内置的fputcsv()函数就足够了;如果您需要样式、复杂公式、多个工作表或 MS Excel 的任何其他特殊功能,您只想使用 PHPExcel
  • 但是如果这是一大块文本,则需要将其重组为数组;无论您想使用 PHPExcel 还是 fputcsv(),这都适用
  • @MarkBaker:我已经有一个包含文本块的数组。

标签: php excel csv


【解决方案1】:
// Restructure the original array into rows
$myDataArray = array_chunk($myDataArray, 5);

// Then write to CSV
$fp = fopen('file.csv', 'w');
foreach($myDataArray as $dataRow) {
    fputcsv($fh, $dataRow);
}
fclose($fh)

【讨论】:

  • 感谢您的回答。它工作得很好。但有一个问题。正如您在此处看到的:pastebin.com/B1WyW45t,前 2 行是正确的,但第三行不正确,因为 Bryan 与 Elin 出现在同一行。它应该是与 bryan 的新行。任何想法?我认为的原因是一个人可以有两个地址,即5列,而一个人可能只有1个地址,结果只有4列。
  • 这也是我的 $dataRow 中的一个 var_dump:pastebin.com/KxtKq62k 如您所见,Bryan 与 Elin 在同一部分,这是错误的。如何用空字符串替换第 5 行?
  • 你可能想在分块之前遍历你的数组,检查一个额外的空条目需要插入的位置(即一条记录只有 4 个条目)
  • 是的,但是我该如何进行这种检查呢?我不知道如何完成这项检查。
  • 是的,但是我该如何进行这种检查呢?我不知道如何完成这项检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多