За последние 24 часа нас посетили 56822 программиста и 1750 роботов. Сейчас ищут 764 программиста ...

проблема с кодировкой в Spreadsheet Excel Writer

Тема в разделе "Прочие вопросы по PHP", создана пользователем pascal, 14 июн 2009.

  1. pascal

    pascal Активный пользователь

    С нами с:
    22 апр 2006
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Москва
    Здравствуйте!

    Столкнулся с такой проблемой. Для генерации Excel файла использую модуль Spreadsheet_Excel_Writer. По умолчанию он не позволяет писать строчки динной более 255 символов. Но при использовании команды

    PHP:
    1. $xls->setVersion( 8 );
    строчки можно писать произвольной длины. Однако в таком случае портится кодировка всего файла. Если принудительно ставить кодировку

    PHP:
    1. $sheet->setInputEncoding('CP1251');
    то при получении файла пишется что файл сильно поврежден и невозможно открыть. Пробовал так же подставлять другие кодировки. При использовании скажем UTF-8 русские буквы просто пропадают как класс. Кроме того пытался привести кодировку с помощью функции iconv к одной и той же. Результат тот же самый либо кривая кодировка, либо поврежденный файл либо отсутствуют русские буквы. Зависит от вариаций устанавливаемых кодировок.

    Кроме того эксперименты проводил как на локальной машине (самостоятельно собранная конфигураци WinXP + Apache v.2.2.4+php v.5.2.1) так и на сервере на FreeBSD (там уже настраивал не я а профессиональный хостер).

    Помогите пожалуйста как решить данную проблему. Заранее благодарен.

    P.S. Кодировка которая получается по умолчанию более всего напоминает Западноевропейскую.
     
  2. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
  3. artymen

    artymen Активный пользователь

    С нами с:
    19 июн 2009
    Сообщения:
    1
    Симпатии:
    0
    Только что столкнулся с такой же проблемой и решил ее ! Обнаружив такой же вопрос на этом форуме, я даже специально зарегился, чтобы поделиться решением:
    1) Spreadsheet_Excel_Writer генерит кривой BIFF8 (документы большого размера MS Office интерпретирует как поврежденные, а OpenOffice отображает со страшными косяками), так что про setVersion(8) можно забыть, пока не пофиксят в следующих версиях (утверждают, что проект заморожен уже с 2006 года), а вместе с тем и про setInputEncoding() и юникод
    2) Решение проблемы с кириллицей (документ будет нормально отображаться и в MS Office и OpenOffice):
    Лезем в скрипты Spreadsheet_Excel_Writer, расположенные в "<путь_к_установленному_pear>\Spreadsheet\Excel\Writer\"
    В Workbook.php находим
    Код (Text):
    1. $this->_codepage         = 0x04E4
    и исправляем на 0x04E3 (кодовая страница Windows-1251)
    В Format.php находим
    Код (Text):
    1. $this->_font_charset   = 0
    и исправляем на 0xCC (набор символов ANSI Cyrillic).
    Теперь безо всяких лишних манипуляций можно писать русский текст в ячейки !

    P.S.
    (взято отсюда: http://sc.openoffice.org/excelfileformat.pdf)
    Код (Text):
    1. Кодовые страницы:
    2. 0x016F = ASCII
    3. 0x01B5 = IBM PC CP-437 (US)
    4. 0x02D0 = IBM PC CP-720 (OEM Arabic)
    5. 0x02E1 = IBM PC CP-737 (Greek)
    6. 0x0307 = IBM PC CP-775 (Baltic)
    7. 0x0352 = IBM PC CP-850 (Latin I)
    8. 0x0354 = IBM PC CP-852 (Latin II (Central European))
    9. 0x0357 = IBM PC CP-855 (Cyrillic)
    10. 0x0359 = IBM PC CP-857 (Turkish)
    11. 0x035A = IBM PC CP-858 (Multilingual Latin I with Euro)
    12. 0x035C = IBM PC CP-860 (Portuguese)
    13. 0x035D = IBM PC CP-861 (Icelandic)
    14. 0x035E = IBM PC CP-862 (Hebrew)
    15. 0x035F = IBM PC CP-863 (Canadian (French))
    16. 0x0360 = IBM PC CP-864 (Arabic)
    17. 0x0361 = IBM PC CP-865 (Nordic)
    18. 0x0362 = IBM PC CP-866 (Cyrillic (Russian))
    19. 0x0365 = IBM PC CP-869 (Greek (Modern))
    20. 0x036A = Windows CP-874 (Thai)
    21. 0x03A4 = Windows CP-932 (Japanese Shift-JIS)
    22. 0x03A8 = Windows CP-936 (Chinese Simplified GBK)
    23. 0x03B5 = Windows CP-949 (Korean (Wansung))
    24. 0x03B6 = Windows CP-950 (Chinese Traditional BIG5)
    25. 0x04B0 = UTF-16 (BIFF8)
    26. 0x04E2 = Windows CP-1250 (Latin II) (Central European)
    27. 0x04E3 = Windows CP-1251 (Cyrillic)
    28. 0x04E4 = Windows CP-1252 (Latin I) (BIFF4-BIFF5)
    29. 0x04E5 = Windows CP-1253 (Greek)
    30. 0x04E6 = Windows CP-1254 (Turkish)
    31. 0x04E7 = Windows CP-1255 (Hebrew)
    32. 0x04E8 = Windows CP-1256 (Arabic)
    33. 0x04E9 = Windows CP-1257 (Baltic)
    34. 0x04EA = Windows CP-1258 (Vietnamese)
    35. 0x0551 = Windows CP-1361 (Korean (Johab))
    36. 0x2710 = Apple Roman
    37. 0x8000 = Apple Roman
    38. 0x8001 = Windows CP-1252 (Latin I) (BIFF2-BIFF3)
    Код (Text):
    1. Наборы символов:
    2. 0x00 = ANSI Latin
    3. 0x01 = System default
    4. 0x02 = Symbol
    5. 0x4D = Apple Roman
    6. 0x80 = ANSI Japanese Shift-JIS
    7. 0x81 = ANSI Korean (Hangul)
    8. 0x82 = ANSI Korean (Johab)
    9. 0x86 = ANSI Chinese Simplified GBK
    10. 0x88 = ANSI Chinese Traditional BIG5
    11. 0xA1 = ANSI Greek
    12. 0xA2 = ANSI Turkish
    13. 0xA3 = ANSI Vietnamese
    14. 0xB1 = ANSI Hebrew
    15. 0xB2 = ANSI Arabic
    16. 0xBA = ANSI Baltic
    17. 0xCC = ANSI Cyrillic
    18. 0xDE = ANSI Thai
    19. 0xEE = ANSI Latin II (Central European)
    20. 0xFF = OEM Latin I