Laravel-excel: Laravel 4.2 / Laravel-Excel 1.3: Números formatados como texto ainda aparecendo como números

Criado em 3 dez. 2015  ·  38Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Estou brincando com isso há alguns dias, mas simplesmente não consigo fazer funcionar. Eu tenho alguns números longos (16 dígitos) armazenados em meu banco de dados que estou usando a função toArray () para criar minha planilha Excel xlsx. O código que estou usando para formatar a coluna:
$sheet->setColumnFormat(array( 'A' => '@' ));

No entanto, os números estão sendo mostrados no excel como números e estão sendo encurtados com notação científica.

Há algo que eu possa fazer sobre isso além de anexar um espaço de cada lado?

Estou ciente do limite de 15 dígitos do Excel, no entanto, ao formatar como texto, fui levado a acreditar que isso não seria um problema.

Comentários muito úteis

$ excel-> sheet ('staff', function ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (array (
'H' => '@',
));
$ planilha-> linhas ($ dados, verdadeiro);
});

Espero que isto ajude ;)

Todos 38 comentários

O mesmo problema aqui, porém, no meu caso, são strings de 14 dígitos.

Se você quiser evitar a notação científica para números longos no Excel, será necessário definir uma máscara de formato que exiba explicitamente esses valores como números ..... usar @ é simplesmente dizer ao MS Excel para usar seu comportamento padrão (que é usar formato científico para números mais longos) .... Eu sugiro que você use uma máscara de formato de #0 vez

Mesmo assim, não está funcionando. Isso é o que eu tentei: $ sheet-> setColumnFormat (['id' => '# 0']) ;. Também suspeito que setColumnFormat não funcione tão bem com CSVs, pois experimentei vários formatos e realmente não afetou o formato da coluna.

Não sei se isso faz diferença, entretanto, estou usando $ sheet-> fromModel ($ result); e tentei $ sheet-> fromArray ($ result-> toArray ()) e ambos resultaram neste problema.

Para aqueles que têm esse problema com CSVs, criei o seguinte método:

public function getStringIdAttribute ()
{
return '= "'. $ this-> id. '"';
}
e no topo do meu modelo adicionei:
protegido $ appends = ['string_id'];

e isso forçou o número a ser exibido como texto no Excel (bem como nas planilhas Kingsoft).

Se você está escrevendo em CSV e visualizando via Excel, o CSV não armazena a máscara de formato e o Excel exibirá o resultado como um número usando seu formato padrão (científico para valores maiores) ..... sempre verifique qualquer CSV usando um editor de texto

Tentei exportar o arquivo usando "# 0" como formato de coluna, mas ele converte o último dígito em 0. Se @ for o identificador do 'padrão', como posso listar a célula apenas como texto para que o Excel não toque em nada ?

Atualmente, minha solução alternativa é exportar do laravel-excel como csv e, em seguida, estou usando um script python que escrevi para exportar como xlsx, pois o openpyxl parece ser capaz de formatar como texto corretamente.

Existe alguma correção para esse comportamento? Estou exportando para XSLX de um array onde tenho strings como "10E00" que são exportadas como o número "10" no excel. setColumnFormat "@" não funciona para mim ...

@lachyn Eu nunca achei uma boa solução, como eu disse acima, a solução alternativa que acabei usando foi exportar como um arquivo CSV laravel e executar um comando shell para converter a saída para xlsx com um script python.

@lszanto mas isso é estranho, mesmo se eu exportar para "CSV" eu tenho o valor "10" em vez de "10E00", e tenho certeza que em meu array está a string "10E00" ....

@lachyn Com o que você está abrindo o CSV? Se for apenas um editor de texto, talvez o laravel esteja tocando em outra coisa, já que o CSV deve ser apenas a saída bruta, sem modificadores ou qualquer coisa.

Se você quiser e os dados não forem privados, você pode postar uma amostra e eu darei uma chance quando eu tiver a chance.

@lszanto editor de texto sublime ...
Estou fazendo uma consulta com toArray () no final. Se eu despejar esse array, fica com "10E00", depois de exportar ... "10". A exportação é feita a partir desse array, portanto, todos os modificadores são feitos na consulta .... Portanto, ele deve ser alterado durante a exportação.

@lszanto provavelmente encontrei a causa deste problema. Se eu remover a linha do cabeçalho da minha exportação

  $sheet->prependRow(..)

agora está funcionando como esperado .... então provavelmente esta função de alguma forma quebra a formatação. Tentei gerar a folha do modelo ou da matriz, mesmos resultados.

Excel::create('sklad_vyrobku-'.date('d-m-Y', time()), function($excel) use ($table) {
            $excel->sheet('Sklad vyrobku k '.date('d-m-Y', time()), function($sheet) use ($table) {                                         
                 $sheet->fromModel($table, null, 'A1', false, false);
                     $sheet->prependRow(array('id','kod','...'));
                 $sheet->setColumnFormat(array('B'=>'@','C'=>'@','D'=>'@','E'=>'@'));
            });
         })->download('xlsx');

Eu tive o mesmo problema (Laravel 4.2), mas resolvi chamando setColumnFormat imediatamente após abrir o fechamento da função $ excel-> sheet.
Portanto, não acho que seja um bug, apenas uma abordagem lógica.

Exemplo:

$excel->sheet("FooBar", function($sheet) use ($x, $y, $z) {

    $sheet->setColumnFormat(array(
       "G:H" => "@",
       "Z" => "@",
       'AH:AI' => '0',
       "AO:BB" => "h:mm",
       "BE:BR" => "h:mm",
    ));

    ...

});

Eu ainda estava tendo esse problema e nenhuma das soluções acima funcionou para mim. Eu estava importando meus dados de um array e enquanto todos os valores lá eram strings , eu estava pensando que setColumnFormat ainda faria seu trabalho e converteria as células em Number Format , não foi esse o caso.
A forma como resolvi isso foi convertendo todos os valores em meu array em floats / ints antes de usar o método fromArray para importar os dados para a planilha.

Portanto, se nada funcionar para você, certifique-se de que os dados que você está importando sejam do tipo correto antes de inseri-los na planilha. Espero que isso ajude alguém :)

Eu encontrei uma solução alternativa usando setCellValueExplicit ()
por exemplo:

$sheet->setColumnFormat(array( //se formatea la columna a texto
    'C' => \PHPExcel_Style_NumberFormat::FORMAT_TEXT,
    'I' => 'dd-mm-yyyy hh:mm'
));

$sheet->setCellValueExplicit('C10', $object->card_number, \PHPExcel_Cell_DataType::TYPE_STRING);

Espero que isto ajude ;)

$ excel-> sheet ('staff', function ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (array (
'H' => '@',
));
$ planilha-> linhas ($ dados, verdadeiro);
});

Espero que isto ajude ;)

Eu ainda estou com o mesmo problema. Na verdade, ele muda o formato (fonte), mas não o formato dos dados.
captura de pantalla 2017-04-04 a las 11 11 39 a m
captura de pantalla 2017-04-04 a las 11 05 19 a m
captura de pantalla 2017-04-04 a las 11 12 58 a m

É um bug ou estou fazendo da maneira errada?

@minkadev
$sheet->rows($data, true) adiciona todas as regras "explícitas". Isso significa que ele será adicionado como string e, portanto, a formatação da coluna será ignorada.

Obrigado @patrickbrouwers.
Eu também tento com:

$sheet->fromArray($data, null, 'A1', false, false);

Acho que descobri por que não funciona, não tenho certeza por que foi adicionado: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 It adiciona numéricos e inteiros como valores de "string" também.

Então não vai funcionar? :(

Apenas não defina $sheet->rows($data, true); explícito

Usar:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); funciona bem para mim.

Ainda não funciona. Além disso, como posso formatar colunas usando:
$sheet->fromArray($data, null, 'A1', false, false);

Seu código de exemplo com $sheet->rows($data); funciona bem para mim. A formatação da coluna está correta quando eu abro no Excel.

Isso é estranho. Ainda não funciona:
captura de pantalla 2017-04-05 a las 11 15 20 a m
captura de pantalla 2017-04-05 a las 11 13 48 a m
Eu tenho a versão certa? (v2.1.16)

Alguém? .. Ainda estou tendo esse problema ...

No Laravel 5.3, maatwebsite / excel 2.1.12

Consegui fazer funcionar com as duas mudanças a seguir

  1. @LastxTemplar sugestão de
  2. colocar o setColumnFormat () imediatamente após abrir $ excel-> fechamento da função de planilha, por @ nikola-absolute

Eu tenho esse problema recentemente, estou tentando usar o método setColumnFormat , mas não funciona para mim.
Esta é a minha solução alternativa:

foreach (...) {
    $sheet->row($row, [
        /* Your Data */
    ]);
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value, \PHPExcel_Cell_DataType::TYPE_STRING);
}

O tipo de nota de $column e $row é integer , consulte aqui .

No Laravel 5.1, maatwebsite / excel 2.1.0
Consegui fazer funcionar apenas lançando o número para um float ou int
:(
Portanto, tenho que fazer um loop para cada linha para fazer isso.

Também está tendo esse problema. Alguma atualização está chegando?

Editar: apenas consertado também é com a solução alternativa de @ Neighbourhood999

Todos os exemplos aqui estão falando sobre exportação para o Excel,que tal importar de amostras do excel

valor-> imei_1 = 356803081142590;

mas acabo obtendo imei_1 como "3.5680308104231E + 14"

<?php

$path = $request->file('excel')->getRealPath();
$data = Excel::load($path, function ($reader) {
})->get(['brand', 'model', 'batch', 'imei_1', 'imei_2']);

if (!empty($data) && $total = $data->count()) {
    foreach ($data as $key => $value) {
              $insert[] = ['brand' => $value->brand,
                           'model' => $value->model,
                           'batch' => $request->batch ? $request->batch : $value->batch,
                           'imei_1' => strval($value->imei_1),
                           'imei_2' => strval($value->imei_2),
                           'created_at' => Carbon::now(),
                           'updated_at' => Carbon::now()
                         ];
        }
    /*if (!empty($insert)) {
        Device::insert($insert);
        // dd('Insert Record successfully.');
    }*/
}

@ Ra1da35ma Estou tendo o mesmo problema. Você chegou a algum lugar com isso?

Tentei definir um fichário de valor personalizado, mas não está funcionando porque os valores que estão sendo vinculados às células já estão em notação científica. Posso abrir outro problema para tentar resolver isso, pois não é estritamente o mesmo problema, mas espero que você tenha mais algumas informações.

Eu encontrei uma solução. O problema tinha a ver com o PHP e sua variável de precisão .ini que é lida pela classe PHPExcel_Calculation. Você não pode sobrescrever isto no pacote Laravel-Excel nem realmente em seu pacote pai PHPExcel. Em vez disso, para corrigir isso, acabei de adicionar ini_set('precision', 20) antes de chamar a função de carregamento do Excel.

Esta é minha função:

public function getXlsxFile($filePath)
    {
        ini_set('precision', 18);
        $collection = Excel::load($filePath);

        return $collection->get();
    }

É assim que funciona para mim com o laravel 5.1

$ myFile = Excel :: create ($ filename, function ($ excel) use ($ array) {
$ excel-> setTitle ('título');
$ excel-> sheet ('sheet 1', function ($ sheet) use ($ array) {
$ sheet-> setColumnFormat (array ('B' => '0'));
$ sheet-> setColumnFormat (array ('C' => '0'));
$ sheet-> setColumnFormat (array ('D' => '0'));
$ sheet-> setColumnFormat (array ('E' => '0'));
$ folha-> linhas ($ array, false);
// definir nomes de coluna
$ sheet-> prependRow (array (
'Nome da coluna 1', 'Caixa 1', 'Caixa 2', 'Caixa 3', 'Total'
));
});
});

Estamos fechando todos os tickets antigos, pois a versão 2. * está chegando ao fim da vida útil. Nossa atenção total está agora voltada para a versão 3.0. Ainda é possível usar 2. *, mas não haverá mais suporte ativo.

Casting value to integer funcionou para mim.

Esta é a melhor resposta, digite converter suas variáveis ​​na matriz antes de passá-las para o método ->fromArray : por exemplo,
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

Esta página foi útil?
0 / 5 - 0 avaliações