Php fwrite в файл xls пустые ячейки не отображаются

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

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

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

вывод excel:

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 - результат запроса

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

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

Любые идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

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

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

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

Это действительно устаревший код, который мы планируем решить. насчет ответа это сработало как шарм, спасибо.

freshrebel 07.09.2018 11:44

Другие вопросы по теме