PHP - MySQL 데이터베이스에서 Excel로 데이터 업로드. PHP - MySQL 데이터베이스에서 Excel로 데이터 업로드 Excel에 PHP 테이블 업로드

.
그 노트에 제시된 방법은 정말 매우 간단하지만 항상 편리한 것은 아닙니다.
PHP에서 Excel로 표 형식의 데이터를 전송하는 다른 방법이 많이 있습니다. 가장 간단하고 기능적으로 보이는 방법을 설명하겠습니다. 특히 내가 xls 파일을 생성하는 것을 말하는 것이 아니라, 프로그래밍에 경험이 없는 사용자가 위변조를 눈치채지 못하도록 사용자가 Excel을 사용하여 수신된 데이터를 열도록 제안할 뿐이라는 점에 유의해야 합니다.

따라서 가장 먼저 할 일은 다음 헤더를 생성하는 스크립트에 대한 링크를 페이지에 배치하는 것입니다.
header("프라그마: 공개");
header("만료: 0");
header("캐시 제어: 재검증해야 함, 사후 확인=0, 사전 확인=0");
header("캐시 제어: 비공개", false);
header("콘텐츠 유형: 응용 프로그램/x-msexcel");
header("내용 처리: 첨부 파일; 파일 이름=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("콘텐츠 전송 인코딩: 바이너리");
header("콘텐츠 길이: " . $object->getFileSize());

$object는 각 독자가 원하는 대로 구현하는 진공 상태의 구형 객체입니다. getFileName() 및 getFileSize() getter의 목적은 이름에서 명확합니다. 여기에 하나의 명확하지 않은 뉘앙스를 강조 표시할 가치가 있습니다(이 사실을 상기시켜 준 savostin 덕분에) - getFileName()은 물론 모든 파일 이름을 반환할 수 있지만 브라우저가 Excel에서 수신된 콘텐츠를 열도록 제안하려면 다음을 수행합니다. 파일 확장자는 xls여야 합니다.
나는 아직 새로운 것을 말하지 않았습니다. 그러나 이 모든 것은 나보다 먼저 발명되었습니다. 그리고 아래에서 설명할 내용도 마찬가지입니다.
PHP에서 xls 생성에 대한 게시물의 주석에서 올바르게 지적했듯이 Excel은 XML을 사용하면 훨씬 빠릅니다. 그러나 가장 중요한 이점은 여전히 ​​속도가 아니라 훨씬 더 넓은 가능성에 있습니다. 나는 야생을 탐구하지 않을 것이지만 간단한 예와 모든 태그에 대한 자세한 설명에 대한 링크만 제공할 것입니다.

따라서 헤더가 생성된 후 사용자에게 실제 데이터를 제공해야 합니다. 나는 일반적으로 별도의 방법으로 테이블 생성을 래핑합니다.
echo $object->getContent();

Smarty를 사용하여 테이블을 생성합니다.

(foreach from=$data.header item=caption) ($caption.columnName)(/각각)(foreach from=$data.content 항목=행) (foreach from=$row item=col) ($col)(/각각)(/각각)

코드에서 볼 수 있듯이 두 개의 배열을 포함하는 $data 배열은 템플릿에 전달됩니다. 즉, 테이블 헤더 행과 실제 데이터입니다.
XML을 생성하기 위해서만 템플릿 엔진을 사용하는 것은 다소 비용이 많이 들고 XML을 얻는 다른 많은 방법이 있다는 점은 주목할 가치가 있습니다. 제 경우에 XML 생성은 템플릿 엔진이 필수 불가결한 대규모 프로젝트에서 작은 보너스에 불과합니다.

예를 들어, 가장 간단한 표를 제공했습니다. 원하는 경우 훨씬 더 많은 수의 속성을 조작할 수 있습니다. 구현에 타사 라이브러리가 필요하지 않다는 점을 고려할 때 특히 유용합니다.
설명된 방법은 몇 년 동안 동일한 프로젝트에서 작업했으며 단 한 명의 사용자도 자신이 여는 데이터가 MS Office 문서가 아니라고 의심했습니다.

MS Excel에서 사용되는 XML 구조에 대한 자세한 내용은

.
그 노트에 제시된 방법은 정말 매우 간단하지만 항상 편리한 것은 아닙니다.
PHP에서 Excel로 표 형식의 데이터를 전송하는 다른 방법이 많이 있습니다. 가장 간단하고 기능적으로 보이는 방법을 설명하겠습니다. 특히 내가 xls 파일을 생성하는 것을 말하는 것이 아니라, 프로그래밍에 경험이 없는 사용자가 위변조를 눈치채지 못하도록 사용자가 Excel을 사용하여 수신된 데이터를 열도록 제안할 뿐이라는 점에 유의해야 합니다.

따라서 가장 먼저 할 일은 다음 헤더를 생성하는 스크립트에 대한 링크를 페이지에 배치하는 것입니다.
header("프라그마: 공개");
header("만료: 0");
header("캐시 제어: 재검증해야 함, 사후 확인=0, 사전 확인=0");
header("캐시 제어: 비공개", false);
header("콘텐츠 유형: 응용 프로그램/x-msexcel");
header("내용 처리: 첨부 파일; 파일 이름=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("콘텐츠 전송 인코딩: 바이너리");
header("콘텐츠 길이: " . $object->getFileSize());

$object는 각 독자가 원하는 대로 구현하는 진공 상태의 구형 객체입니다. getFileName() 및 getFileSize() getter의 목적은 이름에서 명확합니다. 여기에 하나의 분명하지 않은 뉘앙스를 강조 표시할 가치가 있습니다(이에 대해 상기시켜 주셔서 감사합니다) - getFileName()은 물론 모든 파일 이름을 반환할 수 있지만 브라우저가 Excel에서 수신된 콘텐츠를 열도록 제안하려면 파일 확장자 xls여야 합니다.
나는 아직 새로운 것을 말하지 않았습니다. 그러나 이 모든 것은 나보다 먼저 발명되었습니다. 그리고 아래에서 설명할 내용도 마찬가지입니다.
메모에 대한 주석에서 올바르게 언급했듯이 Excel은 XML을 사용하여 훨씬 빠르게 작동합니다. 그러나 가장 중요한 이점은 여전히 ​​속도가 아니라 훨씬 더 넓은 가능성에 있습니다. 나는 야생을 탐구하지 않을 것이지만 간단한 예와 모든 태그에 대한 자세한 설명에 대한 링크만 제공할 것입니다.

따라서 헤더가 생성된 후 사용자에게 실제 데이터를 제공해야 합니다. 나는 일반적으로 별도의 방법으로 테이블 생성을 래핑합니다.
echo $object->getContent();

Smarty를 사용하여 테이블을 생성합니다.

(foreach from=$data.header item=caption) ($caption.columnName)(/각각)(foreach from=$data.content 항목=행) (foreach from=$row item=col) ($col)(/각각)(/각각)

코드에서 볼 수 있듯이 두 개의 배열을 포함하는 $data 배열은 템플릿에 전달됩니다. 즉, 테이블 헤더 행과 실제 데이터입니다.
XML을 생성하기 위해서만 템플릿 엔진을 사용하는 것은 다소 비용이 많이 들고 XML을 얻는 다른 많은 방법이 있다는 점은 주목할 가치가 있습니다. 제 경우에 XML 생성은 템플릿 엔진이 필수 불가결한 대규모 프로젝트에서 작은 보너스에 불과합니다.

예를 들어, 가장 간단한 표를 제공했습니다. 원하는 경우 훨씬 더 많은 수의 속성을 조작할 수 있습니다. 구현에 타사 라이브러리가 필요하지 않다는 점을 고려할 때 특히 유용합니다.
설명된 방법은 몇 년 동안 동일한 프로젝트에서 작업했으며 단 한 명의 사용자도 자신이 여는 데이터가 MS Office 문서가 아니라고 의심했습니다.

MS Excel에서 사용되는 XML 구조에 대한 자세한 내용은

많은 사람들이 작업할 때 MySQL과 함께 PHP데이터베이스에서 xls 형식으로 데이터를 내보내서 이 데이터가 필요한 사람들이 Excel에서 처리하거나 사용자가 이 데이터를 편리하게 볼 수 있도록 해야 합니다. 최근에 나는 그러한 필요가 있었고 오늘은이 사업을 구현하는 방법을 알려 드리겠습니다.

이 방법은 매우 간단하지만 데이터가 정상적으로 업로드된다는 점을 바로 말씀드릴 수 있습니다.

우선 최종 xls 파일의 예를 보여 드리겠습니다. Excel에서 업로드는 다음과 같습니다.

즉, 이미지나 스타일은 업로드되지 않고 열 헤더와 데이터 자체만 업로드됩니다.

그런 업로드 옵션을 오기 전에 csv 형식으로 업로드를 하려고 했으나 조금 서툴러서 표를 그리고 xls 확장자로 저장하려고 했더니 역시 말도 안되는 소리가 나고, 지금 설명할 방법은 저에게 완전히 적합했으며 이제 여러분과 공유할 것입니다.

우선, 내가 주석을 달았던 모든 코드를 가능한 한 많이 줄 것입니다. 그것을 선택하고 php 확장자로 저장하고 시도할 수 있습니다. 다만 데이터베이스 연결 설정을 지정하는 것을 잊지 마십시오.

PHP에서 MySQL에서 Excel로 데이터 내보내기

내가 언로드하는 데이터를 이해할 수 있도록 데이터베이스에 있는 간단한 테이블의 예를 보여 드리겠습니다( 나는 그녀의 이름 테스트를 가지고):

테스트 테이블:

ID 이름 이름
1 이바노프 이반
2 페트로프 베드로
2 페트로프2 페트르2
xlsData = 팩("sssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // 숫자라면 function RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //텍스트 함수인 경우 RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack(" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // 숫자 삽입 function InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // 텍스트 삽입 function InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // 새 줄로 이동 function GoNewLine()( $this->countCol = 0 ; $this->countRow++; return; ) //데이터 종료 함수 EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); 반품; ) // 파일 저장 function SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // 파일 보내기 function SendFile()( $this->EndData(); header (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); 헤더("캐시 제어: 저장 없음, 캐시 없음, 재검증해야 함"), 헤더 (" Pragma: no-cache"); header("Content-type: application/x-msexcel"); header("Content-Disposition: attachment; fileName=$this->fileName.xls"); print $this- >xlsData ; ) ) ) if(isset($_GET["id"])) ( //필터 데이터 $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))); $ filename = "File_with_id_".$id; // 파일 이름 설정 $excel = new ExportToExcel(); // 클래스 인스턴스 생성 $sql="SELECT * FROM test.test where id = $id";// 데이터베이스에 쿼리 $rez= mysql_query($sql); $excel->InsertText("ID"); $excel->InsertText("성"); $excel->InsertText("이름"); $excel ->GoNewLine(); While($ row=mysql_fetch_assoc($rez))( $excel->InsertNumber($r ow["아이디"]); $excel->InsertText($row["이름"]); $excel->InsertText($row["이름"]); $excel->GoNewLine(); ) $엑셀->저장파일($파일이름); ) ?>

여기의 전체 아이디어는 기능에 있습니다. 팩(), 데이터를 이진 문자열로 압축하고 차례로 이 문자열을 데이터베이스에서 언로드한 데이터로 채웁니다. mysql 일반 기능을 사용하여 mysql_query().

이 코드의 성능을 확인하기 위해 데이터베이스에 대한 연결을 설정하고 유사한 테이블을 생성했다면 다음 요청을 보낼 수 있습니다.

http://your_site/file_name. php?id=2

그리고 id가 2인 행 두 개를 언로드해야 합니다.

이제 데이터 업로드를 허용한 모든 사람이 웹 인터페이스를 통해 데이터를 로컬 컴퓨터로 쉽게 내보낼 수 있습니다. 이 방법은 기업 사용자(조직용 응용 프로그램을 개발하는 경우)와 인터넷의 웹 사이트 사용자 모두에게 편리합니다. 이 방법이 도움이 되었기를 바랍니다. 행운을 빕니다!

(mysql 데이터베이스에서 가져온 데이터) 성공하려면. Zend 프레임워크를 사용하고 있습니다. Excel로 내보내기 전에 데이터를 약간 변경해야 합니다. 사실 월간 현금 장부를 작성해야 합니다.

나는 많은 문서를 읽었지만 엉망으로 끝났습니다. 어떻게 시작해야 할지 정말 이해가 되지 않습니다. 나에게 정말 PEAR가 필요합니까? 클래스 라이브러리를 로드해야 합니까? 이거 쉽게 하는 방법 없을까요?

미리 감사합니다

PHPExcel 라이브러리 PHPExcel을 사용하는 것이 좋습니다. 정말 강력하고 다양한 형식을 지원하고 시각적 형식을 지정할 수 있으며 사용하기 쉽습니다.

웹페이지 http://phpexcel.codeplex.com/에서 이에 대해 자세히 알아볼 수 있습니다.(PHPExcel은 이미 https://github.com/PHPOffice/PHPExcel로 이동했습니다)

사용 예:

$objPHPExcel = 새로운 PHPExcel(); /** 많은 속성을 설정할 수 있습니다. */ $objPHPExcel->getProperties()->setCreator("My company") ->setLastModifiedBy("John Doe") ->setTitle("연간 보고서") ->setSubject("Sales ") ->setDescription("John Doe의 연간 매출 보고서") ->setCategory("재무"); /** 시트 중 하나 선택 */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** 단순히 셀의 값을 설정 */ $activeSheet->setCellValue("A1", "plural");

물론 Excel 파일 읽기, 시각적 스타일 설정, 그래프, 표현식 만들기 등 훨씬 더 많은 작업을 수행할 수 있습니다.

나는 MySQL에서 데이터를 가져오고(테이블당 6kb+레코드), MySQL 데이터에서 다차원 배열을 만들고, 여러 테이블에서 가져온 다음, 모든 것을 한 행에 덤프하고 .xls를 생성하는 94행 인벤토리 변형 보고서를 작성했습니다.

확장이 필요하지 않습니다.

유일한 주의 사항은 아직 Excel 없이 .xls를 뱉어내는 방법을 알지 못해 데이터가 손상될 수 있다는 점입니다. 그리고 데이터를 "내보내기"하는 것보다 서식 지정이나 더 복잡한 작업을 시도하지 않았습니다. , 파일/데이터는 물론 괜찮지만 Excel에서 경고를 생성합니다.

편집: "설정" 및 "덤프"는 daniweb.com을 참조한다는 점에 유의해야 합니다.

phpexcel 라이브러리를 사용할 수 있습니다. 다양한 스프레드시트 파일 형식에서 읽고 쓸 수 있습니다.

zend와 통합하려면 다음 링크의 도움말을 사용할 수 있습니다.

CSV를 사용하여 Excel용으로 가져올 수 있는 형식을 만들 수 있습니다. 이것이 가장 쉬운 방법입니다.

CSV는 다음과 같습니다.

"내 첫 번째 셀 내용", "내 두 번째 셀 내용", "내 세 번째 셀 내용" "두 번째 줄, 첫 번째 셀 내용", "etc", "etc

각 줄은 Excel 문자열을 나타내며 셀 내용을 큰따옴표로 묶고 쉼표로 구분합니다. 일부 데이터가 있는 경우 CSV가 손상되고 원치 않는 줄 바꿈이 생성될 수 있으므로 주의하십시오.

약간의 Google을 사용하면 다음을 찾을 수 있습니다. http://www.the-art-of-web.com/php/dataexport/

데이터 준비

$data = array(array("이름" => "메리", "성" => "존슨", "나이" => 25), array("이름" => "아만다", "성" => " Miller", "age" => 18), array("firstname" => "James", "lastname" => "Brown", "age" => 31), array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7), array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), array("firstname" => "사라", "성" => "밀러", "나이" => 24), array("이름" => "패트릭", "성" => "밀러", "나이" => 27) );

첫 번째 단계는 탭으로 구분된 형식으로 데이터를 출력하는 것입니다(CSV도 사용할 수 있지만 조금 더 복잡함). 이를 위해 다음 코드를 사용합니다.

브라우저에서 결과를 더 쉽게 볼 수 있도록 콘텐츠 유형을 텍스트/일반으로 설정했습니다. 그렇지 않으면 HTML 형식이 없기 때문에 출력은 한 줄의 텍스트로 표시됩니다.

출력의 첫 번째 줄은 열 머리글이 됩니다(이 경우 필드 이름이 사용됨). 값은 탭 \t와 줄 바꿈이 있는 줄로 구분됩니다. 결과는 다음과 같아야 합니다.

이름 성 나이 Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

이 코드에는 즉시 명백하지 않을 수 있는 약점이 있습니다. 출력할 필드 중 하나에 이미 하나 이상의 탭 문자가 포함되어 있거나 더 나쁜 경우 줄 바꿈이 포함되어 있으면 어떻게 될까요? 열과 줄 바꿈을 나타내기 위해 이러한 문자에 의존하기 때문에 전체 프로세스가 트리거됩니다.

해결책은 탭 문자를 "이스케이프"하는 것입니다. 이 경우 서식에 영향을 주지 않도록 탭을 리터럴 \t로 바꾸고 줄 바꿈을 리터럴 \n으로 바꿉니다.

이제 각 줄이 에코되기 전에 열이 깨지지 않도록 탭 문자가 "\t"로 바뀝니다. 또한 데이터 내의 줄 바꿈은 "\n"으로 바뀝니다.



관련 기사: