2015-05-19 1 views
2

Как я могу изменить этот класс для поддержки немецкого языка Umlaute (äöüÄÖÜ)? Я попытался использовать utf8_encode ($ array) без succes. Также попытался изменить Content-Transfer-Encoding: binary to utf8php to excel - german Umlaute

Спасибо, что указал мне в правильном направлении.

ОБНОВЛЕНИЕ: ИЛИ что из этого кода будет причиной уничтожения Umlaute?

class NYOS_ExcelWriter_Simple 
    { 

     public function CreatFile($array) 
     { 
     $file = $this->xlsBOF(); //íà÷èíàåì ñîáèðàòü ôàéë 
     $tr1 = 0; 

      foreach($array as $k => $v) 
      { 
      $nn1 = 0; 
       foreach($v as $k1 => $v1) 
       { 
       $file .= $this->xlsWriteLabel($tr1, $nn1, $v1); 
       $nn1++; 
       } 
      $tr1++; 
      } 

     $file .= $this->xlsEOF(); //çàêàí÷èâàåì ñîáèðàòü 
     return $file; 
     } 

     public function LoadFile($array,$filename) 
     { 
     header('Content-Type: application/force-download'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Type: application/download'); 
     header('Content-Disposition: attachment;filename='.$filename); 
     header('Content-Transfer-Encoding: binary '); 
     echo $this->CreatFile($array); 
     } 

     private function xlsBOF() 
     { 
     return pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
     } 

     function xlsEOF() 
     { 
     return pack("ss", 0x0A, 0x00); 
     } 

     private function xlsWriteNumber($Row, $Col, $Value) 
     { 
     return pack("sssss", 0x203, 14, $Row, $Col, 0x0). 
      pack("d", $Value); 
     } 

     function xlsWriteLabel($Row, $Col, $Value) 
     { 
     $L = strlen($Value); 
     return pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L). 
      $Value; 
     } 
    } 

$NY_excel_simple = new NYOS_ExcelWriter_Simple(); 
+0

Я не имею никакого отношения к вопросу, но разве вы не должны отправлять только один «Content-Type»? – steven

+0

Вы пробовали 'utf8_encode ($ array)' или вы пробовали 'utf8_encode ($ v1)' в вашем внутреннем цикле foreach метода 'CreatFile'? Вы должны преобразовать каждое значение в utf8 вместо того, чтобы пытаться преобразовать массив. Аргумент, переданный utf8_encode, должен быть строкой ISO-8859-1, а не массивом. – steven

+0

Я пробовал $ v1 = utf8_encode ($ v1) внутри foreach, не работал только разные неправильные символы. (также попробовал utf8_encode (массив), который ничего не выводил) –

ответ

2

ОК, это очень рудиментарно. Может быть, слишком много упрощено.

Первый: Вы должны использовать BIFF4, если вы обслуживаете только рабочий лист с BIFF-файлом. Таким образом, вы избежите предупреждений при открытии в Excel.

Проблема с умлаутами связана с тем, что более старые форматы Excel BIFF используют кодировки Windows, а не Unicode. Таким образом, следует работать:

class NYOS_ExcelWriter_Simple 
    { 

     public function CreatFile($array) 
     { 
     $file = $this->xlsBOF(); 
     $tr1 = 0; 

      foreach($array as $k => $v) 
      { 
      $nn1 = 0; 
       foreach($v as $k1 => $v1) 
       { 
       $file .= $this->xlsWriteLabel($tr1, $nn1, mb_convert_encoding($v1, "Windows-1252", "auto")); 
       $nn1++; 
       } 
      $tr1++; 
      } 

     $file .= $this->xlsEOF(); 
     return $file; 
     } 

     public function LoadFile($array,$filename) 
     { 
     header('Content-Type: application/download'); 
     header('Content-Disposition: attachment;filename='.$filename); 
     header('Content-Transfer-Encoding: binary '); 
     echo $this->CreatFile($array); 
     } 

     private function xlsBOF() 
     { 
     return pack("ssssss", 0x409, 0x8, 0x0, 0x10, 0x0, 0x0); //using BIFF4 
     } 

     function xlsEOF() 
     { 
     return pack("ss", 0x0A, 0x00); 
     } 

     private function xlsWriteNumber($Row, $Col, $Value) 
     { 
     return pack("sssss", 0x203, 14, $Row, $Col, 0x0). 
      pack("d", $Value); 
     } 

     function xlsWriteLabel($Row, $Col, $Value) 
     { 
     $L = mb_strlen($Value); 
     return pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L). 
      $Value; 
     } 
    } 

$NY_excel_simple = new NYOS_ExcelWriter_Simple(); 

$array = array(
       array("foo", "bar", "hello", "world"), 
       array("für", "bär", "hellö", "wörld"), 
     ); 

$NY_excel_simple->LoadFile($array, "test.xls"); 

Но символы без глифов в Windows-1252 будут невозможны.

Unicode поддерживается в BIFF8. Но это нельзя использовать таким образом.

+0

Большое спасибо, это отлично работает! –

0
foreach($v as $k1 => $v1) 
{ 
    $file .= $this->xlsWriteLabel($tr1, $nn1, mb_convert_encoding($v1, 'UTF-16LE', 'UTF-8')); 
    $nn1++; 
} 

Вы также можете преобразовать его.