Exporter des données de php vers excel
je dois exporter des données de php (données extraites de la base de données mysql) vers excel. Je suis en utilisant le Zend Framework. J'ai besoin de faire quelques modifications à mes données avant d'exporter vers excel. En fait, ce dont j'ai vraiment besoin c'est de générer un carnet de caisse mensuel.
j'ai lu beaucoup de documents, mais il a fini dans un désordre. Je ne comprends vraiment pas comment je dois commencer. Ai-je vraiment besoin de POIRE? Dois-je télécharger une bibliothèque de classe?N'y a-t-il pas une façon simple de faire ça?
Merci à avance
5 réponses
je vous suggère d'utiliser un grand PHPExcel
bibliothèque. Il est vraiment puissant, soutient la variété des formats, peut faire le formatage visuel et est facile à utiliser.
vous pouvez trouver plus à ce sujet à leur page Web:
http://phpexcel.codeplex.com/. (PHPExcel
a déjà déménagé à https://github.com/PHPOffice/PHPExcel)
Exemple d'utilisation:
$objPHPExcel = new PHPExcel();
/** You can set many properties */
$objPHPExcel->getProperties()->setCreator("My company")
->setLastModifiedBy("John Doe")
->setTitle("Annual report")
->setSubject("Sales")
->setDescription("Annual sales report by John Doe")
->setCategory("Finance");
/** Choose one of sheets */
$activeSheet = $objPHPExcel->setActiveSheetIndex(0);
/** Simply set value of cell */
$activeSheet->setCellValue("A1", 'plural');
vous pouvez faire beaucoup plus, bien sûr, la lecture de fichiers excel, le réglage styles visuels, création de tracés, d'expressions et bien plus encore.
j'ai écrit un rapport de variance d'inventaire de 94 lignes dans lequel je prends des données de MySQL (6K+ enregistrements par table), créer un tableau multidimensionnel à partir des données MySQL tirées de plusieurs tables, puis tout vider dans une chaîne simple et de générer un .xls comme ceci:
<?php
////////////////////////////////// BEGIN SETUP
$filename ="document_name.xls";
header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename='.$filename);
////////////////////////////////// END SETUP
////////////////////////////////// BEGIN GATHER
// Your MySQL queries, fopens, et cetera go here.
// Cells are delimited by \t
// \n is just like you might expect; new line/row below
// E.G:
$stuff="PART\tQTY\tVALUE\t\n";
$stuff=$stuff."01-001-0001\t37\t28.76\t\n";
$stuff=$stuff."01-001-0002\t6\t347.06\t\n";
$stuff=$stuff."01-001-0003\t12\t7.11\t\n";
////////////////////////////////// END GATHER
// The point is to get all of your data into one string and then:
////////////////////////////////// BEGIN DUMP
echo $stuff;
////////////////////////////////// END DUMP
?>
aucune extension requise.
Les seules réserves que je n'ai pas encore trouvé comment faire cracher un .xls sans Excel me disant que les données peuvent être corrompues - et je n'ai pas essayé de faire formatage ou quelque chose de plus complexe que simplement "exporter" les données. Le fichier/données est fine, bien sûr, mais il ne génère un avertissement à partir d'Excel.
EDIT: je tiens à noter que le 'setup' et 'dump' sont les suivantes: daniweb.com
vous pouvez utiliser CSV pour faire un format importable pour excel. C'est la plus simple façon de le faire.
CSV ressemble à ceci :
"my first cellcontent", "my second cell content", "my third cell content"
"second line, first cell content", "etc", "etc
chaque ligne représente une ligne Excel, vous mettez le contenu de la cellule entre guillemets doubles, et séparé par des virgules.
Attention à \r\n
si vous en avez dans vos données, il peut casser votre CSV et créer de nouvelles lignes indésirables.
Avec un peu de google, vous auriez trouvé ceci: http://www.the-art-of-web.com/php/dataexport/
Préparation des données
$data = array(
array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);
la première étape est de sortir les données dans un format délimité par des tabulations (CSV peut également être utilisé, mais est légèrement plus compliqué). Pour cela, nous utilisons le code suivant:
<?php
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
nous définissons le type de contenu à text / plain afin que la sortie puisse être visualisée plus facilement dans le navigateur. Autrement, parce qu'il n'y est pas de formatage HTML, la sortie apparaîtrait comme une seule ligne de texte.
la première ligne de sortie sera les titres des colonnes (dans ce cas, les noms des champs sont utilisés). Les valeurs sont séparées par une tabulation \t et des lignes avec un saut de ligne \n. La sortie doit ressembler à ce qui suit:
firstname lastname age
Mary Johnson 25
Amanda Miller 18
James Brown 31
Patricia Williams 7
Michael Davis 43
Sarah Miller 24
Patrick Miller 27
il y a déjà une faiblesse dans ce code qui n'est peut-être pas évidente immédiatement. Si l'un des champs de sortie contient déjà une ou plusieurs caractères de tabulation, ou pire, un de retour à la ligne? Cela va jeter l'ensemble du processus car nous nous appuyons sur ces caractères pour indiquer colonne - et les sauts de ligne.
La solution est de "s'échapper" de l'onglet caractères. Dans ce cas, nous allons remplacer les onglets par un \ t littéral et les sauts de ligne par un \n littéral pour qu'ils n'affectent pas le formatage:
<?php
function cleanData( &$str ) {
$str = preg_replace( "/\t/", "\t", $str );
$str = preg_replace("/\r?\n/", "\n", $str);
}
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
array_walk( $row, 'cleanData' );
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
maintenant, avant que chaque ligne soit reprise, les caractères des onglets sont remplacés par "\t " de sorte que nos colonnes ne soient pas fragmentées. Les ruptures de ligne dans les données sont également remplacées avec "\n".