>백엔드 개발 >PHP 튜토리얼 >PHP# 데이터를 Excel로 내보내기 위한 몇 가지 전략

PHP# 데이터를 Excel로 내보내기 위한 몇 가지 전략

WBOY
WBOY원래의
2016-08-08 09:30:36966검색

PHP#데이터Excel몇 가지 내보내기 전략

내보내기는 실제로 모든 유형에서 작동합니다. 백엔드 시스템은 비교적 일반적입니다. 일반적으로 excel에서 내보낸 데이터는 백업 및 초안용으로 더 많이 사용되어야 합니다. 백엔드 비즈니스 시스템에서 데이터를 내보낸 후 수동으로 간섭하는 것에 의존하는 현실은 매우 희박합니다. . .

데이터 내보내기와 같은 기능은 가능하면 캡슐화해야 합니다. 데이터 내보내기는 하나만 있으며 해당 값은 후속 조정 및 비즈니스 규칙 변경에 실제로 반영됩니다. 일반적인 응용 프로그램 시스템에 다양한 데이터 내보내기 요구 사항이 있는 경우 이는 이 응용 프로그램 시스템의 비즈니스 분석이 충분하지 않거나 매우 열악하다는 것을 의미합니다. 상황은 사용자와 데이터베이스 사이의 거리가 내보내기 버튼일 뿐입니다. . .

환경

1.PHP5.5.14 (cli) (구축일: 2014년 9월 9일 19:09:25)

2.PHP 엑셀 1.7.8(http://www.codeplex.com/PHPExcel)

처리 논리

사실 이러한 유형의 문제의 핵심은 내보내기 규칙을 어떻게 정의하는지, 정의된 규칙 세트가 비즈니스 프로세스에 적응할 수 있는지 여부입니다. 가장 기본적인 방법은 추상화하는 것입니다. 데이터 내보내기 프로세스를 3 기본 단계로 나눈 후 각 단계를 점진적으로 개선할 수 있습니다.

1. 수출 규칙 ​​정의

2.비즈니스 데이터 및 수출 규칙의 적용

3.내보내기 규칙 분석 구성 Excel

이 예는 캡슐화 없이 기본 내보내기 기능을 구현하며 성능이나 기타 확장성 문제에 초점을 맞추지 않습니다.

<?php
namespace org\ybygjy\comp\excel;

/**
 * Excel组件封装
 * <p>1.统一处理工程中针对excel的数据导出</p>
 * @author WangYanCheng
 * @version 2015-1-22
 */
class ExcelComp {
	/**
	 * 构造函数
	 */
	public function __construct() {
		require_once 'org/ybygjy/library/excel/PHPExcel.php';
	}
	/**
	 * 测试入口
	 */
	public function doTest() {
		//构造原始数据
		$dataArray = $this->buildData();
		//导出
		$this->doExportData($dataArray);
	}
	/**
	 * 解析传递的原始数据并导出
	 * @param $dataArr
	 */
	public function doExportData($dataArr) {
		$phpObjExcel = new \PHPExcel();
		$worksSheet = $phpObjExcel->setActiveSheetIndex(0);
		//构造表头数据_Begin
		$tmpColTitles = [];
		$firstDataEntry = $dataArr[0];
		//分配列索引
		$colIndex = 0;
		foreach($firstDataEntry as $key => $val) {
			if (preg_match('/^_/', $key)) {
				continue;
			}
			if (is_array($val)) {
				//取array下的列名称
				$val = $val[0];
				$rowNums = count($val);
				foreach ($val as $innerKey => $innerValue) {
					$tmpColTitles[] = array(
						'parentKey' => $key,
						'key' => $innerKey,
						'colIndex' => $colIndex
					);
					$colIndex++;
				}
			} else {
				$tmpColTitles[] = array(
					'key'=>$key,
					'colIndex'=>$colIndex
				);
				$colIndex++;
			}
		}
		for($i = 0; $i < count($tmpColTitles); $i++) {
			$tmpObj = $tmpColTitles[$i];
			$key = $tmpObj[&#39;key&#39;];
			$colIndex = $tmpObj[&#39;colIndex&#39;];
			$worksSheet->setCellValueByColumnAndRow($colIndex,1,$key);	
		}
		//构造表头数据_End
		//填充单元格数据
		$currRow = 2;
		foreach ($dataArr as $dataEntry) {
			$mergeRow = $dataEntry['_DIMENSION'];
			foreach ($tmpColTitles as $colEntry) {
				$key = $colEntry['key'];
				$colIndex = $colEntry['colIndex'];
				$parentKey = (isset($colEntry['parentKey']) ? $colEntry['parentKey'] : null);
				if (empty($parentKey)) {
					$value = $dataEntry[$key];
					if ($mergeRow == 1) {
						$worksSheet->setCellValueByColumnAndRow($colIndex, $currRow, $value);
					} else {
						$worksSheet->mergeCellsByColumnAndRow($colIndex, $currRow, $colIndex, ($currRow + $mergeRow - 1))->setCellValueByColumnAndRow($colIndex, $currRow, $value);
					}
				} else {
					$tmpDataArr = $dataEntry[$parentKey];
					$innerRow = $currRow;
					for($index = 0; $index < count($tmpDataArr); $index++) {
						$innerDataEntry = $tmpDataArr[$index];
						$value = $innerDataEntry[$key];
						$worksSheet->setCellValueByColumnAndRow($colIndex, $innerRow, $value);
						$innerRow++;
					}
				}
			}
			$currRow += $mergeRow;
		}
		header('Content-Type: application/vnd.ms-excel');
		header('Content-Type: application/force-download');
		header('Content-Type: application/octet-stream');
		header('Content-Type: application/download');
		header('Content-Disposition: attachment;filename="HelloWord.xls"');
		header('Cache-Control: max-age=0');
		header('Cache-Control: max-age=1');
		header('Cache-Control: no-cache, must-revalidate');
		header('Pragma: public');
		$objWriter = \PHPExcel_IOFactory::createWriter($phpObjExcel, 'Excel5');
		$objWriter->save('php://output');
	}
	/**
	 * 构造测试数据
	 * @return multitype:multitype:string number multitype:multitype:string
	 */
	private function buildData() {
		$rtnData = array(
			array(
				'name'=>'YanCheng_01',
				'age'=>'20',
				'addr'=>array(
					array(
						'country'=>'China',
						'province'=>'ShanDong'
					),
					array(
						'country'=>'China',
						'province'=>'BeiJing'
					)
				),
				'_DIMENSION'=>2
			),
			array(
				'name'=>'YanCheng_02',
				'age'=>'21',
				'addr'=>array(
					array(
						'country'=>'China',
						'province'=>'LanZhou'
					),
					array(
						'country'=>'China',
						'province'=>'NingXia'
					)
				),
				'_DIMENSION'=>2
			),
			array(
				'name'=>'YanCheng_03',
				'age'=>'22',
				'addr'=>array(
					array(
						'country'=>'China',
						'province'=>'JiaYuGuan'
					)
				),
				'_DIMENSION'=>1
			)
		);
		return $rtnData;
	}
}

위 내용은 내용의 측면을 포함하여 PHP# 데이터 Excel 내보내기에 대한 몇 가지 전략을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.