2017-05-17 1 views
0

Je travaille sur un système CRM et j'ai besoin de créer des rapports dans Excel, j'ai besoin de l'option pour exporter toutes les données de la base de données Excel et aussi l'option de l'utilisateur de filtrer les données qu'ils veulent et exporter uniquement ces options. J'ai déjà l'affichage et la méthode de recherche séparés et travailler tous les deux utilisent la même vue pour voir le contenu (total ou filtré) J'ai aussi la méthode d'exportation vers Excel, mais je peux seulement exporter la base de données entière (sans les filtres). Mon idée initiale était de faire en sorte que ma vue envoie à la méthode get_excel ce qui est affiché et ensuite la méthode génère seulement l'Excel lui-même mais je ne sais pas comment passer ce tableau de données de la vue à la méthode actuelle sur le contrôleur.Quelle est la meilleure façon d'utiliser les filtres dans un système CRUD et d'exporter un Excel

Voici les codes que je utilise:

Méthodes de controleur:

Index montre toutes les données DB pour la vue

function index() 
{ 
    $this->template->set('title', 'Lista de Produtos'); 
    $config = array(
     "base_url" => base_url('produtos/p'), 
     "per_page" => 9, 
     "num_links" => 3, 
     "uri_segment" => 3, 
     "total_rows" => $this->model->countAll(), 
     "full_tag_open" => "<ul class='pagination'>", 
     "full_tag_close" => "</ul>", 
     "first_link" => FALSE, 
     "last_link" => FALSE, 
     "first_tag_open" => "<li>", 
     "first_tag_close" => "</li>", 
     "prev_link" => "Anterior", 
     "prev_tag_open" => "<li class='prev'>", 
     "prev_tag_close" => "</li>", 
     "next_link" => "Próxima", 
     "next_tag_open" => "<li class='next'>", 
     "next_tag_close" => "</li>", 
     "last_tag_open" => "<li>", 
     "last_tag_close" => "</li>", 
     "cur_tag_open" => "<li class='active'><a href='#'>", 
     "cur_tag_close" => "</a></li>", 
     "num_tag_open" => "<li>", 
     "num_tag_close" => "</li>" 
     ); 

    $this->pagination->initialize($config); 

    $data['pagination'] = $this->pagination->create_links(); 

    $offset = ($this->uri->segment(3)) ? $this->uri->segment(3):0; 

    $data['produtos'] = $this->model->listar('pcod','asc', $config['per_page'],$offset); 
    $this->template->load('layout', 'produtos_lista.phtml', $data); 
} 

Searh:

Utilisez les filtres à n'afficher que les données demandées

public function pesquisar() { 

    $this->template->set('title', 'Resultado'); 

    $data['pagination'] = ""; 

    $data['produtos'] = $this->model->search(); 

    $this->template->load('layout', 'produtos_lista.phtml', $data); 
} 

Get_excel:

Génère le rapport dans Excel

function get_excel(){ 
    //$this->load->library('PHPExcel'); 
    $contator = 1; 
    $arquivo = './planilhas/relatorio.xlsx'; 
    $planilha = $this->phpexcel; 

    $planilha->setActiveSheetIndex(0)->setCellValue('A1','Codigo'); 
    $planilha->setActiveSheetIndex(0)->setCellValue('B1','Nome'); 
    $planilha->setActiveSheetIndex(0)->setCellValue('C1','Descrição'); 

    $data['produtos'] = $this->model->listar(); 
    //echo json_encode($data['produtos']); 
    //die('eieeiie'); 


    foreach($data['produtos'] as $linha) { 
     $contator++; 
     $planilha->setActiveSheetIndex(0)->setCellValue('A'.$contator, $linha->pnome); 
     $planilha->setActiveSheetIndex(0)->setCellValue('B'.$contator, $linha->descricao); 
     $planilha->setActiveSheetIndex(0)->setCellValue('C'.$contator, $linha->pcod); 
    } 

    $planilha->getActiveSheet()->setTitle('planilha 1'); 

    $objgravar = PHPExcel_IOFactory::createWriter($planilha, 'Excel2007'); 
    $objgravar->save($arquivo); 

    $this->session->set_flashdata('mensagem', "<div class='alert alert-warning'> exportação salva com sucesso</div>"); 
      redirect('produtos'); 

} 

Enfin mon avis:

<body> 

<div class="row" > 
    <form action="/sistema/produtos/pesquisar" method="post"> 
     <div class="col-sm-9"> 
      <div class="form-group"> 
       <input name="search" class="form-control" id="search" type="text" 
        placeholder="Filtrar produto " value="<?php echo $view_termo??null ;?>"> 
        <span class="input-group-btn"></span> 
      </div> 
     </div> 

     <div class="col-sm-1"> 
      <button class="btn btn-primary pull-left" type="submit">Filtrar</button> 
     </div> 

    </form> 

    <div class="col-sm-2"> 
     <a data-toggle="modal" data-target="#new_produto" class="btn btn-primary ">Adicionar Produto</a> 
    </div> 

</div> 

<div id="list" class="row"> 
    <div class="table-responsive col-md-12"> 
     <table class="table table-striped" cellspacing="0" cellpadding="0"> 
      <thead> 
       <tr> 
        <th>ID</th> 
        <th>Nome</th> 
        <th>Descrição</th> 
        <th class="actions">Ações</th> 
       </tr> 
      </thead> 

      <tbody> 

       <?php foreach ($produtos as $produto) {?> 
        <tr> 
         <td><?php echo $produto->pcod; ?></td>  
         <td><?php echo $produto->pnome; ?></td>  
         <td><?php echo $produto->descricao; ?></td> 
         <td class="actions"> 
          <a title="Editar" class="btn btn-warning btn-xs" href="<?php echo base_url() . 'produtos/editar/' . $produto->pcod; ?>"> Editar</a> 
          <a title="Deletar" class="btn btn-danger btn-xs" href="<?php echo base_url() . 'produtos/deletar/' . $produto->pcod; ?>" onclick="return confirm('Confirma a exclusão deste registro?')">Deletar</a> 
         </td>  

        </tr>    

       <?php } ?> 
      </tbody> 
     </table> 
      <h3><?php echo $this->session->flashdata('mensagem');?></h3> 
    </div> 
</div> 
<div class="row"> 
    <div class="col-sm-4" > 
     <?php echo $pagination; ?> 
    </div> 

    <div class="col-sm-2"> 
     <a class="btn btn-primary" href="<?php echo base_url().'produtos/get_excel'?>">Export</a> 
    </div> 

</div> 

Répondre

0

Il est plus facile d'utiliser le javascript pour prendre le contenu HTML et convertir CSV avec un plugin. Si vous faites avec le backend, vous devrez prendre soin des valeurs, supprimer certaines variables et la forme peut être un désordre avec de grands tableaux difficiles à manipuler parfois.

La visualisation/filtrage du contenu sera également plus facile, car seul le réglage de 'display: none' dans css fera l'affaire. Je sais que vous avez étiqueté php/codeigniter/phpexcel, mais j'ai déjà fait beaucoup de projets qui avaient besoin de ces fonctionnalités et je sais que ce sera une douleur dans le cul si le contenu s'intensifie rapidement en un gros volume de données.

Si vous voulez prendre mon approche:

Quelques réponses dans Stack recommanderont table2CSV de kunalbabre, mais ce plug-in est interrompu/cassé, donc je suggère d'utiliser excellentexport de Github, il est simple et est venu avec beaucoup d'Approches , l'un d'eux a montré dans le dépôt git de README:

<table id="datatable"> 
    <tr> 
     <td>100</td> <td>200</td> <td>300</td> 
    </tr> 
    <tr> 
     <td>400</td> <td>500</td> <td>600</td> 
    </tr> 
</table> 

<a download="somedata.xls" href="#" onclick="return ExcellentExport.excel(this, 'datatable', 'Sheet Name Here');">Export to Excel</a> 
<a download="somedata.csv" href="#" onclick="return ExcellentExport.csv(this, 'datatable');">Export to CSV</a> 

les colonnes que l'utilisateur veut filtrer la vue, juste identifier javascript et mettre display: none/visibility: hidden que vous le souhaitez et vous pouvez facilement commander les colonnes contenu aussi en analysant avec javascript ou en utilisant des plugins comme sorttable, mettre dans votre table:

<table class="sortable"></table> 

Les caractéristiques des tables est si extensible et les utilisateurs qui veulent convertir au format CSV sont tellement accros aux fonctionnalités Excel que je vous suggère fortement de donner un essai à mettre en œuvre en javascript.

+0

merci l'homme je vais jeter un oeil bien sûr, je cherchais une option comme celle-ci –