php fwrite to xls файл пустые ячейки не отображаются - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь записать данные, полученные из запроса SQL, в текстовый файл с разделителями табуляции. Но есть проблема, что, если есть пустая ячейка, она не регистрируется. и просто записывает следующий текст в пустую ячейку.

данные базы данных:

id    text    2ndText
1     1t1     2t1
2             2t2
3     1t3     2t3

превосходный вывод:

id    text            2ndText
1     1t1             2t1
2     2t2
3     1t3             2t3

код, который мы используем:

while ($row=mysql_fetch_row($Recordset1)) 
{ 
    $line=''; 
    $fc=0;
    for ($i=0;$i<$fields;$i++)
    {
        if (substr(strtoupper(mysql_field_name($Recordset1,$i)),0,7)!="DBSTACK")
        {
            if (strtoupper($_POST['checkbox'.$fc])==strtoupper(mysql_field_name($Recordset1,$i)))
            {   
                $value=$row[$i];
                if ((!isset($value)) | ($value == "")) 
                { 
                    $value = "\t"; 
                } else 
                { 
                    $value=str_replace('"','""',$value); 
                    $value='"'.$value.'"'."\t"; 
                } 
                $line.=$value;
            }
            $fc++;
        }
    } 
    $data.=trim($line)."\n"; 
} 
$data=str_replace("\r","",$data);
$TargetFileName="temp/".session_id().time().".xls";
$target=fopen($TargetFileName,"wb");
$XLData=$header."\n".$data;
fwrite($target,$XLData);
fclose($target);

, где $Recordset1 - результат запроса

В моем поиске решения это появилось как возможное решение, но это часто используемый фрагмент кода, поэтому я не хочу, чтобы оно слишком сильно менялось. Так есть ли более простое решение?

Изменение значения на \ n, если ячейка пуста, может быть решением, но это немного грязно.

Есть идеи?

1 Ответ

0 голосов
/ 05 сентября 2018

Я не собираюсь трогать код вашей базы данных десятифутовым шестом. Вы используете API базы данных, который устарел в течение многих лет; альтернативы были доступны в течение десятилетия. Используйте их .

Итак, мое первое предложение - использовать правильный API базы данных, который возвращает массив строк, проиндексированных по имени столбца. Намного легче пройти через цикл.

Я бы также предложил, чтобы в вашем запросе к базе данных были выбраны только нужные вам столбцы вместо SELECT *.

Если вы хотите записать файл CSV (технически TSV, но это нормально), вам следует использовать встроенную функцию fputcsv(), которая избавит вас от необходимости катиться по собственному средству записи CSV, и позволяет работать с массивами вместо строк.

Вы также должны сохранить его с расширением csv, чтобы избежать ошибок при попытке открыть его в Excel.

Но что касается проблемы, о которой вы спрашивали? Вы не пишете значение, когда есть пустое поле, просто разделитель табуляции. Как насчет:

if ((!isset($value)) | ($value == "")) { 
    $value = "\"\"\t"; 
}

PS $value всегда будет установлен, потому что вы устанавливаете его в строке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...