8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je poste cette question car je bloque sur une partie de mon développement où je dois exporter une liste grâce à excel.
J'ai déjà commencé quelques petites choses, mais mon problème étant que mes données arrivent uniquement sur la colonne A alors que je précise selon moi que je veux des données sur les colonnes suivantes. Voici le visuel

upload/1597836797-80834-exportsession.png

Controller
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
class Export extends CI_Controller {
    // construct
    public function __construct() {
        parent::__construct();
        // load model
        $this->load->model('Export_model', 'export');
    }    
 
    public function index() {
        $data['export_list'] = $this->export->exportList();
        $this->load->view('export', $data);
    }
    // create xlsx
    public function exportCsv() {
        // create file name
        $fileName = 'data-'.time().'.xlsx';  
        // load excel library
        $this->load->library('Excel');
		// $this->load->library('PHPExcel');
        $listInfo = $this->export->exportList();
        $objPHPExcel = new PHPExcel();
        $objPHPExcel->setActiveSheetIndex(0);
        // set Header
		$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'meeting_id');
        $objPHPExcel->getActiveSheet()->SetCellValue('B1', 'title');
        $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'place');
        $objPHPExcel->getActiveSheet()->SetCellValue('D1', 'datebegin');
        $objPHPExcel->getActiveSheet()->SetCellValue('E1', 'timebegin');
        $objPHPExcel->getActiveSheet()->SetCellValue('F1', 'dateend');
        $objPHPExcel->getActiveSheet()->SetCellValue('G1', 'timeend');  
        
        // set Row
        $rowCount = 2;
        foreach ($listInfo as $meeting) {
			$objPHPExcel->getActiveSheet()->SetCellValue('A' . $rowCount, $meeting->meeting_id);
			$objPHPExcel->getActiveSheet()->SetCellValue('B' . $rowCount, $meeting->title);
			$objPHPExcel->getActiveSheet()->SetCellValue('C' . $rowCount, $meeting->place);
			$objPHPExcel->getActiveSheet()->SetCellValue('D' . $rowCount, $meeting->datebegin);
			$objPHPExcel->getActiveSheet()->SetCellValue('E' . $rowCount, $meeting->timebegin);
			$objPHPExcel->getActiveSheet()->SetCellValue('F' . $rowCount, $meeting->dateend);
			$objPHPExcel->getActiveSheet()->SetCellValue('G' . $rowCount, $meeting->timeend);
            $rowCount++;
        }
        $filename = "Liste_des_sessions_LocalForm-". date("d-m-Y-H-i-s").".csv";
        header('Content-Type: application/vnd.ms-excel'); 
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0'); 
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');  
        $objWriter->save('php://output'); 
    }
     
}
?> 


Model

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
    class Export_model extends CI_Model {
 
        public function exportList() {
            $this->db->select(array('meeting_id', 'title', 'place', 'datebegin', 'timebegin', 'dateend','timeend'))
            ->from('test_meeting');
            $query = $this->db->get();
            return $query->result();
        }
    }
?>


View
<!-- Presence -->
<div class="container">
	<a style="float:right;" class="waves-effect btn-large waves-light blue" href="<?php echo site_url( 'export/exportCsv') ?>" >Exporter les sessions</a>
</div>

Modifié par Jisiiss (19 Aug 2020 - 13:45)
Modérateur
Salut,

Tu exportes en CSV. En CSV les données sont délimités par un séparateur (une virgule mais tu peux mettre autre chose je crois je suis pas sur) et ca fait office de colonne. Bref c'est le format CSV. Quand tu ouvres sous excel tu peux mettre ça en forme en utilisant "Convertir" dans le menu "Données".

Je ne sais pas si on peut exporter directement un .xls ou .xlsx... perso je ne pense pas mais je me trompe peut etre....
Modifié par _laurent (19 Aug 2020 - 13:47)
En effet, ta solution pourrait convenir car l'export est bon. Cependant je souhaiterai rester sur du php pour ma solution Smiley decu , car j'ai bien vu que l'export fonctionnait et l'architecture reste dans la structure de mon projet. Par ailleurs, mon export est déjà au format csv.
Bonjour !

Tout d'abord, j'ai le regret de vous faire part du décès de PHPExcel.

Il est remplacé par PhpSpreadsheet : https://github.com/PHPOffice/PhpSpreadsheet.
Bonne nouvelle : les changements à faire pour passer de PHPExcel à PhpSpreadsheet sont peu nombreux.

Enfin, il est parfaitement possible d'exporter un fichier xlsx avec PhpSpreadsheet

Après avoir alimenté votre classeur (disons dans la variable $spreasheet), vous pouvez utilisez l'un ou l'autre Writer selon la sortie souhaitée, par exemple xlsx :

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Alimenter le contenu de la feuille ici

// Après cela (et un café), on exporte le fichier
$writer = new Xlsx($spreadsheet);

header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition','attachment; filename="monfichier.xslx"');
$writer->save('php://output');


L'avantage du format XLSX par rapport au CSV, si le fichier est destiné à un humain, c'est que vous esquivez toute la procédure d'importation manuelle du CSV qui peut varier d'une machine à l'autre (selon sa configuration linguistique et selon la suite bureautique utilisée).

Pour un export destiné à être ingurgité par un script d'import, le CSV et le JSON restent de bons formats.

En espérant vous avoir aidé ! Smiley smile
Modifié par Bouchon (19 Aug 2020 - 14:36)
Modérateur
Bouchon a écrit :
Enfin, il est parfaitement possible d'exporter un fichier xlsx avec PhpSpreadsheet

Smiley banane
Merci à tous pour votre, j'ai regardé chacune de ses propositions et finalement la proposition de _laurent est rapide à produire, le seul bémol c'est que le lignes sont sautées entre chaque affichage :
upload/1597848846-80834-exportsession.png

Voici le code :
<script>
  function excellerAgent() {
    var uri = 'data:application/vnd.ms-excel;base64,',
      template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
      base64 = function(s) {
        return window.btoa(unescape(encodeURIComponent(s)))
      },
      format = function(s, c) {
        return s.replace(/{(\w+)}/g, function(m, p) {
          return c[p];
        })
      }
    var toExcel = document.getElementById("toExcel").innerHTML;
    var ctx = {
      worksheet: name || '',
      table: toExcel,
    };
    var link = document.createElement("a");
    link.download = "Liste_des_agents_LocalForm.xls";
    link.href = uri + base64(format(template, ctx))
    link.click();
  }
</script>


<!-- Listing de tous les agents avec leurs sessions -->
<div class="row">
		<div class="col s12 offset-m1 m10 offset-l2 l8">
			<table id="toExcel" class="uitable">
			<!-- <table class="bordered highlight responsive-table"> -->
				<thead> 
					<tr>
						<th> Nni </th>
						<th> Name </th>
						<th> Service </th>
						<th> Id Session </th>
                        <th> Presence </th>
					<tr>
				</thead> 
                <?php  
                    $Agent = $this->seat_model->SeatListingSession();
                    foreach ( $Agent as $seat ) : 
                ?>
                        <!-- Ajout des données pour chaque colonne -->

                            <tr seat_id=<?php echo $seat->seat_id ?> >
                                <td><?php echo $seat->nni ?></td>
                                <td><?php echo $seat->name ?></td>
                                <td><?php echo $seat->service ?></td>
                                <td><?php echo $seat->meeting_id ?></td>
                            <tr>
                <?php	
                    endforeach;
                ?>

            </table>
			
		</div>
</div>


<!-- Presence -->
<div class="container">
<button  style="float:right;" class="waves-effect btn-large waves-light blue" onclick="excellerAgent()">Exporter les agents sur Excel</button>
</div>

Modifié par Jisiiss (19 Aug 2020 - 16:57)