Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parser do csv dla exel
Forum PHP.pl > Forum > PHP
Gothicbezimienny
Witam, piszę właśnie funkcje do zapisu danych w pliku .csv (ponieważ chce otwierać w excelu) z bazy danych. Niestety w aktualnej wersji nie działa mi sam zapis do pliku za pomocą header(), selekt i samo wyświetlenie danych jest okej, lecz nie generuje mi pliku *.csv. Może mi ktoś wskazać co robię źle i jak powinno się to robićza pomocą header()?smile.gif
  1. function AkcjaParsuj(){
  2.  
  3.  
  4.  
  5. $Sort = $this->GenerujSortowanie();
  6.  
  7.  
  8.  
  9.  
  10. $data = '';
  11. $header = 'faktury';
  12. $error = "Błąd z zapytaniem";
  13.  
  14.  
  15.  
  16. $querys = "SELECT * from tabela" // to jest przykładowy selekt na pewno działa
  17.  
  18.  
  19.  
  20.  
  21.  
  22. var_dump($querys);
  23.  
  24.  
  25.  
  26.  
  27. if($this->Baza->Query($querys)){
  28.  
  29.  
  30.  
  31.  
  32. //$fp = fopen('faktury.csv', 'w');
  33.  
  34.  
  35.  
  36. while( $r = $this->Baza->GetRow($querys))
  37. {
  38.  
  39. $line = '';
  40.  
  41. foreach( $r as $value ){
  42.  
  43. if ( ( !isset( $value ) ) || ( $value == "" ) ){
  44.  
  45. $value = "\t";
  46.  
  47. }else{
  48.  
  49. $value = str_replace( '"' , '""' , $value );
  50. $value = '"' . $value . '"' . "\t";
  51. }
  52.  
  53. $line .= $value;
  54. }
  55.  
  56. $data .= trim( $line ) . "\n";
  57. }
  58.  
  59. $data = str_replace( "\r" , "" , $data );
  60.  
  61. if ( $data == "" ){
  62.  
  63. $data = "\nNo Record(s) Found!\n";
  64.  
  65. }
  66.  
  67.  
  68. header("Content-type: application/octet-stream");
  69. header("Content-Disposition: attachment; filename='faktury.csv'");
  70. header("Pragma: no-cache");
  71. header("Expires: 0");
  72. print "$header\n$data";
  73.  
  74.  
  75. //fclose($fp);
  76.  
  77.  
  78. }else{
  79.  
  80. echo $error;
  81. }
  82.  
  83.  
  84.  
  85.  
  86. }
  87.  
emstawicki
Próbowałeś wysłać nagłówek Content-type ustawiony na text/csv?
Gothicbezimienny
tak i daje to to taki sam efekt a właściwe jego brak haha.gif
trueblue
Cytat(Gothicbezimienny @ 4.07.2016, 10:05:24 ) *
  1. header("Content-type: teapplication/octet-streamxt");


Co to za nagłówek?

  1. header("Content-type: text/csv");

lub
  1. header("Content-type: application/octet-stream");

Gothicbezimienny
Tak małą pomyłka podczas prób zanim napsiałem na forum ale po poprawieniu na wskazane przez ciebie nagłówki nie daje to żadnego efektu. Plik się nie tworzy.
trueblue
Wyrzuć tymczasowo nagłówki i wrzuć w while var_dump($r);
Zobaczysz czy na pewno są jakieś wiersze.
emstawicki
Otrzymujesz jakiś błąd php?

Nie łatwiej będzie wczytać dane do tablicy, utworzyć plik, wypełnić danymi (fputcsv) a potem wysłać nagłówki do pobrania?
Gothicbezimienny
Tak są, sprawdziłem każdy krok w kodzie za pomocą var_dump i wszystko wygląda dobrze poza tym, ze nie tworzy pliku ;/


emstawicki:
Nie mam błędu żadnego.
Łatwiej pojęcie względne, i tak i tak nie jest to jakiś wysoki poziom. Wziąłem się od tej strony i dziwi mnie to że nie działa chciałbym wiedzieć dlaczego w końcu uczymy się na błędach, oczywiście jeśli nie dojde do tego jak to naprawić to spróbuje innego sposobu narazie chciałby spróbować zrobić to tak jak jest aktualnie.
trueblue
Czy ten kod wyrzuca u Ciebie plik?
  1. $r=array('abc','def','ghi');
  2.  
  3.  
  4. $line = '';
  5.  
  6. foreach( $r as $value ){
  7.  
  8. if ( ( !isset( $value ) ) || ( $value == "" ) ){
  9.  
  10. $value = "\t";
  11.  
  12. }else{
  13.  
  14. $value = str_replace( '"' , '""' , $value );
  15. $value = '"' . $value . '"' . "\t";
  16. }
  17.  
  18. $line .= $value;
  19. }
  20.  
  21. $data .= trim( $line ) . "\n";
  22.  
  23.  
  24. $data = str_replace( "\r" , "" , $data );
  25.  
  26. if ( $data == "" ){
  27.  
  28. $data = "\nNo Record(s) Found!\n";
  29.  
  30. }
  31.  
  32.  
  33. header("Content-type: application/octet-stream");
  34. header("Content-Disposition: attachment; filename='faktury.csv'");
  35. header("Pragma: no-cache");
  36. header("Expires: 0");
  37. print "$header\n$data";
Gothicbezimienny
trueblue

Niestety nie wyrzuca pliku, wypisuje mi wartości na ekran, lecz niestety pliku nie tworzy. Domyślam się ze Tobie tak i to problem gdzieś u mnie tylko ciekawe dlaczego sad.gif
LowiczakPL
Ja to od zawsze robię za pomocą funkcji PHP http://php.net/manual/en/function.fputcsv.php
emstawicki
Upewnij się czy nie wysyłasz wcześniej nigdzie nagłówków.
Powinno to działać w największym uproszczeniu, czyli:
  1. <?
  2. header("Content-type: application/octet-stream");
  3. header("Content-Disposition: attachment; filename=faktury.csv");
  4. header("Pragma: no-cache");
  5. header("Expires: 0");
  6. print "Hello World\nSimple data";

Gothicbezimienny
emstawicki miałeś racje blokowały to wcześniejsze nagłówki.


Mam nowe pytanie czy przy tworzeniu csv da sie jakoś zdefiniować wielkość kolumn w excel ponieważ zbyt długie dane wyglądają dość nieładnie "krzaczki " póki nie powiększy się rozmiaru kolumn samemu.questionmark.gif
trueblue
PHPExcel: http://stackoverflow.com/questions/1676189...ze-column-width
Gothicbezimienny
chodziło mi w ciąg dalszy w temacie przy użyciu fputcsv, poniewaz tworze plik csv, który ma byc otwierany w EXCEL smile.gif
trueblue
Tak więc podałem rozwiązanie, które umożliwia automatyczne ustalanie szerokości kolumn.
W pliku csv nie jest to możliwe.
Gothicbezimienny
Cytat
W pliku csv nie jest to możliwe.


To jest dla mnie odpowiedź. Dziękuje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.