PHP में एक उपयोगकर्ता के लिए एक CSV फ़ाइल बनाएँ


220

मेरे पास एक MySQL डेटाबेस में डेटा है। मैं CSV फ़ाइल के रूप में अपना डेटा प्राप्त करने के लिए उपयोगकर्ता को एक URL भेज रहा हूं।

मेरे पास लिंक की ई-मेलिंग, MySQL क्वेरी, आदि शामिल हैं।

जब वे लिंक पर क्लिक करते हैं, तो मैं MySQL के रिकॉर्ड के साथ CVS डाउनलोड करने के लिए पॉप-अप कैसे कर सकता हूं?

मेरे पास रिकॉर्ड प्राप्त करने के लिए पहले से ही सारी जानकारी है। मैं अभी नहीं देखता कि कैसे PHP CSV फ़ाइल बना सकता है और उन्हें एक .csv एक्सटेंशन वाली फ़ाइल डाउनलोड करने देता है।

जवाबों:


280

प्रयत्न:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo "record1,record2,record3\n";
die;

आदि

संपादित करें: यहाँ CSV फ़ील्ड्स को वैकल्पिक रूप से कूटबद्ध करने के लिए उपयोग किए जाने वाले कोड का एक स्निपेट है:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}

11
ध्यान दें कि CSV के लिए नियम महत्वपूर्ण हैं। अच्छा प्रदर्शन सुनिश्चित करने के लिए, अपने क्षेत्रों के आसपास डबलक्वाट्स लगाएं, और डबल-कोट्स को डबल-कोट्स: `इको '.str_replace (' '' ',' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '-'-'-' '' '' '' '' '' '' '' '' '' '' '), रिकॉर्ड 1) के साथ दोहराएं)। '', "'। str_replace ....
माला

46
बस स्पष्ट करने के लिए, CSV के लिए सही HTTP कंटेंट-टाइप हेडर टेक्स्ट / सीएसवी है, एप्लिकेशन / सीएसवी नहीं। मुझे लगता है कि किसी भी आधुनिक ब्राउज़र को किसी भी तरह से परवाह होगी, लेकिन चूंकि मानक हैं हम उन्हें उपयोग कर सकते हैं।
फेंटी

10
सामान्य तौर पर, कृपया CSV फ़ाइलों को बनाते समय RFC 4180 का अनुसरण करें। tools.ietf.org/html/rfc4180
ओलेग बार्शाय

5
@ ऑल बर्षे: OMG, कि RFC एक मास्टर पीस है: "यदि डबल-कोट्स का उपयोग खेतों को घेरने के लिए किया जाता है, तो एक मैदान के अंदर दिखने वाले दोहरे-उद्धरण को दूसरे दोहरे उद्धरण के साथ पूर्ववर्ती होने से बचना चाहिए।" अन्य डबल-कोट!
afxx 12

465
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");

function outputCSV($data) {
  $output = fopen("php://output", "wb");
  foreach ($data as $row)
    fputcsv($output, $row); // here you can change delimiter/enclosure
  fclose($output);
}

outputCSV(array(
  array("name 1", "age 1", "city 1"),
  array("name 2", "age 2", "city 2"),
  array("name 3", "age 3", "city 3")
));

php: // उत्पादन
fputcsv


64
अधिक लोगों को इसे देखने और इसे वोट करने की आवश्यकता है। यह इस पृष्ठ पर आसानी से सबसे अच्छा उत्तर है। PHP में पहले से ही CSV सामग्री को प्रारूपित करने के लिए अंतर्निहित कार्य हैं। सभी को इनका उपयोग करना चाहिए। शानदार जवाब, @Andrey :)
maček

2
बहुत बुरा fputcsv () सही ढंग से काम नहीं करता है :( Bugs.php.net/bug.php?id=50686
gou1

4
अच्छा है, लेकिन outputCSVफ़ंक्शन अनावश्यक रूप से जटिल है। आप बस foreachखत्म कर सकते हैं $array, इसके मूल्यों को सीधे में भेज रहे हैं fputcsv। उसके लिए __outputCSVऔर array_walk:) की कोई जरूरत नहीं हैforeach($data as $vals) {fputcsv($filehandler,$vals);}
Sygmoral

मुझे सरणी में फ्रांसीसी पात्रों के साथ कुछ समस्याएँ आ रही हैं क्योंकि मुझे अंततः Excel में खुले रहने के लिए .csv की आवश्यकता है। यह उच्चारण पात्रों पर चुटकी लेता है। "Prévalence","age 1","city 1" किसी भी विचार की तरह बातें ? UTF-8 के साथ मेसिंग इस प्रकार अब तक मदद नहीं की है।
वूडू

1
@Theosem Delimiter OS या Excel निर्यात सेटिंग्स पर निर्भर करता है। मैंने परिसीमन के बारे में नोट जोड़ा है।
एंड्री नेमचेंको

19

यहाँ php.net से फ़ंक्शन का एक बेहतर संस्करण है जो @Andrew ने पोस्ट किया है।

function download_csv_results($results, $name = NULL)
{
    if( ! $name)
    {
        $name = md5(uniqid() . microtime(TRUE) . mt_rand()). '.csv';
    }

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

MySQL (i) / PDO परिणाम सेट के साथ उपयोग करना और काम करना वास्तव में आसान है।

download_csv_results($results, 'your_name_here.csv');

exit()अगर आपको पेज के साथ किया जाता है तो इसे कॉल करने के बाद याद रखें ।


आप सेपरेटर को कैसे बदलेंगे; ?
क्रोधी

1
हमें इस घटना को ट्रिगर करने के लिए एक बटन कैसे जोड़ना चाहिए, ताकि उपयोगकर्ता मांग पर सीएसवी फ़ाइल डाउनलोड कर सके?
कैनेलन

मेरे पास "सिन्टेक्सएयर: अनपेक्षित टोकन ILLEGAL" त्रुटि होगी लाइन "fopen (" php: // output "," w ");" जब मैं इसे "$ fp = fopen ('ysts.csv ',' w ');" यह त्रुटि नहीं दिखाता है। लेकिन तब निश्चित रूप से यह काम नहीं करता है। मुझे इसे कैसे हल करना चाहिए?
Caneyeylan

@CanCeylan, यह अपने आप में एक सवाल है और मुझे इसे हल करने के लिए अधिक विवरण की आवश्यकता है।
Xeoncross

1
कॉलम हेडर को भी शामिल करने के लिए fputcsv($outstream, array_keys($results[0]));अपने foreachसे पहले जोड़ें ।
जस्टिन

16

सभी पहले से ही कहा के अलावा, आपको जोड़ने की आवश्यकता हो सकती है:

header("Content-Transfer-Encoding: UTF-8");

यह बहुत उपयोगी है जब लोगों की नाम या शहरों की तरह उनमें कई भाषाओं के साथ फाइलें संभालते हैं।


9

धागा थोड़ा पुराना है, मुझे पता है, लेकिन भविष्य के संदर्भ के लिए और खुद के रूप में नॉब्स के लिए:

यहां हर कोई समझाता है कि सीएसवी कैसे बनाया जाए, लेकिन सवाल का एक बुनियादी हिस्सा याद आता है: लिंक कैसे करें। CSV-फ़ाइल को डाउनलोड करने के लिए लिंक करने के लिए, आप बस .php-file से लिंक करते हैं, जो कि .csv-file के रूप में संबंधित है। PHP हेडर ऐसा करते हैं। यह शांत सामग्री को सक्षम करता है, जैसे कि चर को जोड़ना और आउटपुट को अनुकूलित करना:

<a href="my_csv_creator.php?user=23&amp;othervariable=true">Get CSV</a>

my_csv_creator.php querystring में दिए गए चर के साथ काम कर सकता है और उदाहरण के लिए अलग-अलग या अनुकूलित डेटाबेस प्रश्नों का उपयोग करें, CSV के कॉलम बदलें, फ़ाइल नाम को निजीकृत करें, जैसे:

User_John_Doe_10_Dec_11.csv

1
उह - यह पढ़ने वाले किसी को भी इस दृष्टिकोण से बहुत सावधान रहना चाहिए। मैं कहूंगा कि इनपुट ठीक से नहीं बच रहे हैं और इससे आपके एप्लिकेशन में बड़े सुरक्षा छेद हो सकते हैं।
कैलम्ब्रोडी

उसका तरीका बहुत सुरक्षित है, और यह बहुत अच्छा काम करता है। आप आसानी से सत्र के साथ पहुंच को नियंत्रित कर सकते हैं, और आप उन सभी सूचनाओं को भी संग्रहीत कर सकते हैं जिन्हें आप एक सत्र संस्करण में सीएसवी में रखना चाहते हैं। फिर बस इसे प्रक्रिया के भाग के रूप में एक सीएसवी में परिवर्तित करें। मैं सिर्फ एक क्वेरी स्ट्रिंग के बजाय सत्र संस्करण का उपयोग करने का सुझाव दूंगा।
अकार्बनिक

1
इस पद्धति के साथ प्रति सुरक्षा छेद नहीं हैं। जब तक संदर्भित php फ़ाइल यह स्वच्छता और पहुँच जाँच का काम कर रही है। लेकिन यह वास्तव में यहाँ सब दिखाने के लिए समझ में नहीं आता है। पोस्ट का मुद्दा यह है कि आप जिस भी यूआरएल को जोड़ते हैं, वह सीएसवी को लिंक कर सकता है।
danielson317

8

अपनी फ़ाइल बनाएं फिर उसे सहेजने के लिए सही शीर्षलेख के साथ एक संदर्भ वापस लौटाएं - आवश्यकतानुसार संपादित करें। $ CSvdata में अपना CSV डेटा डालें।

$fname = 'myCSV.csv';
$fp = fopen($fname,'wb');
fwrite($fp,$csvdata);
fclose($fp);

header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);

1
"इनलाइन" सामग्री-विवाद का उपयोग करने का अर्थ है कि ब्राउज़र को इसे डाउनलोड किए बिना दिखाने का प्रयास करना चाहिए (आईई उस के लिए एक एक्सेल उदाहरण एम्बेड करने की प्रवृत्ति है)। "अटैचमेंट" एक डाउनलोड को बाध्य करने के लिए क्या आवश्यक है।
गर्ट वैन डेन बर्ग

5

यहाँ पीडीओ का उपयोग करके और कॉलम हेडर सहित एक पूर्ण कार्य उदाहरण दिया गया है:

$query = $pdo->prepare('SELECT * FROM test WHERE id=?');
$query->execute(array($id));    
$results = $query->fetchAll(PDO::FETCH_ASSOC);
download_csv_results($results, 'test.csv'); 
exit();


function download_csv_results($results, $name)
{            
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");    
    fputcsv($outstream, array_keys($results[0]));

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

4

पहले डेटा को स्ट्रिंग के रूप में अल्पविराम के रूप में सीमांकक के रूप में बनाएं ("," के साथ अलग किया गया)। कुछ इस तरह

$CSV_string="No,Date,Email,Sender Name,Sender Email \n"; //making string, So "\n" is used for newLine

$rand = rand(1,50); //Make a random int number between 1 to 50.
$file ="export/export".$rand.".csv"; //For avoiding cache in the client and on the server 
                                     //side it is recommended that the file name be different.

file_put_contents($file,$CSV_string);

/* Or try this code if $CSV_string is an array
    fh =fopen($file, 'w');
    fputcsv($fh , $CSV_string , ","  , "\n" ); // "," is delimiter // "\n" is new line.
    fclose($fh);
*/

3

अरे यह बहुत अच्छा काम करता है .... !!!! धन्यवाद पीटर मोर्टेंसन और कॉनर बर्टन

<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

ini_set('display_errors',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);

mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

$start = $_GET["start"];
$end = $_GET["end"];

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    $result.="{$row['email']},";
    $result.="\n";
    echo $result;
}

?>


करो नहीं उत्पादन में इस कोड का उपयोग, यह एसक्यूएल इंजेक्शन के लिए असुरक्षित है
ntzm

2

सरल विधि -

$data = array (
    'aaa,bbb,ccc,dddd',
    '123,456,789',
    '"aaa","bbb"');

$fp = fopen('data.csv', 'wb');
foreach($data as $line){
    $val = explode(",",$line);
    fputcsv($fp, $val);
}
fclose($fp);

तो $dataसरणी की प्रत्येक पंक्ति आपकी नई बनाई गई CSV फ़ाइल की एक नई पंक्ति में जाएगी। यह केवल PHP 5 और बाद के लिए ही काम करता है।


2

आप बस अपना डेटा CSV में fputcsv फ़ंक्शन का उपयोग करके लिख सकते हैं। नीचे दिए गए उदाहरण पर एक नजर डालते हैं। सूची सरणी को CSV फ़ाइल में लिखें

$list[] = array("Cars", "Planes", "Ships");
$list[] = array("Car's2", "Planes2", "Ships2");
//define headers for CSV 
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file_name.csv');
//write data into CSV
$fp = fopen('php://output', 'wb');
//convert data to UTF-8 
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $line) {
    fputcsv($fp, $line);
}
fclose($fp);

1

सबसे आसान तरीका इस तरह समर्पित सीएसवी वर्ग का उपयोग करना है :

$csv = new csv();
$csv->load_data(array(
    array('name'=>'John', 'age'=>35),
    array('name'=>'Adrian', 'age'=>23), 
    array('name'=>'William', 'age'=>57) 
));
$csv->send_file('age.csv'); 

1

के बजाय:

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    $result.="{$row['email']},";
    $result.="\n";
    echo $result;
}

उपयोग:

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    echo implode(",", $row)."\n";
}

1

पहले से ही बहुत अच्छा समाधान आया। मैं सिर्फ कुल कोड डाल रहा हूं ताकि एक नौसिखिया को कुल मदद मिले

<?php
extract($_GET); //you can send some parameter by query variable. I have sent table name in *table* variable

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$table.csv");
header("Pragma: no-cache");
header("Expires: 0");

require_once("includes/functions.php"); //necessary mysql connection functions here

//first of all I'll get the column name to put title of csv file.
$query = "SHOW columns FROM $table";
$headers = mysql_query($query) or die(mysql_error());
$csv_head = array();
while ($row = mysql_fetch_array($headers, MYSQL_ASSOC))
{
    $csv_head[] =  $row['Field'];
}
echo implode(",", $csv_head)."\n";

//now I'll bring the data.
$query = "SELECT * FROM $table";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    foreach ($row as $key => $value) {
            //there may be separator (here I have used comma) inside data. So need to put double quote around such data.
        if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {
            $row[$key] = '"' . str_replace('"', '""', $value) . '"';
        }
    }
    echo implode(",", $row)."\n";
}

?>

मैंने इस कोड को csv-download.php में सेव कर लिया है

अब देखें कि मैंने इस डेटा का उपयोग सीएसवी फ़ाइल डाउनलोड करने के लिए कैसे किया है

<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>

इसलिए जब मैंने लिंक को क्लिक किया है तो यह मुझे ब्राउज़र पर csv-download.php पृष्ठ पर ले जाए बिना फ़ाइल को डाउनलोड कर रहा है।


0

इसे CSV के रूप में भेजने के लिए और इसे फ़ाइल नाम देने के लिए, हेडर का उपयोग करें ():

http://us2.php.net/header

header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');

जहाँ तक स्वयं CSV बनाने की बात है, तो आप परिणाम सेट के माध्यम से लूप करेंगे, आउटपुट स्वरूपित करेंगे और इसे भेजेंगे, ठीक वैसे ही जैसे आप कोई अन्य सामग्री करेंगे।


0

अपना स्वयं का CSV कोड लिखना संभवतः आपके समय की बर्बादी है, बस लीग / csv जैसे पैकेज का उपयोग करें - यह आपके लिए सभी कठिन सामानों से संबंधित है, प्रलेखन अच्छा है और यह बहुत ही स्थिर / विश्वसनीय है:

http://csv.thephpleague.com/

आपको संगीतकार का उपयोग करना होगा। अगर आपको नहीं पता कि मैं कौन सा संगीतकार हूं, तो आपको एक सलाह है: https://getcomposer.org/


0
<?
    // Connect to database
    $result = mysql_query("select id
    from tablename
    where shid=3");
    list($DBshid) = mysql_fetch_row($result);

    /***********************************
    Write date to CSV file
    ***********************************/

    $_file = 'show.csv';
    $_fp = @fopen( $_file, 'wb' );

    $result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");

    while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
    {
        $_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
        @fwrite( $_fp, $_csv_data);
    }
    @fclose( $_fp );
?>

0

PHP स्क्रिप्ट का उपयोग करके CSV फ़ाइल में कैसे लिखें? दरअसल मैं वह भी खोज रहा था। यह PHP के साथ आसान काम है। fputs (हैंडलर, सामग्री) - यह फ़ंक्शन मेरे लिए कुशलतापूर्वक काम करता है। पहले आपको उस फ़ाइल को खोलने की आवश्यकता है जिसमें आपको फ़ोपेन ($ CSVFileName, 'wb') का उपयोग करके सामग्री लिखने की आवश्यकता है।

$CSVFileName = test.csv”;
$fp = fopen($CSVFileName, wb’);

//Multiple iterations to append the data using function fputs()
foreach ($csv_post as $temp)
{
    $line = “”;
    $line .= Content 1 . $comma . $temp . $comma . Content 2 . $comma . 16/10/2012″.$comma;
    $line .= \n”;
    fputs($fp, $line);
}

यह हमेशा लिंक करने के बजाय कोड को जोड़ने का पक्षधर है, क्योंकि लिंक समय के साथ बदल जाते हैं या गायब हो जाते हैं।
Sgoettschkes

आपका जवाब बहुत पुराने सूत्र में है। 2008 में, यह अपनी खुद की अल्पविराम से अलग लाइनों को बनाने के लिए मानक अभ्यास था, PHP 5.1.0 के बाद से सही विधि बिल्ट इन fputcsv फ़ंक्शन ( php.net/fputcsv ) का उपयोग करना होगा । पुराने थ्रेड्स को पढ़ते समय ध्यान रखें कि यह सुनिश्चित करें कि उनमें निहित जानकारी अभी भी प्रासंगिक है।
ल्यूक मिल्स

-1

$outputचर में CSV डेटा डालें और सही हेडर के साथ गूँजें

header("Content-type: application/download\r\n");
header("Content-disposition: filename=filename.csv\r\n\r\n");
header("Content-Transfer-Encoding: ASCII\r\n");
header("Content-length: ".strlen($output)."\r\n");
echo $output;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.