roregk 0 Denunciar post Postado Outubro 30, 2012 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
shini 318 Denunciar post Postado Outubro 30, 2012 tente formatar a coluna da planilha. Compartilhar este post Link para o post Compartilhar em outros sites
roregk 0 Denunciar post Postado Outubro 30, 2012 OPA, esqueci de dizer que na planilha eu não devo mexer, eu tenho que fazer tudo no php :-( Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Outubro 30, 2012 informe o valor como float ao invés de string. number_format retorna uma string. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Outubro 30, 2012 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
roregk 0 Denunciar post Postado Outubro 30, 2012 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
shini 318 Denunciar post Postado Outubro 30, 2012 Baixa o phpexcel para ver se resolve o problema. http://phpexcel.codeplex.com/ Compartilhar este post Link para o post Compartilhar em outros sites
roregk 0 Denunciar post Postado Outubro 30, 2012 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
Gabriel Heming 766 Denunciar post Postado Outubro 30, 2012 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
roregk 0 Denunciar post Postado Outubro 30, 2012 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
Gabriel Heming 766 Denunciar post Postado Outubro 30, 2012 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
roregk 0 Denunciar post Postado Outubro 30, 2012 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
Gabriel Heming 766 Denunciar post Postado Outubro 30, 2012 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
roregk 0 Denunciar post Postado Outubro 30, 2012 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
Gabriel Heming 766 Denunciar post Postado Outubro 30, 2012 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
Evandro Oliveira 331 Denunciar post Postado Outubro 31, 2012 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
roregk 0 Denunciar post Postado Novembro 1, 2012 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