Eksport i import CSV
Ostatnio zostałem nijako "zmuszony" do wyeksportowania danych z bazy do ulubionego programu urzędników, a mianowicie - MS Excel. Teoria była prosta, plik csv i odpowiednie nagłówki powinny załatwić sprawę.
Jeśli chodzi o OpenOffice Calc to przy otwieraniu pliku csv pyta nas jakim separatorem chcemy rozdzielić dane. Natomiast MS Excel od razu ma ustalony separator i jedyny problem jaki by się wydawało to znaleźć go.
Na początku funkcja, która zwróci nam plik csv na bazie odpowiednich parametrów.
Odpowiednim separatorem okazała się tabulacja, działało... pod 2002 ;) Może kawałek kodu:
Wszystko pięknie, ale pod wersją 2003 już niestety nie zadziałało. Okazało się, że działa średnik, ale oczywiście pod 2002 już nie działał. Postanowiłem zmienić Content-type na 'text/csv', no i udało się. Działa pod 2002 i 2003, inna kwestia, że nie działa pod OpenOffice, ale to chyba raczej wina mojego kochanego systemu, który nie umie skojarzyć pliku z aplikacją.
Podziękowania dla maco` z kanału #php.pl za testowanie przykładów na: MS Excel 2003.
Słowa kluczowe: PHP, csv, eksport, excel, import, office, artykuł, blog

Komentarze i opinie
A ja myslalem, ze CSV to dane rozdzielone przecinkami ... niezle :D
Jak sama nazwa wskazuje, są to wartości rozdzielone przecinkami. Życie jednak pokazuje, że czasem trzeba zastosować inny znak rozdzielający. Paranoją byłoby tworzenie np. plików: "wartości rodzielone tabulacjami, "wartości rozdzielone średnikami". W stanach domyślnie jest używany przecinek w excelu, w europie panuje średnik.
O ile się nie mylę, mi MS Excel 2000 rozdziela komórki w plikach *.csv za pomocą średników. Nie wiem dlaczego... :P.
Wyjasnienie do dupy, nic nie rozumiem mimo że mam Excela w jednym palcu
Janusz
Szkoda, że nie napisałeś co chcesz zrobić bo ten tekst akurat dotyczy PHP, a nie Excel. Jeśli chcesz wyeksportować dane w Excel to po prostu robisz to w górnym menu, jeśli chcesz wgrać takie dane to też to można zrobić z poziomu górnego menu, albo nadać plikowi rozszeżenie csv i dane rozdzielić średnikami. Wystarczy klikać...
stormfly - [cytat] "zmuszony" do wyeksportowania danych z bazy [/cytat]
dobra eksport jest, a gdzie import????
jak ktoś używa https to żeby poprawnie eksportować w IE należy ustawić takie nagłówki:
header("Content-type: text/csv");
header("Content-disposition: attachment; filename=".date("Y-m-d").".csv");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Pragma: no-store");
trochę mi zajęło zanim do tego doszedłem, więc się podzielę
Gwoli wyjansienia
zeby wszystko dzialalo ok pod IE (chodzi o IE6) via https:
trzeba ustawić:
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="mojplik.csv"');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
a to ze wzgledu na keszowanie pod IE6,
pozdro
W kodzie jest błąd, właściwie logiczny.
Nie przewidujesz faktu, iż w tekście który eksportujesz, w którejś s komórek może znajdować się separator - w takim wypadku dane po odczytaniu nie będą poprawne.
123
rudi dzięki męczyłem się z tym problemem "export https pod IE" 2 godziny. Pozdrawiam
Dzięki wielkie rudi.
Pragma: public pomogło mi przy HTTPS-ie.
Poniżej dokładny nagłówek jaki wysyłam:
header("Content-Type: application/xls; charset=utf-8");
header("Content-Disposition: attachment; filename=raport.xls");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header('Pragma: public');
Troche to strare ale wyciagne dla potomnych.
To po czym poznaje np excel czym rozdzielane sa pola nie zalezy od kompytera, systemu czy wersji office. Zalezy to od ustawien systemu ! Prosze sprawdzic sobie opcje regionalne i takie cos jak separator listy. I czasami tam jest srednik a czasami przecinek, a czasami jeszcze co innego. I te dane pobiera wiekszosc programow (taki jak excel). Niektore programy to modyfikuja nie tymczasowo tylko na stale. Niektore tylko wewnatrz wlasnego kodu to zminiaja. itp itd.
Takie pytanie - a czemu nie uzyjesz fputcsv i fgetcsv na streamie 'php://output'?
Wsumie nie wiem po co cos takiego, jesli posiadasz jakikolwiek plik csv to excel 2003 do zaimportowania takiego pliku ma do tego specjalną funkcje niezależnie od tego czy dane rodzielone są średnikami, spacjami czy przecinkami.
Menu Dane->Importuj dane zewnetrzne->Importuj dane
tam można sobie ustalić jakiego separatora będzie się używało.
Krótka podpowiedz , interpretacje seperatorów w MS możemy zmienić. Wystarczy napisac importer VB, który rozpoznawac będzie separator nadany w funkcji exportowej php.
Nowy komentarz