Mam tę bardzo prostą rzecz, która po prostu wyświetla niektóre pliki w formacie CSV, ale musi to być UTF-8. Otwieram ten plik w TextEdit lub TextMate lub Dreamweaver i wyświetla on poprawnie znaki UTF-8, ale jeśli otworzę go w Excelu, robi to głupio. Oto, co mam na początku mojego dokumentu:
header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");
Wszystko to wydaje się mieć pożądany efekt, z wyjątkiem tego, że Excel (Mac, 2008) nie chce go poprawnie importować. W Excelu nie ma opcji „otwarcia jako UTF-8” ani czegoś takiego, więc… Trochę się denerwuję.
Nie mogę znaleźć nigdzie jasnych rozwiązań tego problemu, mimo że wiele osób ma ten sam problem. Najbardziej widzę dołączenie BOM, ale nie mogę dokładnie wymyślić, jak to zrobić. Jak widać powyżej, właśnie wprowadzam echo
te dane, nie piszę żadnych plików. Mogę to zrobić, jeśli zajdzie taka potrzeba, po prostu nie jestem, ponieważ w tym momencie nie wydaje się to potrzebne. Jakaś pomoc?
Aktualizacja: Próbowałem odtworzyć BOM, echo pack("CCC", 0xef, 0xbb, 0xbf);
który właśnie ściągnąłem ze strony, która próbowała wykryć BOM. Ale program Excel po prostu dodaje te trzy znaki do pierwszej komórki podczas importowania i nadal miesza znaki specjalne.
źródło
Odpowiedzi:
Aby zacytować inżyniera wsparcia Microsoft ,
Aktualizacja, 2017 : Dotyczy to wszystkich wersji programu Microsoft Excel dla komputerów Mac przed pakietem Office 2016 . Nowsze wersje (z Office 365) obsługują teraz UTF-8.
Aby wyświetlić zawartość UTF-8, którą Excel zarówno w systemie Windows, jak i OS X będzie w stanie z powodzeniem odczytać, musisz wykonać dwie czynności:
Upewnij się, że konwertujesz tekst UTF-8 CSV na UTF-16LE
Upewnij się, że dodałeś znak kolejności bajtów UTF-16LE na początku pliku
Kolejny problem, który pojawia się tylko w programie Excel w systemie OS X (ale nie w systemie Windows), pojawi się podczas przeglądania pliku CSV z wartościami oddzielonymi przecinkami, program Excel wyświetli wiersze tylko z jednym wierszem i całym tekstem wraz z przecinkami w pierwszym wierszu.
Aby tego uniknąć, należy użyć tabulatorów jako oddzielnej wartości.
Użyłem tej funkcji z komentarzy PHP (używając tabulatorów „\ t” zamiast przecinków) i działała idealnie na OS X i Windows Excel.
Zauważ, że aby rozwiązać problem z pustą kolumną na końcu wiersza, musiałem zmienić wiersz kodu, który mówi:
do
Jak mówią niektóre inne komentarze na tej stronie, inne aplikacje arkuszy kalkulacyjnych, takie jak OpenOffice Calc, własne numery Apple i arkusze kalkulacyjne Google Doc, nie mają problemów z plikami UTF-8 z przecinkami.
Zobacz tabelę w tym pytaniu, aby dowiedzieć się, co działa i nie działa w przypadku plików CSV Unicode w programie Excel
Na marginesie, mogę dodać, że jeśli używasz Composer , powinieneś spojrzeć na dodawanie
League\Csv
do swoich wymagań.League\Csv
ma naprawdę niezły interfejs API do tworzenia plików CSV .Aby skorzystać
League\Csv
z tej metody tworzenia plików CSV, sprawdź ten przykładźródło
sep=;
lubsep=,
do niego mówi Excelowi, w jaki sposób CSV jest rozdzielany i kolumny zostaną ponownie utworzone poprawnie."sep=,\n"
, a następnie w innym wierszu dodał dane. Wszystko szło dobrze, gdybym to wszystko zrobił w jednym wierszu ($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
). Teraz wszystko wygląda świetnie na komputerze Mac. Nie mam systemu Windows do testowania.Mam ten sam (lub podobny) problem.
W moim przypadku, jeśli dodam BOM do wyniku, działa:
Uważam, że jest to dość brzydki hack, ale zadziałało to dla mnie, przynajmniej dla Windows 2007 Excel. Nie jestem pewien, czy to zadziała na komputerze Mac.
źródło
Oto jak to zrobiłem (aby zachęcić przeglądarkę do pobrania pliku csv):
Jedyne, co rozwiązało problem z kodowaniem UTF8 w podglądzie CSV po naciśnięciu spacji na komputerze Mac .. ale nie w programie Excel Mac 2008 ... nie wiem dlaczego
źródło
$outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
))
.Właśnie poradziłem sobie z tym samym problemem i wpadłem na dwa rozwiązania.
Użyj klasy PHPExcel, zgodnie z sugestią bpeterson76 .
Oto metoda PHP, która pobierze niektóre dane TSV i wyśle plik Excela do przeglądarki, pamiętaj, że używa programu Excel5 Writer, co oznacza, że plik powinien być zgodny ze starszymi wersjami programu Excel, ale nie mam już dostępu do żadnego, więc nie mogę ich przetestować.
Z powodu problemów z wydajnością w PHPExcel musiałem również wymyślić, jak wygenerować plik CSV lub TSV zgodny z UTF-8 i Excel.
Oto kod PHP, którego użyłem, zauważ, że używam danych tsv (tabele jako separatory zamiast przecinków):
źródło
Miałem ten sam problem i został on rozwiązany jak poniżej:
źródło
Excel nie obsługuje UTF-8. Musisz zakodować swój tekst UTF-8 w UCS-2LE.
źródło
W moim przypadku bardzo fajnie jest zrobić plik CSV z znakami UTF-8 wyświetlanymi poprawnie w Excelu.
0xEF 0xBB 0xBF
Nagłówka BOM pozwoli Excel znać poprawne kodowanie.źródło
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
<- właśnie tego potrzebowałem. To działa jak urok.Aby kontynuować:
Wygląda na to, że problem dotyczy po prostu Excela na Macu. Nie tak generuję pliki, ponieważ nawet generowanie CSV z Excela je psuje . Zapisuję jako CSV i ponownie importuję, a wszystkie postacie są popsute.
Więc… wydaje się, że nie ma na to poprawnej odpowiedzi. Dziękuję za wszystkie sugestie.
Powiedziałbym, że z tego, co przeczytałem, sugestia @Daniel Magliola dotycząca BOM byłaby prawdopodobnie najlepszą odpowiedzią na jakiś inny komputer. Ale nadal nie rozwiązuje mojego problemu.
źródło
Działa to doskonale w programie Excel zarówno w systemie Windows, jak i Mac OS.
Napraw problemy w programie Excel, które nie wyświetlają znaków zawierających znaki diakrytyczne, litery cyrylicy, litery greckie i symbole walut.
źródło
Musst pliku CSV zawiera znak kolejności bajtów.
Lub zgodnie z sugestią i obejściem wystarczy powtórzyć to w treści HTTP
źródło
Dodaj:
Lub:
Przed zapisaniem treści w pliku CSV.
Przykład:
źródło
Ponieważ kodowanie UTF8 nie działa dobrze w programie Excel. Możesz przekonwertować dane na inny typ kodowania za pomocą
iconv()
.na przykład
źródło
Konwersja już zakodowanego tekstu utf-8 za pomocą
mb_convert_encoding
nie jest potrzebna. Po prostu dodaj trzy znaki przed oryginalną treścią:Dla mnie rozwiązało to problem znaków specjalnych w plikach csv.
źródło
fputs
.Jak zbadałem i stwierdziłem, że UTF-8 nie działa dobrze na MAC i Windows, więc próbowałem z Windows-1252, obsługuje dobrze na obu z nich, ale musisz wybrać rodzaj kodowania na Ubuntu. Oto mój kod
$valueToWrite = mb_convert_encoding($value, 'Windows-1252');
źródło
źródło
Co powiesz na wyjście w samym Excelu? Jest to doskonała klasa, która pozwala generować pliki XLS po stronie serwera. Używam go często dla klientów, którzy nie mogą „rozgryźć” plików CSV i do tej pory nigdy nie mieli skargi. Pozwala także na dodatkowe formatowanie (cieniowanie, wysokości wierszy, obliczenia itp.), Którego csv nigdy nie zrobi.
źródło
możesz przekonwertować ciąg CSV za pomocą iconv . na przykład:
źródło
Musisz użyć kodowania „Windows-1252”.
Może musisz przekonwertować swoje ciągi:
źródło
Możesz dodać 3 bajty do pliku przed eksportem, to działa dla mnie. Przed wykonaniem tego systemu działa tylko w systemie Windows i HP -UX, ale nie działa w systemie Linux.
Posiadaj BOM UTF-8 (3 bajty, hex EF BB BF) na początku pliku. W przeciwnym razie program Excel zinterpretuje dane zgodnie z domyślnym kodowaniem ustawień regionalnych (np. CP1252) zamiast utf-8
Generowanie pliku CSV dla programu Excel, jak umieścić nowy wiersz w wartości
źródło
Jestem na komputerze Mac, w moim przypadku po prostu musiałem określić separator
"sep=;\n"
i zakodować plik w UTF-16LE w następujący sposób:źródło
Dla mnie żadne z powyższych rozwiązań nie zadziałało. Poniżej jest to, co zrobiłem, aby rozwiązać problem: zmodyfikuj wartość za pomocą tej funkcji w kodzie PHP:
Te wartości wyjściowe są prawidłowe w arkuszu programu Excel.
źródło
Miałem ten sam problem, gdy miałem procedurę Excel VBA, która importowała dane. Ponieważ CSV jest zwykłym formatem tekstowym, pracowałem nad tym, programowo otwierając dane w prostym edytorze plików, takim jak Wordpad, i ponownie zapisując je jako tekst Unicode lub kopiując je do schowka i wklejając je do programu Excel. Jeśli program Excel nie analizuje automatycznie pliku CSV w komórkach, można to łatwo naprawić za pomocą wbudowanej funkcji „Tekst do kolumn”.
źródło
Czy problem nadal występuje, gdy zapiszesz go jako plik .txt i otworzą go w programie Excel z przecinkiem jako separatorem?
Problemem może nie być w ogóle kodowanie, może to być po prostu to, że plik nie jest doskonałym CSV zgodnie ze standardami programu Excel.
źródło
Ten post jest dość stary, ale po wielu godzinach próbuję udostępnić swoje rozwiązanie… może to pomaga komuś, kto ma do czynienia z Excelem, Maciem i CSV i potyka się o to zagrożenie. Generuję csv dynamicznie jako dane wyjściowe z bazy danych z myślą o użytkownikach programu Excel. (UTF-8 z BOM)
Próbowałem wielu ikonv, ale nie mogłem uzyskać niemieckich umlautów pracujących w Mac Excel 2004. Jedno rozwiązanie: PHPExcel. To świetnie, ale jak na mój projekt trochę za dużo. Dla mnie działa tworzenie pliku csv i konwersja tego pliku csv do formatu xls za pomocą tego PHPsnippet: csv2xls . wynik xls działa z najlepszymi niemieckimi umlautami (ä, ö, Ü, ...).
źródło
Właśnie wypróbowałem te nagłówki i dostałem Excel 2013 na komputer z systemem Windows 7, aby poprawnie zaimportować plik CSV ze znakami specjalnymi. Byte Order Mark (BOM) był ostatnim kluczem, który sprawił, że działał.
źródło
W przeciwnym razie możesz:
źródło
ŁATWE rozwiązanie dla komputerów Mac Excel 2008: wiele razy miałem z tym problem, ale oto moja łatwa poprawka: otwórz plik .csv w Textwrangler, który powinien poprawnie otwierać znaki UTF-8. Teraz na dolnym pasku stanu zmień format pliku z „Unicode (UTF-8)” na „Western (ISO Latin 1)” i zapisz plik. Teraz przejdź do komputera Mac Excel 2008 i wybierz Plik> Importuj> Wybierz csv> Znajdź swój plik> w pliku źródłowym wybierz „Windows (ANSI)” i voila, znaki UTF-8 są wyświetlane poprawnie. Przynajmniej robi to dla mnie ...
źródło
Używam tego i działa
źródło
#output UTF-8 CSV w PHP, który Excel będzie czytał poprawnie.
źródło
źródło