#php #mysql #csv
#php #mysql #csv
Вопрос:
Я экспортирую некоторые данные из опроса в CSV для использования другой командой с PHP. Я вывел свою первую строку данных как все заголовки. Но мне нужно, чтобы некоторые заголовки занимали 2 столбца, это вообще возможно.
Все заголовки указаны правильно, но мне нужно добавить две ячейки данных под некоторыми заголовками.
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=lite-survey-data_'.time().'.csv');
require_once ( dirname(dirname(dirname(dirname(__FILE__)))).'/wp-load.php' );
$content =build_csv_download();
$headings = convert_to_csv($content[0]);
$csv_content = convert_to_csv($content[1]);
$output = fopen('php://output', 'w');
fwrite($output, $headings);
fwrite($output, $csv_content);
Есть идеи?
Ответ №1:
Невозможно иметь заголовки, охватывающие два столбца, поскольку CSV — это такой базовый формат, который не позволяет вам представлять объединенные ячейки. Однако, если второй из двух столбцов не имеет заголовка (so heading,,nextheading
), то при открытии его в Excel он heading
переместится в пустую ячейку.
Комментарии:
1. Это может быть ответом, который я ищу. Я забываю, насколько примитивным иногда может быть файл .csv. Просто пытаюсь сейчас. Тем не менее, приветствую предложение.
Ответ №2:
CSV не поддерживает охват столбцов. Некоторые программы, такие как Excel, могут попытаться разобраться в пропущенных заголовках или других подобных трюках, но это не даст вам действительного CSV-файла. Смотрите https://www.rfc-editor.org/rfc/rfc4180
Объедините данные с помощью несущественной строки (например, пробела или дефиса) перед созданием данных CSV. По сути, вы просто берете два столбца данных и объединяете их в один.
Самый простой способ сделать это — использовать CONCAT
(docs) для объединения stings прямо из базы данных:
SELECT
id,
CONCAT(first_name, " " last_name) AS name,
email
FROM
users
/* Gives these results:
Array
(
[0] => Array
(
[id] => 1
[name] => Bob Someuser
[email] => bob@example.com
)
[1] => Array
(
[id] => 2
[name] => George Anotheruser
[email] => george@example.com
)
)
*/
Если вы не можете сделать это в запросе к базе данных, вы можете использовать array_walk
(docs), чтобы сделать это постфактум:
$headings = array(
'First heading',
'Second heading',
'Third heading'
);
$one_data = array(
'First data',
'Second',
'data',
'Third data'
);
$data = array();
for ($x=0;$x<10;$x )
$data[] = $one_data;
print 'Before fix:';
print_r($data);
function prepare_array (amp;$item) {
$item[1] = $item[1].' '.$item[2];
unset($item[3]);
}
array_walk($data, "prepare_array");
print '<br><br>After fix:';
print_r($data);
function csv_array (amp;$item) {
$item = implode(',', $item);
}
$csv = implode(',', $headings)."n";
array_walk($data, "csv_array");
$csv .= implode("n", $data);
print '<br><br>CSV:<br>'.$csv;
Ответ №3:
CSV не поддерживает распределение по столбцам, поэтому вам просто нужно будет поместить один и тот же заголовок поля поверх двух столбцов. Это не самая красивая вещь в мире, но и CSV — не самый гибкий формат в мире.