Importação de XLSX via PHP
Oi pessoal!
Estou desenvolvendo meu TCC, o qual precisará ter a funcionalidade de importar dados de tabelas do Excel. Pesquisei várias formas de fazer isto e a que mostrarei aqui, pareceu ser a melhor maneira para mim. Porém estou tendo alguns problemas.
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/MtPmH.png&key=016233805ac78a200f2fb5b72e2a0f7e0e88f4dc9cb345fc99c6495c2892dff2" alt="MtPmH.png" />
Como podem ver na imagem acima, na página de importação se tem a opção de escolher a quantidade de dados que serão importados e depois dizer quais são. Porém quando escolho os 13 campos da tabela, ocorre um problema e os dados não são gravados no banco. Caso eu escolha um número menor de campos, alguns dados vão parar no banco, porém não dá forma correta.
Aqui estão alguns códigos que usei nessa importação:
importar_arquivo.php
<?php
$titulo = $_POST['descartar_linha'];
$tabela = "<table width='100%' border='1' id='tabela_dados'><tr>";
$x = 1;
$campos = "";
while(isset($_POST['campo_' . $x])) {
$campos .= $_POST['campo_' . $x];
$tabela .= "<td align='center' class='titulo_tabela'><b>" . $_POST["campo_" . $x] . "</b></td>";
$x++;
}
switch($_POST['tipo_arquivo']) {
case 'xls':
require_once 'leitores/Excel.read.php';
$arquivo = pathinfo($_FILES['arquivo']['name']);
$extensao = $arquivo['extension'];
$nome_arquivo = 'importacao_' . time() . '.' . $extensao;
if(move_uploaded_file($_FILES['arquivo']['tmp_name'], $nome_arquivo)) {
$excel = new Spreadsheet_Excel_Reader();
$excel->setOutputEncoding('CPa25a');
$excel->read('importacao_' . time() . '.' . $extensao);
$r = 1;
if($titulo == 'true') {
$r = 2;
}
while( $r <= $excel->sheets[0]['numRows']) {
$y=1;
$row="";
$tabela .= "<tr>";
while($y <= $excel->sheets[0]['numCols']) {
$cell = isset($excel->sheets[0]['cells'][$r][$y]) ? $excel->sheets[0]['cells'][$r][$y] : '';
$tabela .= "<td class='cor_nao'> " . utf8_encode($cell) . "</td>";
$y++;
}
$tabela .= "</tr>";
$r++;
}
}
break;
case 'xlsx':
require_once 'leitores/XLSX.read.php';
$arquivo = pathinfo($_FILES['arquivo']['name']);
$extensao = $arquivo['extension'];
$nome_arquivo = 'importacao_' . time() . '.' . $extensao;
if(move_uploaded_file($_FILES['arquivo']['tmp_name'], $nome_arquivo)) {
$xlsx = new SimpleXLSX('importacao_' . time() . '.' . $extensao);
$linhas = 0;
list($num_cols, $num_rows) = $xlsx->dimension();
foreach( $xlsx->rows() as $r ) {
if($titulo == 'true' && $linhas == 0) {
$linhas++;
continue;
}
$tabela .= "<tr>";
for( $i=0; $i < $num_cols; $i++ ) {
$tabela .= "<td class='cor_nao'>" . $r[$i] . "</td>";
}
$tabela .= "</tr>";
}
}
break;
}
$tabela .= "</table>";
unlink($nome_arquivo);
?>
confirma_importacao.php
<?php
include_once("conexao/conexao.php");
$cont_campos = $_POST['cont_colunas'];
$campos = array();
for($linhas_titulo = 0; $linhas_titulo < $cont_campos; $linhas_titulo++) {
$campos[] = $_POST['colunas'][$linhas_titulo];
}
$importados = 0;
$cont_linha = 0;
$dados = array();
for($linhas_dados = $linhas_titulo; $linhas_dados < count($_POST['colunas']); $linhas_dados++) {
if($campos[$cont_linha] == 'VL_UNITARIO_PRODUTO') {
$dados[] = @number_format($_POST['colunas'][$linhas_dados], 2, '.', '');
} else {
$dados[] = str_replace("'", "", $_POST['colunas'][$linhas_dados]);
}
$cont_linha++;
if($cont_linha == $cont_campos) {
$cont_linha = 0;
$sql = @mysql_query("INSERT INTO produto (" . implode(', ', $campos) . ") VALUES ('" . implode("', '", $dados) . "')");
if($sql) {
$importados++;
}
$dados = array();
}
}
echo "Importação efetuada com sucesso. Foram importados $importados produtos.";
?>
editar_campos.php
<?php
for($x = 1; $x <= $_POST['quantidade']; $x++) {
echo "
<p>
Campo $x: <select name='campo_$x' id='campo_'>
<option value='CD_PRODUTO'>CD_PRODUTO</option>
<option value='CD_FORNECEDOR'>CD_FORNECEDOR</option>
<option value='CD_SETOR_PRODUTO'>CD_SETOR_PRODUTO</option>
<option value='CD_LOCALIZACAO'>CD_LOCALIZACAO</option>
<option value='NM_PRODUTO'>NM_PRODUTO</option>
<option value='NM_DESCRICAO_PRODUTO'>NM_DESCRICAO_PRODUTO</option>
<option value='QT_PRODUTO_ESTOQU'>QT_PRODUTO_ESTOQUE</option>
<option value='VL_UNITARIO_PRODUTO'>VL_UNITARIO_PRODUTO</option>
<option value='NM_MARCA_PRODUTO'>NM_MARCA_PRODUTO</option>
<option value='QT_MINIMA_ESTOQUE'>QT_MINIMA_ESTOQUE</option>>
<option value='DT_VALIDADE'>DT_VALIDADE</option>
<option value='DT_AQUISICAO'>DT_AQUISICAO</option>
<option value='NM_UNIDADE'>NM_UNIDADE</option>
</select>
</p>";
}
?>
Para facilitar, aqui estão todos os arquivos que utilizei, incluindo os .js e banco.
Tentei arrumar, mas não estou conseguindo achar o erro. Ao enviar a tabela, a aplicação lê corretamente os dados enviados, porém o mais importante que é gravar no banco, não está funcionando corretamente.
Agradeço desde já a quem puder me ajudar! (:
Discussão (1)
Carregando comentários...