Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL][PHP]Eksport do excela - format liczb, Mają być przecinki zamiast kropek
Therminus
post 22.01.2019, 19:55:54
Post #1





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Php wyświetla mi dane z bazy MySql. Ale potrzebuję też eksport tych danych do Excela (a właściwie do formatu csv).
Znalazłem gdzieś kod, który miał to robić, ale nie działał. Trochę go poprawiłem i Excel już ładnie mi ładuje ten plik csv.
Niestety w obecnej postaci ten plik jest bezużyteczny - liczby nie zawierają przecinków, tylko kropki.
Próbowałem zmusić PHP do zmiany formatu liczb, ale wymiękłem. Może ktoś mi pomóc?

Kod
<?php
    $host = 'localhost';
    $user = 'admin';
    $pass = 'tajne_haslo';
    $db = 'nieruchomosci';
    $table = 'budynki';
    $file = 'bron_12-14';
    
    $link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
    mysql_select_db($db) or die("Can not connect.");
    
    mysql_query('SET NAMES CP1250');
    $zapytanie = "SELECT * FROM $table WHERE `ID` LIKE '5' ";
    $result = mysql_query ("SHOW COLUMNS FROM ".$table."");
    $i = 0;
    if (mysql_num_rows($result) > 0)
    {
    while ($row = mysql_fetch_assoc($result))
        {
        $csv_output.= $row['Field'].";";
        $i++;
        }
    }
    $csv_output.= "\n";
    $values = mysql_query($zapytanie);
    $liczba1 = mysql_query("SELECT `Pow_Uzyt` FROM $table WHERE `ID` LIKE '5' ");
    $flicz1 = number_format($liczba1, 2, ',', ' ');
    while ($rowr = mysql_fetch_row($values))
    {
    $csv_output.= "\n";
    for ($j=0;$j<$i;$j++)
        {
        $csv_output.= $rowr[$j].";";
        $flicz1;
        }
     $csv_output.= ";";
    }
    
    $filename = $file."_".date("Y-m-d_H-i",time());
    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: csv" . date("Y-m-d") . ".csv");
    header("Content-disposition: filename=".$filename.".csv");
    print $csv_output;
    exit;
    ?>


Kolumn z liczbami dziesiętnymi mam 6. Tutaj na razie użyłem tylko jednej `Pow_Uzyt`.
Go to the top of the page
+Quote Post
markonix
post 22.01.2019, 23:06:15
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  1. /**
  2.  * @param string|float $string
  3.  * @param bool $filter Is false then no cast to float but saving formatting
  4.  * @return mixed|string
  5.  */
  6. function float_to_windows_style($string, $filter = true)
  7. {
  8. $float = $filter ? (float) filter_var($string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) : $string;
  9. return strlen($string) ? str_replace('.', ',', $float) : '';
  10. }


Lub po prostu
  1. str_replace('.', ',', $float)




--------------------
Go to the top of the page
+Quote Post
borabora
post 23.01.2019, 08:44:40
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 33
Dołączył: 8.09.2014

Ostrzeżenie: (0%)
-----


albo number_format z trzecim parametrem
Go to the top of the page
+Quote Post
Therminus
post 24.01.2019, 20:12:30
Post #4





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Cytat(markonix @ 22.01.2019, 23:06:15 ) *
Lub po prostu
  1. str_replace('.', ',', $float)


Dzięki za zainteresowanie.
Niestety, nie bardzo wiem gdzie to wstawić w kodzie, który mam.
Jakaś podpowiedź?
Go to the top of the page
+Quote Post
Tomplus
post 25.01.2019, 07:17:35
Post #5





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


W ogóle polecam tworzyć tablicę a nie stringi

a następnie użyć funkcji
  1. implode(';', $row);



Sporóbuj w zapytaniu SQL po SELECT dodać coś takiego:
  1. SELECT FORMAT(`Pow_Uzyt`, 2, 'de_DE') `Pow_Uzyt`;


Ten post edytował Tomplus 25.01.2019, 07:18:14
Go to the top of the page
+Quote Post
Therminus
post 25.01.2019, 11:56:18
Post #6





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Cytat(Tomplus @ 25.01.2019, 07:17:35 ) *
Sporóbuj w zapytaniu SQL po SELECT dodać coś takiego:
  1. SELECT FORMAT(`Pow_Uzyt`, 2, 'de_DE') `Pow_Uzyt`;


Niestety, wymiękam.
Zmienna
Kod
$zapytanie = "SELECT * FROM $table WHERE `ID` LIKE '5' ";

musi być.
Próbowałem utworzyć nową zmienną, a potem podstawić ją w dalszym zapytaniu, ale nie działa.

Kod
$comma = "SELECT FORMAT($zapytanie, 2, 'de_DE')";


Tam dalej w kodzie (patrz pierwszy post) mam utworzoną nową zmienną
Kod
$values = mysql_query($zapytanie);

zatem zrobiłem coś takiego:
Kod
$values = mysql_query($comma);

No i to właśnie nie działa.

Nie wiem, czy dobrze kombinuję, ale myślę, że coś z "SELECT FORMAT" jest nie tak. Generalnie chodzi mi o to, aby tylko liczby dziesiętne były sformatowane przecinkiem (mam jeszcze w tabeli liczby całkowite).
Go to the top of the page
+Quote Post
Tomplus
post 25.01.2019, 12:04:45
Post #7





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Musisz łyknąć więcej wiedzy na temat zapytań SQL, ja tylko pokazałem przykład, a nie całe poprawne zapytanie, poprawnie będzie gdy dodasz do niego jeszcze FROM i WHERE

  1. $zapytanie = "SELECT FORMAT(`Pow_Uzyt`, 2, 'de_DE') `Pow_Uzyt` FROM {$table} WHERE `ID` = 5;";
  2. $values = mysql_query($zapytanie);


Go to the top of the page
+Quote Post
viking
post 25.01.2019, 12:05:00
Post #8





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


W kodzie masz
  1. $liczba1 = mysql_query("SELECT `Pow_Uzyt` FROM $table WHERE `ID` LIKE '5' ");

Logicznym jest że miałeś to sobie podstawić w tej linii
  1. $liczba1 = mysql_query("SELECT FORMAT(`Pow_Uzyt`, 2, 'de_DE') `Pow_Uzyt` FROM $table WHERE `ID` = 5 ");


--------------------
Go to the top of the page
+Quote Post
Therminus
post 25.01.2019, 13:14:42
Post #9





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Tyle się nakombinowałem, a rozwiązanie bardzo proste.
Wklejam cały kod.
  1. <?php
  2. $host = 'localhost';
  3. $user = 'admin';
  4. $pass = 'haslo';
  5. $db = 'nieruchomosci';
  6. $table = 'budynki';
  7. $file = 'bron_12-14';
  8.  
  9. $link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
  10. mysql_select_db($db) or die("Can not connect.");
  11.  
  12. mysql_query('SET NAMES CP1250');
  13. $zapytanie = "SELECT * FROM $table WHERE `ID` LIKE '5' ";
  14. $result = mysql_query ("SHOW COLUMNS FROM ".$table."");
  15. $i = 0;
  16. if (mysql_num_rows($result) > 0)
  17. {
  18. while ($row = mysql_fetch_assoc($result))
  19. {
  20. $csv_output.= $row['Field'].";";
  21. $i++;
  22. }
  23. }
  24. $csv_output.= "\n";
  25. $values = mysql_query($zapytanie);
  26. while ($rowr = mysql_fetch_row($values))
  27. {
  28. $csv_output.= "\n";
  29. for ($j=0;$j<$i;$j++)
  30. {
  31. $csv_output.= $rowr[$j].";";
  32. }
  33. $csv_output.= ";";
  34. }
  35. $filename = $file."_".date("Y-m-d_H-i",time());
  36. header("Content-type: application/vnd.ms-excel");
  37. header("Content-disposition: csv" . date("Y-m-d") . ".csv");
  38. header("Content-disposition: filename=".$filename.".csv");
  39. echo str_replace('.', ',', $csv_output);
  40. ?>


Linia nr 39 tylko wymagała poprawy.
Ale jest jeden mały szkopuł.
W jednej kolumnie czasem w tekście pojawia sie kropka i ona jest zamieniana na przecinek.
Nie bardzo mi to pasuje.
Jak zrobić, aby zamiana następowała tylko dla wartości float?

Ten post edytował Therminus 25.01.2019, 15:48:43
Go to the top of the page
+Quote Post
Tomplus
post 25.01.2019, 14:32:38
Post #10





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


jeżeli dane liczbowe są dobrze zatypowane to wystarczy w pętli while dodać:

  1. if(is_float($rowr[$j])) {
  2. $rowr[$j] = str_replace('.', ',', (string)$rowr[$j]);
  3. }


Warunek sprawdza czy wartość z bazy wyszła jako float.
Go to the top of the page
+Quote Post
Therminus
post 25.01.2019, 16:49:12
Post #11





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Sorry, pomyłka. Zamroczyło mnie.
Nie mam float, tylko decimal. I tak musi zostać.
będzie gorzej, prawda?
Go to the top of the page
+Quote Post
Tomplus
post 25.01.2019, 19:20:55
Post #12





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Nie pytaj się tylko sprawdź. Decimal to także liczba zmiennoprzecinkowa.
Go to the top of the page
+Quote Post
Therminus
post 28.01.2019, 12:51:19
Post #13





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Cytat(Tomplus @ 25.01.2019, 19:20:55 ) *
Nie pytaj się tylko sprawdź. Decimal to także liczba zmiennoprzecinkowa.


Sprawdziłem, ale chyba nie umiem tego wstawić we właściwe miejsce.
Próbowałem is_float i is_numeric.
Nie działa. Mam kropki zamiast przecinków
Go to the top of the page
+Quote Post
nospor
post 28.01.2019, 13:01:12
Post #14





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




@Tomplus
is_float('2.5') nigdy nie zwroci ci true

Dosc ciekawe rozwiazanie podal viking. Czemu go skrzetnie omijacie?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Tomplus
post 28.01.2019, 15:24:36
Post #15





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


@Nospor
Prawda

A co do rozwiązania Vikinga, to ja go podałem najpierw.
Go to the top of the page
+Quote Post
nospor
post 28.01.2019, 15:26:31
Post #16





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
A co do rozwiązania Vikinga, to ja go podałem najpierw.
Tez prawda. Wybacz, jechalem od dolu do gory i stanalem na pierwszym poprawnym rozwiazaniu, ktore w tej kolejnosci padlo na Vikinga smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Tomplus
post 28.01.2019, 20:35:38
Post #17





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Co do:
is_float('2.5') ja zasugerowałem naszemu koledze żeby sprawdził w ogóle jakie dane dostarcza mu baza danych SQL, jeżeli to string to is_float -> FALSE.

@Therminus
Tutaj masz mały eksperyment, możesz sprawdzić działanie u siebie lub np. na takich stronach jak: http://phptester.net/
Wszystkie liczby są stringami lub typu float.

  1. $strings = array('1820.20', 121.21, -12, -100.99, '10002', 'wsl!12', '2.5');
  2. foreach ($strings as $testcase) {
  3. if (is_numeric($testcase)) {
  4. echo "Number: YES. $testcase \n<br>";
  5. } else {
  6. echo "Number: NO. $testcase \n<br>";
  7. }
  8. }


Go to the top of the page
+Quote Post
nospor
post 29.01.2019, 09:53:16
Post #18





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
is_float('2.5') ja zasugerowałem naszemu koledze żeby sprawdził w ogóle jakie dane dostarcza mu baza danych SQL,
Jak pobierasz dane z bazy to one sa zawsze STRING nawet jesli w bazie to FLOAT. O to mi chodzilo. Wiec sprawdzanie na danych z bazy is_float nie ma zadnego sensu.





--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Tomplus
post 29.01.2019, 16:39:43
Post #19





Grupa: Zarejestrowani
Postów: 1 829
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


dlatego teraz sugeruję is_numeric smile.gif
Go to the top of the page
+Quote Post
Therminus
post 30.01.2019, 15:57:27
Post #20





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 24.05.2015

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 28.01.2019, 13:01:12 ) *
@Tomplus
is_float('2.5') nigdy nie zwroci ci true

Dosc ciekawe rozwiazanie podal viking. Czemu go skrzetnie omijacie?


Rozwiązanie istotnie jest ciekawe i zapytanie SQL rzeczywiście zwraca przecinki, ale takich kolumn z liczbami decimal mam 6.
Nie bardzo widzę możliwość zastosowania tego rozwiązania.
Na początku myślałem, że jak utworzę 6 zmiennych ($liczba1, $liczba2 itd) to mi się na coś przydadzą, ale teraz widzę, że nie.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 05:03