Tworzę część aplikacji odpowiedzialną za eksport niektórych danych do plików CSV. Aplikacja zawsze używa UTF-8 ze względu na jego wielojęzyczny charakter na wszystkich poziomach. Ale otwarcie takich plików CSV (zawierających np. Znaki diakrytyczne, litery cyrylicy, litery greckie) w programie Excel nie daje oczekiwanych rezultatów pokazujących coś podobnego Г„/Г¤, Г–/Г¶
. I nie wiem, jak zmusić Excela do zrozumienia, że otwarty plik CSV jest zakodowany w UTF-8. Próbowałem też podać BOM UTF-8 EF BB BF
, ale Excel to ignoruje.
Czy istnieje jakieś obejście?
PS Jakie narzędzia mogą potencjalnie zachowywać się tak jak Excel?
AKTUALIZACJA
Muszę powiedzieć, że pomyliłem społeczność z sformułowaniem pytania. Kiedy zadawałem to pytanie, poprosiłem o sposób otwarcia pliku CSV UTF-8 w programie Excel bez żadnych problemów dla użytkownika, w sposób płynny i przejrzysty. Jednak użyłem złego sformułowania, prosząc o zrobienie tego automatycznie . Jest to bardzo mylące i koliduje z automatyzacją makr VBA. Są dwie odpowiedzi na te pytania, które doceniam najbardziej: pierwsza odpowiedź Alexa https://stackoverflow.com/a/6002338/166589 i zaakceptowałem tę odpowiedź; a drugi autorstwa Marka https://stackoverflow.com/a/6488070/166589które pojawiły się nieco później. Z punktu widzenia użyteczności Excel wydawał się nie mieć dobrej, przyjaznej dla użytkownika obsługi CSV UTF-8, więc uważam, że obie odpowiedzi są poprawne, i najpierw zaakceptowałem odpowiedź Alexa, ponieważ naprawdę stwierdziłem, że Excel nie był w stanie tego zrobić to przejrzyście. Z tym myliłem się tutaj automatycznie . Odpowiedź Marka promuje bardziej skomplikowany sposób dla bardziej zaawansowanych użytkowników, aby osiągnąć oczekiwany wynik. Obie odpowiedzi są świetne, ale odpowiedź Alexa nieco lepiej pasuje do mojego nieokreślonego pytania.
AKTUALIZACJA 2
Pięć miesięcy później po ostatniej edycji zauważyłem, że odpowiedź Alexa z jakiegoś powodu zniknęła. Naprawdę mam nadzieję, że to nie był problem techniczny i mam nadzieję, że nie będzie już dyskusji, która odpowiedź jest teraz lepsza. Przyjmuję więc odpowiedź Marka jako najlepszą.
\t
jako separator. Działa w ustawieniach Excela w języku angielskim i innym niż angielski. Można nacisnąćCtrl-S
bez wybierania formatu pliku itp. Zachuje znaki Unicode.Odpowiedzi:
Alex ma rację, ale ponieważ musisz wyeksportować do pliku csv, możesz dać użytkownikom tę poradę podczas otwierania plików csv:
W ten sposób znaki specjalne powinny wyświetlać się poprawnie.
źródło
Znacznik kolejności bajtów UTF-8 wskaże programowi Excel 2007+, że używasz UTF-8. (Zobacz ten post SO ).
W przypadku, gdy ktoś ma takie same problemy jak ja, klasa kodowania UTF8 .NET nie wyświetla znacznika kolejności bajtów w
GetBytes()
wywołaniu. Musisz użyć strumieni (lub obejścia ), aby uzyskać zestawienie komponentów.źródło
UTF-8
naUTF-8 with BOM
Wydaje się, że błąd związany z ignorowaniem BOM został rozwiązany w programie Excel 2013. Miałem ten sam problem z literami cyrylicy, ale dodanie znaku BOM
\uFEFF
pomogło.źródło
$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText
:;To niesamowite, że jest tak wiele odpowiedzi, ale żadna nie odpowiada na pytanie:
Odpowiedź oznaczona jako zaakceptowana z ponad 200 głosami wyższymi jest dla mnie bezużyteczna, ponieważ nie chcę dać użytkownikom instrukcji, jak skonfigurować program Excel. Poza tym: ten podręcznik będzie dotyczył jednej wersji programu Excel, ale inne wersje programu Excel mają inne menu i okna dialogowe konfiguracji. Będziesz potrzebował instrukcji dla każdej wersji programu Excel.
Pytanie brzmi: jak sprawić, by Excel wyświetlał dane UTF8 za pomocą jednego podwójnego kliknięcia?
Przynajmniej w programie Excel 2007 nie jest to możliwe, jeśli używasz plików CSV, ponieważ BOM UTF8 jest ignorowany i zobaczysz tylko śmieci. To już część pytania Lyubomyr Shaydariv:
Robię to samo: zapisywanie rosyjskich lub greckich danych w pliku CSV UTF8 z BOM powoduje śmieci w Excelu:
Zawartość pliku CSV UTF8:
Wynik w programie Excel 2007:
Rozwiązaniem jest w ogóle nie używanie CSV. Ten format jest tak głupio zaimplementowany przez Microsoft, że zależy od ustawień regionu w panelu sterowania, jeśli jako separator zostanie użyty przecinek lub średnik . Tak więc ten sam plik CSV może otwierać się poprawnie na jednym komputerze, ale na innym komputerze nie. „CSV” oznacza „ Wartości oddzielane przecinkami ”, ale na przykład w niemieckim systemie Windows domyślnie jako separator należy użyć średnika, gdy przecinek nie działa. (Tutaj powinno się nazywać SSV = Wartości oddzielone średnikiem). Pliki CSV nie mogą być wymieniane między różnymi wersjami językowymi systemu Windows. Jest to dodatkowy problem w stosunku do problemu UTF-8.
Excel istnieje od dziesięcioleci. Szkoda, że Microsoft nie był w stanie wdrożyć tak podstawowej rzeczy jak import CSV przez te wszystkie lata.
Jeśli jednak wstawisz te same wartości do pliku HTML i zapiszesz ten plik jako plik UTF8 z BOM z rozszerzeniem XLS , otrzymasz poprawny wynik.
Zawartość pliku XLS UTF8:
Wynik w programie Excel 2007:
Możesz nawet używać kolorów w HTML, które Excel wyświetli poprawnie.
Wynik w programie Excel 2007:
W tym przypadku tylko sama tabela ma czarną ramkę i linie. Jeśli chcesz, aby WSZYSTKIE komórki wyświetlały linie siatki, jest to również możliwe w HTML:
Ten kod pozwala nawet określić nazwę arkusza roboczego (tutaj „MySuperSheet”)
Wynik w programie Excel 2007:
źródło
Użyliśmy tego obejścia:
źródło
Miał te same problemy z plikami CSV generowanymi przez PHP. Excel zignorował BOM, gdy Separator był zdefiniowany
"sep=,\n"
na początku treści (ale oczywiście po BOM).Tak więc dodanie BOM (
"\xEF\xBB\xBF"
) na początku treści i ustawienie średnika jako separatora za pomocą tegofputcsv($fh, $data_array, ";");
rozwiązuje.źródło
W przeszłości miałem ten sam problem (jak tworzyć pliki, które Excel może odczytać, a inne narzędzia mogą również odczytać). Używałem TSV zamiast CSV, ale pojawił się ten sam problem z kodowaniem.
Nie udało mi się znaleźć sposobu, aby Excel automatycznie rozpoznał UTF-8 i nie chciałem / nie mogłem narzucać konsumentom skomplikowanych instrukcji otwierania plików. Więc zakodowałem je jako UTF-16le (z BOM) zamiast UTF-8. Dwa razy większy, ale Excel może rozpoznać kodowanie. I dobrze się kompresują, więc rozmiar rzadko (ale niestety nie zawsze) ma znaczenie.
źródło
Stare pytanie, ale do cholery, najprostszym rozwiązaniem jest:
źródło
Jak pisałem na http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :
Poinformuj programistę odpowiedzialnego za wygenerowanie pliku CSV, aby go poprawił. Jako szybkie obejście można użyć gsed, aby wstawić zestawienie komponentów UTF-8 na początku łańcucha:
To polecenie wstawia LM UTF-4, jeśli nie jest obecny. Dlatego jest to idempotentne polecenie. Teraz powinieneś być w stanie kliknąć dwukrotnie plik i otworzyć go w programie Excel.
źródło
Możesz przekonwertować plik .csv do UTF-8 z BOM za pomocą Notepad ++:
Encoding
→Convert to UTF-8
.File
→Save
.Pracował w Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-bit z Microsoft Office Professional Plus 2013 na Windows 8.1 z ustawieniami regionalnymi dla programów nieobsługujących kodu Unicode ustawionymi na „niemiecki (Niemcy)”.
źródło
Proste makro vba do otwierania plików tekstowych i csv w formacie utf-8
Pochodzenie: = 65001 to UTF-8. Przecinek: Prawda dla plików .csv dystrybuowanych w kolumnach
Zapisz go w Personal.xlsb, aby zawsze był dostępny. Personalizuj pasek narzędzi programu Excel, dodając przycisk wywołania makra i stamtąd otwieraj pliki. Możesz dodać więcej formatowania do makra, takie jak automatyczne dopasowanie kolumny, wyrównanie itp.
źródło
Tylko dla pomocy użytkownikom zainteresowanym otwarciem pliku w programie Excel, którzy osiągnęli ten wątek, jak ja.
Użyłem poniższego kreatora i działał dla mnie dobrze, importując plik UTF-8. Nieprzezroczyste, ale przydatne, jeśli masz już plik.
Źródło: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
źródło
Tak, jest to możliwe. Jak wcześniej zauważyło wielu użytkowników, wydaje się, że występuje problem z czytaniem poprawnego Znaku Kolejności Bajtów, gdy plik jest zakodowany w UTF-8. W przypadku UTF-16 nie ma problemu, więc jest endemiczny dla UTF-8. Rozwiązaniem, którego używam do tego jest dodanie BOM, DWUKROTNIE. W tym celu dwukrotnie wykonuję następujące polecenie sed:
, w którym symbol zastępczy można zastąpić dowolną nazwą pliku. Prowadzi to jednak do mutacji sep = na początku pliku .csv. Plik .csv otworzy się wtedy normalnie w programie Excel, ale z dodatkowym wierszem z „sep =” w pierwszej komórce. „Sep =” można również usunąć w samym źródłowym pliku .csv, ale podczas otwierania pliku za pomocą VBA należy określić ogranicznik:
Format 6 to format .csv. Ustaw Local na true, na wypadek gdyby w pliku były daty. Jeśli wartość Local nie jest ustawiona na true, daty zostaną zamerykanizowane, co w niektórych przypadkach spowoduje uszkodzenie formatu .csv.
źródło
Oto moje działające rozwiązanie:
Kluczem jest pochodzenie: = 65001
źródło
Tak to mozliwe. Podczas pisania strumienia tworzącego plik csv, pierwszą rzeczą do zrobienia jest:
źródło
Naprawdę niesamowita lista odpowiedzi, ale ponieważ brakuje jeszcze jednego całkiem dobrego, wspomnę o tym tutaj: otwórz plik csv z arkuszami google i zapisz go z powrotem na komputerze lokalnym jako plik programu Excel.
W przeciwieństwie do Microsoft, Google zdążył obsługiwać pliki csv UTF-8, więc po prostu działa tam otworzyć plik. Działa także eksport do formatu Excel. Nawet jeśli nie jest to preferowane rozwiązanie dla wszystkich, jest dość bezpieczne w razie awarii, a liczba kliknięć nie jest tak wysoka, jak może się wydawać, zwłaszcza gdy i tak jesteś już zalogowany w Google.
źródło
Nie odpowiada to dokładnie na pytanie, ale ponieważ natknąłem się na to, a powyższe rozwiązania nie działały dla mnie lub miałem wymagania, których nie mogłem spełnić, oto inny sposób na dodanie BOM, gdy masz dostęp do vima:
źródło
cześć używam ruby na szynach do generowania csv. W naszej aplikacji planujemy wybrać wersję wielojęzyczną (I18n) i napotkaliśmy problem podczas przeglądania zawartości I18n w pliku CSV programu Excel.
W porządku z Linuksem (Ubuntu) i Mac.
Zidentyfikowaliśmy, że Windows Excel musi ponownie zaimportować dane, aby wyświetlić rzeczywiste dane. Podczas importu otrzymamy więcej opcji wyboru zestawu znaków.
Ale nie można tego edukować dla każdego użytkownika, dlatego szukamy rozwiązania, które można otworzyć tylko podwójnym kliknięciem.
Następnie zidentyfikowaliśmy sposób wyświetlania danych w trybie otwartym i BOM w Windowsie Excel za pomocą aghuddleston gist . Dodano w referencji.
Przykład treści I18n
W systemie Mac i Linux
Szwedzki: Förnamn angielski: imię
W systemie Windows
Szwedzki: Förnamn Angielski: Imię
Ważną rzeczą do odnotowania tutaj jest tryb otwarty i bom
open_mode = "w +: UTF-16LE: UTF-8"
bom = "\ xEF \ xBB \ xBF"
Przed napisaniem CSV wstaw BOM
f. napisz bom
f.write (plik csv)
Windows i Mac
Plik można otworzyć bezpośrednio, klikając dwukrotnie.
Linux (ubuntu)
Podczas otwierania pliku zapytaj o opcje separatora -> wybierz „TAB”
źródło
Kilka dni temu napotkałem ten sam problem i nie mogłem znaleźć żadnego rozwiązania, ponieważ nie mogę użyć tej
import from csv
funkcji, ponieważ sprawia, że wszystko ma być stylizowane na ciąg znaków.Moim rozwiązaniem było najpierw otwarcie pliku za pomocą notpad ++ i
change the encode to ASCII
. Następnie właśnie otworzyłem plik w programie Excel i działał zgodnie z oczekiwaniami.źródło
W php po prostu dodajesz $ bom do $ csv_string:
Testowane z MS Excel 2016, php 7.2.4
źródło
To stare pytanie, ale właśnie napotkałem podobny problem i rozwiązanie może pomóc innym:
Miał ten sam problem, gdy zapisywanie danych tekstowych CSV do pliku, a następnie otwarcie wynikowego pliku .csv w programie Excel przesuwa cały tekst do jednej kolumny. Po przeczytaniu powyższych odpowiedzi wypróbowałem następujące, co wydaje się rozwiązać problem.
Zastosuj kodowanie UTF-8 podczas tworzenia StreamWriter. Otóż to.
Przykład:
źródło
Close()
naDispose
stosie, ale zaczynamy. Nie zgadzasz się również ze stwierdzeniem, że import CSV jest prymitywny, ponieważ nie wymaga sugerowanego przez ciebie nieefektywnego podejścia HTML. W rzeczywistości tworzenie dodatkowych kroków programistycznych w celu pobrania danych tekstowych, przekształcenia w HTML, a następnie przeciągnięcia do Excela wydaje się sprzeczne z intuicjąJeśli chcesz uczynić go w pełni automatycznym, jednym kliknięciem lub automatycznie ładować się do Excela ze strony internetowej, ale nie możesz wygenerować odpowiednich plików Excela, sugerowałbym alternatywne użycie formatu SYLK. OK, nie jest tak prosty jak CSV, ale jest oparty na tekście i bardzo łatwy do wdrożenia i obsługuje UTF-8 bez żadnych problemów.
Napisałem klasę PHP, która odbiera dane i wysyła plik SYLK, który otworzy się bezpośrednio w programie Excel po prostu klikając plik (lub uruchomi program Excel automatycznie, jeśli zapiszesz plik na stronie internetowej z odpowiednim typem MIME. Możesz nawet dodaj formatowanie (np. pogrubienie, formatuj liczby w określony sposób itp.) i zmień rozmiary kolumn lub kolumny z automatycznym rozmiarem tekstu w kolumnach, a wszystko w całym kodzie prawdopodobnie nie będzie więcej niż około 100 linii.
Bardzo trudno jest odtworzyć SYLK, tworząc prosty arkusz kalkulacyjny i zapisując go jako SYLK, a następnie czytając go za pomocą edytora tekstu. Pierwszy blok to nagłówki i standardowe formaty liczb, które rozpoznasz (które po prostu regurgitujesz w każdym tworzonym pliku), a następnie dane są po prostu współrzędną X / Y i wartością.
źródło
źródło
Generuję pliki csv z prostej aplikacji w języku C # i miałem ten sam problem. Moim rozwiązaniem było upewnienie się, że plik jest zapisany z kodowaniem UTF8, na przykład:
Pierwotnie miałem następujący kod, z którym akcenty wyglądają dobrze w Notepad ++, ale były zniekształcone w Excelu:
Twój przebieg może się różnić - używam .NET 4 i Excel z Office 365.
źródło
Działające rozwiązanie dla Office 365
UTF-16
(bez LE, BE)\t
Kod w PHP
źródło
Najpierw zapisz arkusz kalkulacyjny Excel jako tekst Unicode. Otwórz plik TXT za pomocą Internet Explorera i kliknij „Zapisz jako” Kodowanie TXT - wybierz odpowiednie kodowanie, np. Dla Win Cyrillic 1251
źródło
Próbowałem wszystkiego, co mogłem znaleźć w tym wątku i tym podobnych, nic nie działało w pełni. Jednak importowanie do arkuszy Google i po prostu pobieranie jako csv działało jak urok. Wypróbuj, jeśli dojdziesz do mojej frustracji.
źródło