2011-08-12 5 views
2

클라이언트 시스템의 스프레드 시트에 MySQL 테이블 데이터를 다운로드하는 PHP 응용 프로그램이 있습니다. Redhat을 실행하는 컴퓨터에서 Open Office Scalc에 대해 잘 작동하는 웹의 여러 위치에서 코드를 발견했습니다. 내가 겪었던 문제는 Open Office 스프레드 시트가 아닌 Windows PC에서 MS Excel로 다운로드하려고했을 때였습니다. 문제는 셀에 삽입 된 문자열의 길이와 관련이있는 것으로 보입니다. 너무 길면 Excel에서 파일이 손상되었다고 생각하여로드하지 않습니다. "너무 오래"은 MS Excel 사양이 최대 길이 인 32,000 개라고하더라도 255 자 정도 인 것으로 보입니다.PHP "pack"함수를 사용하여 Excel로 데이터를 다운로드하는 중 문제가 발생했습니다.

문제를 더 자세히 조사하기 위해 탭으로 구분 된 값 파일과 동일한 데이터를 다운로드하고 Excel에서이를 스프레드 시트로 변환하려고했습니다. 이 방법을 사용하면 매우 긴 문자열을 스프레드 시트 셀에로드하는 데 문제가 없습니다. 따라서 실제로 255 자 이상의 문자열은 Excel 셀에 삽입 될 수 있지만 사용중인 코드는 Open Office에서 작동하지만 실제로는 삽입 할 수 없습니다. 긴 문자열에는 보존하려는 캐리지 리턴이 있고 tsv 파일이 스프레드 시트에로드 될 때 캐리지 리턴은 행 분리 자로 해석되므로 tsv 파일을 사용하면 문제가 해결되지 않습니다. 스프레드 시트 셀에 문자열을 기록

PHP 함수이다 :

function xlsWriteLabel($Row, $Col, $Value) { 
    $L = strlen($Value); 
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); 
    echo $Value; 
    return; 
} 
상기 기능에 부가하여 스프레드 시트로 이행하기위한 다른 필요한 코드에서 발견 될 수

:

http://www.appservnetwork.com/modules.php?name=News&file=article&sid=8

위의 코드에서 "pack"함수에 전달 된 다양한 인수의 의미에 대한 설명을 찾지 못했습니다. 위의 함수에서 인수를 하나 변경하면 문제가 해결 될 수 있는지 궁금합니다.

누군가가이 문제에 대한 해결책을 가지고 있다면, 나는 그것을 듣고 싶어합니다.

답변

0

셀 값을 큰 따옴표 ""으로 묶으면 새 행으로 해석되는 캐리지 리턴에 대해 걱정할 필요없이 tsv 또는 csv 형식으로 데이터를 가져올 수 있습니다. PHP의 fputcsv 함수를 사용하여 Excel에서 읽을 수있는 tsv 또는 csv 파일을 내보낼 수도 있습니다.

이 기능은 약간 더 효율적인 버전입니다. 링크를 사용해 주셔서 감사합니다. 그러나 출력 형식이 실제로 Excel에 맞는지 여부는 알 수 없습니다.

function xlsBOF(){ 
    echo pack("s6", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
} 

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

function xlsWriteNumber($Row, $Col, $Value){ 
    echo pack("s5d", 0x203, 14, $Row, $Col, 0x0, $Value); 
} 

function xlsWriteLabel($Row, $Col, $Value){ 
    $L = strlen($Value); 
    echo pack("s6A*", 0x204, 8 + $L, $Row, $Col, 0x0, $L, $Value); 
} 
+0

blol/text의 라벨 기능이 충분하지 않다고 생각합니다. 무엇이이 문제를 해결합니까? – Michelangelo

+0

나는 그것을 가져 간다, 영어가 당신의 모국어가 아니다, 당신이 의미하는 바를 설명하려고 노력할 수 있으면, 나는 당신을 도우려고 노력할 것이다. –

1

... 텍스트에 큰 따옴표가없는 경우.

사용해야 할 것은 ASCII 문자 세트의 적절한 구분 기호입니다.

 
Seq Dec Hex Acro Name 
^\  28  1C  FS  File Separator  
^]  29  1D  GS  Group separator  
^^  30  1E  RS  Record Separator  
^_  31  1F  US  Unit separator 

내가 PHP를 모르지만 펄 인쇄 문은 다음과 같을 수 있습니다 : 나는 절대이 파일을 엑셀 생성하는 간단한 방법을 쓴

 

    print chr(30), "Field1", chr(30), "Field2", chr(30), "Field3", chr(31); 

1

.

간단한 기능.

먼저 내용을 배열로 변환합니다 (매우 간단하고 누구나 알고 있습니다.). 그런 다음 배열을 내 함수에 전달합니다.

<?php 
//array to excel 
function arrayToExcel($array, $filename='List') 
{ 
    if (!is_array($array) or !is_array($array[0])) return false; 

    $xl = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); //begining of excel file 

    $i = 0; 
    foreach ($array as $key => $val) 
     { 
      $j=0; 
      foreach ($val as $cell_key => $cell_val) 
       { 
        $cell_val = trim($cell_val); 
        $length = strlen($cell_val); 
         //checking cell value is a number and the length not equal to zero 
          if(preg_match('/^[0-9]*(\.[0-9]+)?$/', $cell_val) && $length!=0) { 
           $xl .= pack("sssss", 0x203, 14, $i, $j, 0x0); //writing number column 
           $xl .= pack("d", $cell_val); 
          } 
          else { 
           $xl .= pack("ssssss", 0x204, 8 + $length, $i, $j, 0x0, $length); //writing string column 
           $xl .= $cell_val; 
          } 
        $j++; 
       } //end of 2nd foreach 
      $i++; 
     } //end of first foreach 
    $xl .= pack("ss", 0x0A, 0x00); //end of excel file 
    $filename = $filename.".xls"; 
    header("Pragma: public"); 
    header('Content-Type: application/vnd.ms-excel'); 
    header("Content-Disposition: attachment; filename=$filename"); 
    header("Cache-Control: no-cache"); 
    echo $xl; 
} //end of arrayToExcel function 


//eg: arrayToExcel($myarray, "contact_list"); 
?> 
관련 문제