2011-11-11 4 views
2

PHP를 사용하는 다른 팀에서 사용할 수 있도록 설문 조사에서 CSV로 일부 데이터를 내보내는 중입니다. 첫 번째 행을 모든 표제로 출력했습니다. 하지만 2 열을 확장하려면 제목 중 일부가 필요합니다.PHP CSV 열 머리글

머리글은 모두 올바르게 입력되었지만 일부 머리글 아래에 두 개의 데이터 셀을 추가해야합니다.

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); 

아이디어가 있으십니까?

답변

0

CSV는 열 확장을 지원하지 않습니다. Excel과 같은 일부 프로그램은 누락 된 제목이나 다른 트릭을 이해하려고 시도하지만 유효한 CSV 파일을 남겨 두지는 않습니다. http://tools.ietf.org/html/rfc4180

CSV 데이터를 만들기 전에 중요하지 않은 문자열 (공백이나 하이픈과 같은)으로 데이터를 연결하십시오. 기본적으로 두 개의 데이터 열을 가져 와서 하나의 열로 만드는 것입니다.

SELECT 
     id, 
     CONCAT(first_name, " " last_name) AS name, 
     email 
    FROM 
     users 

/* Gives these results: 
    Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [name] => Bob Someuser 
       [email] => [email protected] 
      ) 

     [1] => Array 
      (
       [id] => 2 
       [name] => George Anotheruser 
       [email] => [email protected] 
      ) 

    ) 
*/ 

데이터베이스 쿼리에, 당신은 array_walk를 사용할 수있는 당신이 할 수없는 경우

이 작업을 수행하는 가장 쉬운 방법은 바로 데이터베이스에서 독침을 결합 CONCAT (docs)를 사용하는 것입니다 (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 (&$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 (&$item) { 
    $item = implode(',', $item); 
} 
$csv = implode(',', $headings)."\n"; 
array_walk($data, "csv_array"); 
$csv .= implode("\n", $data); 

print '<br><br>CSV:<br>'.$csv; 
1

CSV는 병합 된 셀을 나타낼 수없는 기본 형식이므로 제목이 두 열에 걸쳐있을 수 없습니다. 그러나 두 개의 열 중 두 번째 열에 헤더가 없으면 (heading,,nextheading) Excel에서 열면 heading이 빈 셀로 퍼집니다.

+0

이것은 내가 원하는 답변 일 수 있습니다. 나는 원시 .csv가 얼마나 시간에있을 수 있는지 잊는다. 지금 시도해보십시오. 생각에 대한 건배. – David

0

CSV는 열 스패닝을 지원하지 않으므로 두 열의 맨 위에 동일한 필드 머리글을 넣으면됩니다. 세계에서 가장 예쁜 것은 아니지만 CSV는 세계에서 가장 융통성있는 형식이 아닙니다.