ホームページ >バックエンド開発 >PHPチュートリアル >Excel グラフィックスと XML 形式でのテキスト コード共有を使用して PHP でデータをインポートおよびエクスポートする方法

Excel グラフィックスと XML 形式でのテキスト コード共有を使用して PHP でデータをインポートおよびエクスポートする方法

黄舟
黄舟オリジナル
2017-07-17 15:33:343428ブラウズ

1 はじめに

1.1 エクスポート

実際の作業プロジェクトでは、勤怠レポートのエクスポート、財務諸表のエクスポート、業績レポートのエクスポート、販売レポートのエクスポートなど、いくつかの重要なデータベースに保存されているデータを Excel にエクスポートする必要があることがよくあります。 CleverCode は 2 年間 PHPExcel を使用して Excel エクスポート データを作成しましたが、特にセルの色の制御、セルの結合、セルの長さの設定など、PHPExcel を使用して Excel を生成するのは面倒すぎることがわかりました。 Excel でこれらの 1 つをデザインするには、通常 1 日かかります。その後、CleverCode は、PHP を使用して Excel を XML 形式でエクスポートする簡単な方法を発見しました。以前は 1 日かかっていましたが、今では半分の労力で 2 倍の結果が得られます。

1.2 インポート

同時に、一部のプロジェクトでは Excel データをデータベースにインポートする必要もあります。たとえば、銀行から提供された銀行取引明細書や販売レポートがデータベースにインポートされます。通常のアプローチは、PHPExcel を使用することです。

Excel を XML 形式で読み取るには、Xml パーサー、SimpleXML、XMLReader、DOMDocument などのメソッドを使用できますが、CleverCode はこれらのメソッドを使用しようとしましたが、これらのメソッドは複雑すぎて手間がかかり、PHPExcel ほど便利ではないことがわかりました。

したがって、Excel (xml 形式を含む) を読み取る必要がある場合、CleverCode は PHPExcel ライブラリを使用することをお勧めします。

2 要件

あるグループでは、各地域の担当者が、担当する都市局の注文と売上をデータベースにインポートする必要があります。
1) Web サイトでは、インポートされた販売レポートのテンプレートが提供されます。
2) 各担当者は、自分が担当する都市のデータのみアップロードおよびダウンロードできます(権限チェック)。
3) 現在の年とその日が所有するすべての四半期を生成する場合にのみアップロードします。たとえば、今日は 2015 年 5 月 26 日です。次に、2015 年の第 1 四半期と第 2 四半期のみが生成されます。
2015-12-01 の場合。 2015 年の第 1 四半期、第 2 四半期、第 3 四半期、および第 4 四半期を生成する必要があります。
4) 今四半期の前四半期のデータを表示します。
5) この四半期のデータはデフォルトではすべて 0 です。
6) この四半期のデータのみを変更できます。

3 プログラミングソースコードのダウンロード

4 Webサイトページのデザイン

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) 「売上報告書.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) 営業テンプレートをダウンロード後、データを入力し、ページ内のアップロードボタンをクリックしてExcelデータをアップロードします。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。