Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

roregk

Problemas com criação de xls

Recommended Posts

ola pessoal,

alguém já usou a biblioteca da pear para gerar xls: Spreadsheet_Excel_Writer

meu problema é que o xls e gerado a partir do resultado de uma consulta do banco, ele é um valor monetário e esta como text no banco, mas para ficar no xls ele tem que ser um número, exe:

o valor 2250 deveria aparecer 2250,00

eu usei o number_format($campo do banco, 2, ",", ".");

e ele vem "2250,00" mas como texto

mas lá no excel ele se perde pois esta numa coluna de números um texto, com um alert ao lado dizendo: "Número armazenado como texto", e fica alinhado a esquerda, mas ele tem que ficar como número como o do excel e obvio alinhado a direita.

se eu formatar o campo em número ele fica somente desse formato: 2250

 

alguma ideia de como resolver?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente formatar a coluna da planilha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você está criando uma table, ou algum tipo de estrutura tabelada, e após, salvando em xls, você deverá atribuir o seguinte style:

'style="mso-number-format:\@;"'

 

Já tive o mesmo problema, atribui esse style e foi resolvido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

informe o valor como float ao invés de string.

 

number_format retorna uma string.

 

obrigado pela resposta.

Pois bem eu já fiz isso e como eu comentei antes ele fica por exemplo nesse formato: "2250", mas tem que aparecer "2250,00", o mais perto de chegar a esse resultado foi usando a number_format o problema é que lá no excel ele reclama por não saber bem ao certo que valor tem essa célula

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você está criando uma table, ou algum tipo de estrutura tabelada, e após, salvando em xls, você deverá atribuir o seguinte style:

'style="mso-number-format:\@;"'

 

Já tive o mesmo problema, atribui esse style e foi resolvido.

 

obrigado.

Quase lá!

bem como eu uso essa biblioteca: http://pear.php.net/manual/en/package.fileformats.spreadsheet-excel-writer.php

o método que faz a formatação deu um pauladão violento, hehehe

falta pouco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sempre fiz no "braço". Poste seu código, preciso ver algumas coisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sempre fiz no "braço". Poste seu código, preciso ver algumas coisas.

Ok muita coisa é próprio da empresa

     if ($rs = $this->mConn->Select($sql))//recebo a consulta e e começo a executar (framework da empresa)
     {
       if ($rs->GetRowCount())//retornou valor da consulta
       {
         $workbook = new Spreadsheet_Excel_Writer_Workbook($this->mFileName);
         $worksheet1 =& $workbook->addWorksheet('Planilha1');

         $format =& $workbook->addFormat();//formatar a planilha
         $format->setBold();//colocar negrito

         $num_fields = $rs->GetFieldCount();//quantidade de campos do sql - é quantidade de colunas da consulta

         for ($i = 0; $i < $num_fields; $i++)//vou escrevendo o nome das colunas na primeira linha da planilha
           $worksheet1->write_string(0, $i, $rs->GetFieldName($i), $format);

         $rs->Reset();//limpo a consulta
         $j = 0;
         while(!$rs->IsEof())//enquanto tiver resultado 
         {
           $j++;
           for ($i = 0; $i < $num_fields; $i++)
           {
             $pos_vl   = strpos($rs->GetFieldName($i), "frete_empresa");  
             $formato  = null;                                        

             if ($pos_vl)
             {
              $formato = "mso-number-format:\@;";
              $campo = $rs->GetField($i); //$campo = Format_Number($rs->GetField($i), 2, "sys", "pt_BR");//da empresa             
             }
             else //para os outros campos não definidos segue normalmente 
               $campo = $rs->GetField($i);

             $worksheet1->write($j, $i, $campo, $formato);//escrevo os valores na célula 
             if (count($this->mTotalFieldsArray))
               foreach ($this->mTotalFieldsArray AS $key=>$value)
                 if ($value == $rs->GetFieldName($i)) 
                   $this->mTotalArray[$value] += (!strlen($rs->GetField($i))?0:$rs->GetField($i));
           }
           $rs->Next();
         }

         $j++;
         if (count($this->mTotalFieldsArray))
           for ($i = 0; $i < $num_fields; $i++)
             (in_array($rs->GetFieldName($i), $this->mTotalFieldsArray))?
               $worksheet1->write($j, $i, $this->mTotalArray[$rs->GetFieldName($i)]):
               $worksheet1->write($j, $i, null);

         $workbook->close();
       }
       else
       {
         if ($argc == 0)
         {
           $html = new JHtml($pTitle);
           $html->AddHtml("<h4>Não há registros para o(s) filtro(s) informado(s)!</h4>");
           $html->AddHtml("<br><br><a href=\"#\" onClick=\"window.close();\">Fechar Janela</a>");
           echo $html->GetHtml();
         }
       }
     }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe um método que escreve um número, porque você não verifica se o campo é com um formato numérico e então utilize esse método?

 

Worksheet::writeNumber

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe um método que escreve um número, porque você não verifica se o campo é com um formato numérico e então utilize esse método?

 

Worksheet::writeNumber

foi uma boa sugestão, mas ele escreve apenas numero, e como eu uso o number_format que é uma string ele não escreve,

e se eu converter de volta para double fica muito feio tipo o valor original é 2250, o que eu quero é 2250,00 em number_format fica como eu quero, mas em texto e se eu mandar de volta para double fica 2.25, estranho não?

mas vou continuar lendo esse método

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é nada estranho. O problema está no formato.

 

Vírgula não faz parte de um formato numérico de um computador. Somente para "humanos".

 

Substitua a vírgula por ponto.

 

Para entender melhor sobre os formatos numéricos, leia este post:

Multiplicação de Dinheiro em PHP?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok vou usar o método writeNumber

mas para que fique bem legal, como eu coloco as duas casas decimais num número inteiro, é possível sem fazer com que ele vire uma string?

valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites
como eu coloco as duas casas decimais num número inteiro, é possível sem fazer com que ele vire uma string?

Se você colocar casa decimais, deixa de ser um inteiro e se torna um número racional. Mas não necessariamente será uma string. Somente number_format retorna uma string, pois é isso que ele faz, formatar um número.

 

Entenda sobre formatos numéricos, além de inteiros (int), existem:

- long;

- float;

- double.

 

Todos são formatos numéricos, com a exceção de que os inteiros são apenas inteiros. O resto compreende os números racionais, exceto dízimas periódicas pois programação possui somente números finitos.

 

Se você precisa representar um valor fracionário, utilize um formato float/double/long, todos resolverão seu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para entender melhor sobre os formatos numéricos, leia este post:

Multiplicação de Dinheiro em PHP?

 

Só uma ponderação sobre uma resposta sua neste tópico

Na computação, diferente do conceito "humano", o ponto flutuante é definido por ponto, e não por vírgula.

 

A vírgula é um conceito de localização de alguns países.

 

Os humanos nos Estados Unidos, Inglaterra, França também separam os decimais com ponto. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal 10 minutos depois eu consegui resolver meus problemas, com a a própria biblioteca, só esqueci de postar a solução, aqui vai:

elseif ($pos_tele) //caso meu campo seja texto ele escreve em formato de texto
{
 $campo = Format_Fone($rs->GetField($i), "sys", "pt_BR");//meu método para formatar telefone kkkkk
 $worksheet1->write($j, $i, $campo);//escrevo na planilha 
}
elseif ($pos_vl)//caso seja um número
{
 $formato =& $workbook->addFormat();//crio esse objeto para formatar ele vem da classe Format
 $formato->setNumFormat("0.00");//para colocar a vírgula como se fosse em moeda
 $campo = $rs->GetField($i);//meu campo do banco 
 $worksheet1->writeNumber($j, $i, $rs->GetField($i), $formato); //e aqui a onde a magia funciona escreve formatado
}

 

valeu pessoal te mais!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.