>  기사  >  백엔드 개발  >  Excel 그래픽 및 텍스트 코드를 XML 형식으로 공유하여 PHP로 데이터를 가져오고 내보내는 방법

Excel 그래픽 및 텍스트 코드를 XML 형식으로 공유하여 PHP로 데이터를 가져오고 내보내는 방법

黄舟
黄舟원래의
2017-07-17 15:33:343359검색

1 소개

1.1 내보내기

실제 작업 프로젝트에서는 출석 보고서 내보내기, 재무제표 내보내기, 실적 보고서 내보내기, 판매 보고서 내보내기 등 일부 중요한 데이터베이스에 저장된 데이터를 Excel로 내보내야 하는 경우가 종종 있습니다. CleverCode는 2년 동안 PHPExcel을 사용하여 Excel 내보내기 데이터를 생성했지만 PHPExcel을 사용하여 Excel을 생성하는 것은 특히 셀 색상 제어, 셀 병합, 셀 길이 설정 등이 너무 번거롭다는 것을 발견했습니다. Excel에서 이러한 디자인 중 하나를 디자인하는 데 일반적으로 하루가 걸립니다. 나중에 CleverCode는 PHP를 사용하여 Excel을 xml 형식으로 내보내는 간단한 방법을 발견했습니다. 예전에는 하루의 작업이 필요했지만 이제는 절반의 노력으로 결과를 두 배로 늘릴 수 있습니다.

1.2 Import

동시에 일부 프로젝트에서는 일부 Excel 데이터를 데이터베이스로 가져와야 합니다. 예를 들어, 은행에서 제공한 은행 명세서와 판매 보고서를 데이터베이스로 가져옵니다. 일반적인 접근 방식은 PHPExcel을 사용하는 것입니다.

Xml 파서, SimpleXML, XMLReader, DOMDocument 및 기타 방법을 사용하여 Excel을 xml 형식으로 읽을 수 있지만 CleverCode는 이러한 방법을 사용하려고 시도한 결과 너무 복잡하고 힘들며 PHPExcel만큼 유용하지 않다는 것을 발견했습니다.

따라서 Excel(xml 형식 포함)을 읽어야 하는 경우 CleverCode에서는 PHPExcel 라이브러리를 사용할 것을 권장합니다.

2 요구사항

특정 그룹에서는 자신이 담당하는 도시 방송국의 주문 및 판매를 데이터베이스로 가져오기 위해 각 지역 담당자가 필요합니다.
1) 웹사이트에서는 수입판매 보고서 템플릿을 제공합니다.
2) 각 담당자는 자신이 담당하는 도시(권한 확인)에 대한 데이터만 업로드 및 다운로드할 수 있습니다.
3) 금년과 해당 날짜가 소유한 모든 분기를 생성하려면 업로드만 하세요. 예를 들어 오늘은 2015-05-26입니다. 그러면 2015년 1분기와 2분기만 생성됩니다.
2015-12-01이라면. 2015년 1분기, 2분기, 3분기, 4분기를 생성해야 합니다.
4) 이번 분기의 이전 분기 데이터를 표시합니다.
5) 이번 분기의 데이터는 기본적으로 모두 0입니다.
6) 이번 분기의 데이터만 수정할 수 있습니다.

3 프로그래밍 소스 코드 다운로드

4 디자인 웹사이트 페이지

4.1 디스플레이


4.2 display.php 코드

<!DOCTYPE html>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
    <title>PHP导入与导出xml格式的Excel</title>
    <style type="text/css">
        body{ font-size:14px;}
        input{ vertical-align:middle; margin:0; padding:0}
        .file-box{ position:relative;width:340px}
        .txt{ height:22px; border:1px solid #cdcdcd; width:180px;}
        .btn{ background-color:#FFF; border:1px solid #CDCDCD;height:24px; width:70px;}
        .file{ position:absolute; top:0; right:80px; height:24px; filter:alpha(opacity:0);
            opacity: 0;width:260px }
    </style>
    </head>

<body>
    <p class="file-box">
        <form action="" method="post" enctype="multipart/form-data">
            <input type=&#39;text&#39; name=&#39;textfield&#39; id=&#39;textfield&#39; class=&#39;txt&#39; />  
            <input type=&#39;button&#39; class=&#39;btn&#39; value=&#39;浏览...&#39; />
            <input type="file" name="fileField" class="file" id="fileField" size="28" 
                onchange="document.getElementById(&#39;textfield&#39;).value=this.value" />
            <input type="submit" name="submit" class="btn" value="上传" />            
        </form>
        <a href="export.php">下载销售报表模板</a>
    </p>
</body>
</html>

5 PHP xml 형식으로 Excel 내보내기(판매 보고서 템플릿 내보내기)

1) 새 [Sales Report.xlsx]를 만듭니다. 디자인은 다음과 같습니다.



2) [판매 보고서.

4) 테이블 정보를 찾아보세요. ss:ExpandedColumnCount="5" ss:ExpandedRowCount="6"을 삭제합니다. 이 제한은 테이블의 길이와 너비를 제한하므로 제거해야 합니다.

<Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="6" x:FullColumns="1"
   x:FullRows="1" ss:StyleID="s23" ss:DefaultColumnWidth="54"
   ss:DefaultRowHeight="18.75">

변경됨

<Table  x:FullColumns="1"   x:FullRows="1" ss:StyleID="s23" ss:DefaultColumnWidth="54"
   ss:DefaultRowHeight="18.75">

5 PHP는 Excel 비즈니스 로직 코드(Excel.php)를 내보냅니다.

<?php

/**
 * Excel.php
 *
 * Excel操作
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/5/14, by CleverCode, Create
 *
 */
class Excel{

    /**
     * 导出excel
     *
     * @param int $userid 用户编号
     * @return string $xmlStr
     */
    public static function export($userid){
        
        // 根据不同用户的权限,获取不同的数据
        $data = self::getExportData($personid);
        
        // 获取字符串,如果excel的列是固定的可以通过Smarty方式获取
        // 但是如果excel的列需要通过动态生成,则可以通过php组合字符串。
        // $xmlStr = self::getXmlStrBySmarty($data);
        
        // 这个需要根据当前日期动态的生成有几个季度
        $xmlStr = self::getXmlStrByPHP($data);
        
        return $xmlStr;
    }

    /**
     * 生成excel数据
     *
     * @param int $userid 用户编号
     * @return array 结果数据
     */
    public static function getExportData($userid){
        if (!is_int($userid)) {
            return array();
        }
        
        $infoBJ = array(
            &#39;city&#39; => &#39;北京&#39;,
            &#39;order_1&#39; => 100,
            &#39;money_1&#39; => 10000,
            &#39;order_2&#39; => 200,
            &#39;money_2&#39; => 40000 
        );
        
        $infoTJ = array(
            &#39;city&#39; => &#39;天津&#39;,
            &#39;order_1&#39; => 50,
            &#39;money_1&#39; => 1000,
            &#39;order_2&#39; => 100,
            &#39;money_2&#39; => 2000 
        );
        
        $infoGZ = array(
            &#39;city&#39; => &#39;广州&#39;,
            &#39;order_1&#39; => 50,
            &#39;money_1&#39; => 1000,
            &#39;order_2&#39; => 100,
            &#39;money_2&#39; => 2000 
        );
        
        // 根据不同用户的权限,获取不同的数据
        if (is_admin($userid)) {
            
            $data[] = $infoBJ;
            $data[] = $infoTJ;
            $data[] = $infoGZ;
        } else {
            $data[] = $infoBJ;
        }
        
        return $data;
    }

    /**
     * 通过Smarty方式获取xml字符串
     *
     * @param array $data 结果集
     * @return string $xmlStr
     */
    public static function getXmlStrBySmarty($data){
        require_once &#39;Smarty.class.php&#39;;
        $smarty = new Smarty();
        
        $tpl = &#39;file/export.tpl&#39;;
        
        $smarty->assign(&#39;list&#39;, $data);
        
        // capture the output
        // 捕获输出
        $xml = $smarty->fetch($tpl);
        
        return $xml;
    }

    /**
     * 通过PHP组合字符串方式获取xml字符串(可以动态扩展列)
     *
     * @param array $data 结果集
     * @return string $xmlStr
     */
    public static function getXmlStrByPHP($data){
        $xml = &#39;
               <?xml version="1.0"?>
                <?mso-application progid="Excel.Sheet"?>
                <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
                 xmlns:o="urn:schemas-microsoft-com:office:office"
                ............
                  </Style>
                 </Styles>
                 <Worksheet ss:Name="Sheet1">
                  <Table x:FullColumns="1"
                   x:FullRows="1" ss:StyleID="s16" ss:DefaultColumnWidth="54"
                   ss:DefaultRowHeight="18.75">
         &#39;;
        
        //可以根据季度的多少动态扩展列,这里不做说明,请自行尝试。
        $xml. = &#39;
           <Row ss:AutoFitHeight="0">
            <Cell ss:MergeDown="1" ss:StyleID="m42513364"><Data ss:Type="String">城市</Data></Cell>
            <Cell ss:MergeAcross="1" ss:StyleID="s25"><Data ss:Type="String">2015一季度</Data></Cell>
            <Cell ss:MergeAcross="1" ss:StyleID="m42513344"><Data ss:Type="String">2015二季度</Data></Cell>
           </Row>
           <Row ss:AutoFitHeight="0">
            <Cell ss:Index="2" ss:StyleID="s17"><Data ss:Type="String">订单</Data></Cell>
            <Cell ss:StyleID="s17"><Data ss:Type="String">销售额</Data></Cell>
            <Cell ss:StyleID="s17"><Data ss:Type="String">订单</Data></Cell>
            <Cell ss:StyleID="s17"><Data ss:Type="String">销售额</Data></Cell>
           </Row>
        &#39;;
        
        // 输出数据
        foreach ( $data as $row ) {
            $xml .= &#39;
               <Row ss:AutoFitHeight="0">
                <Cell ss:StyleID="s18"><Data ss:Type="String">&#39; . $row[&#39;city&#39;] . &#39;</Data></Cell>
                <Cell ss:StyleID="s19"><Data ss:Type="Number">&#39; . $row[&#39;order_1&#39;] . &#39;</Data></Cell>
                <Cell ss:StyleID="s19"><Data ss:Type="Number">&#39; . $row[&#39;money_1&#39;] . &#39;</Data></Cell>
                <Cell ss:StyleID="s19"><Data ss:Type="Number">&#39; . $row[&#39;order_2&#39;] . &#39;</Data></Cell>
                <Cell ss:StyleID="s19"><Data ss:Type="Number">&#39; . $row[&#39;money_2&#39;] . &#39;</Data></Cell>
               </Row>               
            &#39;;
        }
        
        $xml .= &#39;
        <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
          ...........
        </Workbook>
        &#39;;
        return $xml;
    }
}

6 PHP는 Excel 클라이언트 코드(export.php)를 내보냅니다.

<?php
/**
 * export.php
 *
 * 导出excel
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/5/14, by CleverCode, Create
 *
 */

// Excel类
include_once (&#39;Excel.php&#39;);

/*
 * 客户端类
 * 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,
 * 使业务逻辑的算法更具有可移植性
 */
class Client{

    public function main(){
        
        // 获取xml格式字符串
        $xmlStr = Excel::export(1);
        // 头部
        $filename = &#39;销售报表模板&#39;;
        header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
        header("Content-Disposition: inline; filename=\"$filename.xls\"");
        header("Content-Transfer-Encoding: binary");
        header("Pragma: public");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
        // 输出字符串
        echo $xmlStr;
        
        exit();
    }
}

/**
 * 程序入口
 */
function start(){
    $client = new Client();
    $client->main();
}

start();

?>

6 PHP는 xml 형식 Excel을 가져옵니다

1) 판매 템플릿을 다운로드한 후 데이터를 입력한 후 해당 페이지의 업로드 버튼을 클릭하면 엑셀 데이터가 업로드됩니다.

2) PHP는 Excel 비즈니스 로직 코드(Excel.php)를 가져왔습니다. 여기에는 PHPExcel 라이브러리가 사용됩니다.

<?php

/**
 * Excel.php
 *
 * Excel操作
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/5/14, by CleverCode, Create
 *
 */
class Excel{    
    /*
     * 读取Excel格式的数据(可以读取xml格式数据)
     *
     * @param string $filename excel文件
     * @param string $startRow 开始行
     * @param string $endRow 结束行
     * @param string $startColumn 开始列
     * @param string $endColumn 结束列
     * @return array excel结果集数据
     */
    public static function read($filename, $startRow = 1, $endRow = null, $startColumn = 0, $endColumn = null){
        $excelData = array();
        if (!file_exists($filename)) {
            return $excelData;
        }
        
        require_once &#39;PHPExcel/PHPExcel.php&#39;;
        require_once &#39;PHPExcel/PHPExcel/IOFactory.php&#39;;
        
        // 加载excel文件
        $objPHPExcel = PHPExcel_IOFactory::load($filename);
        
        // 获取焦点Sheet
        $objWorksheet = $objPHPExcel->getActiveSheet();
        
        // 获取总行
        $totalRows = $objWorksheet->getHighestRow(); // 获取总行数
                                                     
        // 获取总列
        $highestColumn = $objWorksheet->getHighestColumn();
        $totalColumns = PHPExcel_Cell::columnIndexFromString($highestColumn);
        
        // 开始行
        if (!is_int($startRow) || $startRow < 1) {
            $startRow = 1;
        }
        
        // 结束行
        if ($endRow == null || !is_int($endRow) || $endRow > $totalRows) {
            $endRow = $totalRows;
        }
        
        // 开始列
        if (!is_int($startColumn) || $startColumn < 0) {
            $startColumn = 0;
        }
        
        // 结束列
        if ($endColumn == null || !is_int($endColumn) || $endColumn > $totalColumns) {
            $endColumn = $totalColumns;
        }
        
        // 读取数据
        for($rowNum = $startRow; $rowNum <= $endRow; $rowNum++) {
            for($colNum = $startColumn; $colNum < $endColumn; $colNum++) {
                $item = $objWorksheet->getCellByColumnAndRow($colNum, $rowNum);
                $exValue = trim($item->getValue());
                $excelData[$rowNum][$colNum] = $exValue;
            }
        }
        return $excelData;
    }
}

3) PHP에서 가져온 Excel 클라이언트 코드(import.php)

<?php
/**
 * import.php
 *
 * 导入excel
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/5/14, by CleverCode, Create
 *
 */

// Excel类
include_once (&#39;Excel.php&#39;);

/*
 * 客户端类
 * 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,
 * 使业务逻辑的算法更具有可移植性
 */
class Client{

    public function main(){
        if (!$_FILES[&#39;file&#39;]) {
            exit();
        }
        
        // 从第3行开始读取Excel数据
        $datas = Excel::read($_FILES[&#39;file&#39;][&#39;tmp_name&#39;], 3);
        
        // 将$datas保存到数据库
        // ....
    }
}

/**
 * 程序入口
 */
function start(){
    $client = new Client();
    $client->main();
}

start();

?

위 내용은 Excel 그래픽 및 텍스트 코드를 XML 형식으로 공유하여 PHP로 데이터를 가져오고 내보내는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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