Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHPExcel CSV - problem z cp1250
Toshikatsu
post 19.10.2017, 14:25:50
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 3
Dołączył: 18.10.2017

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


Mam spory problem z przekodowaniem UTF-8 -> CP1250 przy zapisie do pliku CSV z wykorzystaniem PHPExcel writer csv.

Otóż pobieram dane z bazy w formacie UTF-8, a później potrzebuje je w innym miejscu zmienić kodowanie na cp1250. Jedynym rozwiązaniem jest "iconv". "Tłumaczy" on najprawdopodobniej wszystko w sposób poprawny(nie mam jak za bardzo sprawdzić, bo wypisanie printem wywala krzaczki, gdyż próbuje on wpisać je UTF'em).

  1. $this->PHPcsv->getActiveSheet()->setCellValueByColumnAndRow($column, $index+$shift, iconv('utf-8', 'cp1250', $value));



Problemem jednak jest to, że w niektórych wynikach zamiast zapisać dane do pliku csv, wstawia puste pole. Dzieje się tak tylko tam gdzie są polskie literki, jednak żeby było ciekawiej część tłumaczy prawidłowo. Próbowałem już wielu rzeczy, posprawdzałem każdy krok wcześniej i wiem, że właśnie dokładnie w momencie zapisu do pliku się sypie :/
Jakieś pomysły?

Ten post edytował Toshikatsu 19.10.2017, 14:26:56
Go to the top of the page
+Quote Post
viking
post 19.10.2017, 14:29:37
Post #2





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

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


//TRANSLIT w iconv.


--------------------
Go to the top of the page
+Quote Post
Toshikatsu
post 19.10.2017, 14:56:04
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 3
Dołączył: 18.10.2017

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


Niestety, kompletnie nic to nie zmieniało i nie zmienia ;]
Go to the top of the page
+Quote Post
viking
post 19.10.2017, 14:59:37
Post #4





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

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


Pokaż jak zastosowałeś. Cudu nie będzie. UTF-8 to znacznie bogatszy zakres znaków niż inne starsze kodowania. Część może nie być prawidłowo przepisana.


--------------------
Go to the top of the page
+Quote Post
Toshikatsu
post 19.10.2017, 15:11:21
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 3
Dołączył: 18.10.2017

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


  1. $this->PHPcsv = new \PHPExcel();
  2. //Klasa odpowiedzialna za zapis pliku na dysku
  3. $this->writer = new \PHPExcel_Writer_CSV($this->PHPcsv);
  4.  
  5. //Zapis danych do komórek
  6. foreach($inputArray as $index => $array)
  7. {
  8. $column=0;
  9. foreach($array as $key => $value)
  10. {
  11. $this->PHPcsv->getActiveSheet()->setCellValueByColumnAndRow($column, $index+$shift, iconv('utf-8', 'cp1250//TRANSLIT', $value));
  12.  
  13. $column++;
  14. }
  15.  
  16. }
  17.  
  18. $this->writer->save($filePath.$fileName);
  19.  


To jest generalnie wszystko co się przy tym dzieje.
Rozumiem, że UTF jest o wiele bogatszy, takie jednak mam wymaganie, żeby sam plik był w formacie csv, a odpalić się go dało Excelem.

Bez iconv wszystko generuje się prawidłowo, tylko tyle, że w UTF-8, którego Excel z 'automatu' nie otwiera.

Ten post edytował Toshikatsu 19.10.2017, 15:14:02
Go to the top of the page
+Quote Post
sabat24
post 19.10.2017, 17:06:16
Post #6





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

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


Zobacz na ten post i sprawdź, czy pierwsza metoda Ci zadziała przy konwertowaniu albo druga przy odpalaniu.

Ten post edytował sabat24 19.10.2017, 17:06:52
Go to the top of the page
+Quote Post
Toshikatsu
post 20.10.2017, 09:14:59
Post #7





Grupa: Zarejestrowani
Postów: 26
Pomógł: 3
Dołączył: 18.10.2017

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


Z preg_replace'a musiałem wywalić z pierwszego argumentu na końcu "e", bo od wersji 7.0 wywala errorem.
Drugi sposób nie bardzo jest jak zastosować z uwagi na to, że nie mam dostępu do samego algorytmu zapisu do pliku. Jednak nawet ustawienie setExcelCompatibility(true), które sprawia, że powinno używać BOM, nic nie poprawia :/

Zacząłem przekopywać się przez kolejne warstwy tego modułu PHPExcel i na coś natrafiłem
Tymczasowym rozwiązaniem, a przy okazji źródłem problemów było niejako wymuszanie przez PHPExcel kodowania UTF-8. W pliku String.php w klasie PHPExcel_Shared_String w funkcji SanitizeUTF8 za komentowałem linijkę
  1. // $value = @iconv('UTF-8', 'UTF-8', $value);
Teraz wszystko chodzi pięknie. Problem tylko w tym, że tak być nie powinno. Nie bardzo wiem jak to obejść nie ingerując w kod tamtych klas.

Ten post edytował Toshikatsu 20.10.2017, 09:16:16
Go to the top of the page
+Quote Post

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: 29.03.2024 - 14:25