私が体験した大容量ファイルデータエクスポート(バックグラウンド実行、自動生成)
(その他のメソッドはoffice07で開くと文字化けするようです。私はcsv形式を使用しようとしました)ファイルを後で作成しましたが、まだ文字化けしていたので、テーブル形式を使用しました)
Excelファイルの生成はプログラムのバックグラウンドで実行され、フロントエンドは待つ必要がなく、他のバックグラウンド操作を実行できます Excelファイルの生成の進行状況を表示するダウンロードファイルページを追加します。生成された Excel ファイルをダウンロードできます。ファイルが生成されたら、[ダウンロード] をクリックして、対応するファイルをダウンロードします。 2. Excel ファイルを生成する - Excel ファイルを生成するには、さまざまな方法があります。このメソッドを記録するだけです
- ここではテーブルのHTML形式が使用されており、それに対応するExcelステートメント
<spanmicrosoft yahei><span> 1</span><span>$struserdata</span> = <<<<span>Eof
</span><span> 2</span> <html xmlns:o="urn:schemas-microsoft-com:office:office"
<span> 3</span> xmlns:x="urn:schemas-microsoft-com:office:excel"
<span> 4</span> xmlns="http://www.w3.org/TR/REC-html40">
<span> 5</span><span> 6</span> <!DOCTYPE html <span>PUBLIC</span> "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<span> 7</span> <html>
<span> 8</span> <head>
<span> 9</span> <meta http-equiv="Content-type" c />
<span>10</span> <style>
<span>11</span> </style>
<span>12</span> </head>
<span>13</span> <body>
<span>14</span> <div align=center x:publishsource="Excel">
<span>15</span><span>16</span> <table x:str border=1 cellpadding=0 cellspacing=0 width=100%>
<span>17</span> Eof;</spanmicrosoft>
コードを表示
ファイルの終わり:


<spanmicrosoft yahei><span>1</span><span>$struserdata</span> = <<<<span>Eof </span><span>2</span> </table> <span>3</span> </div> <span>4</span> </body> <span>5</span> </html> <span>6</span> Eof;</spanmicrosoft>
もちろん、ファイルの途中には tr td タグがいくつかあります。


シナリオ:
をクリックします。 Excel を生成してダウンロード ページを表示する ---> show_download メソッド
Excel を生成する - --> create_excel メソッド show_download メソッドは create_excel メソッドを呼び出します。コマンドラインを使用してプログラムを実行します。
php コマンドラインを使用して、パラメータを create_excel メソッドに渡します。
<spanmicrosoft yahei><span>1</span><span>//</span><span> $cmd = "/usr/bin/php /home/xxx/xxx.php " . $strjoin . " >/dev/null & "; </span><span>2</span><span> // $a=exec($cmd, $out, $returndata);</span><span>3</span><span>4</span><span>5</span><span>$command</span> = "/usr/bin/php ".STATISTIC_EXPORT_SCRIPT_DIR."xxx.php " . "'" .<span>$strjoin</span> ."'". " " . <span>$uid</span> . " ". <span>$action</span> ." & "<span>; </span><span>6</span><span>$process</span> = <span>proc_open</span>(<span>$command</span>, <span>array</span>(),<span>$pipes</span><span>); </span><span>7</span><span>$var</span> = <span>proc_get_status</span>(<span>$process</span><span>); </span><span>8</span><span>proc_close</span>(<span>$process</span><span>); </span><span>9</span><span>$pid</span> = <span>intval</span>(<span>$var</span>['pid'])+1;</spanmicrosoft>ログイン後にコピー
そして、create_excel メソッド内で:
次のコードを入力する必要があります:
<spanmicrosoft yahei><span>1</span><span>set_time_limit</span>(0); <span>//</span><span>取消脚本运行时间的超时上限</span><span>2</span><span>3</span><span>ignore_user_abort</span>(<span>TRUE</span>); <span>//</span><span>后台运行,不受用户关闭浏览器的影响</span></spanmicrosoft>
<spanmicrosoft yahei><span>1</span><span>$statistic</span> = <span>call_user_func</span>(<span>array</span>('shellscript','get_result'),<span>$url</span>,<span>$params</span><span>); </span><span>2</span><span>if</span>(!<span>is_object</span>(<span>$statistic</span>) || !<span>isset</span>(<span>$statistic</span>->data-><span>items)){ </span><span>3</span><span>usleep</span>(400000);<span>//</span><span>停止400毫秒</span><span>4</span><span>$statistic</span> = <span>call_user_func</span>(<span>array</span>('shellscript','get_result'),<span>$url</span>,<span>$params</span><span>); </span><span>5</span> }</spanmicrosoft>
ここで、私が使用する方法は、データ ファイル data.xsl を書き込むときに、各データ ファイルが一時的に flag_data.xsl と呼ばれる、対応するファイル進行状況ファイルを生成するというものです。
アイデア:
第一次请求api的时候,根据返回的total总数,以及pagesize,确定要请求的次数count; 这样便可知道要请求api的次数(分页请求api),在写入数据文件的同时,同时写入进度文件flag_data.xsl;
数据格式大约是(以逗号分割)
1,5
2,5
...然后显示文件进度的时候,读取进度文件,这样变可知道数据文件大体的进度 前端js处理时,几秒读取一次相应的方法(如果都100%进度,可停止请求方法),从而实现动态查看文件的生成进度


<spanmicrosoft yahei><span> 1</span><span>public</span><span>function</span><span> execscript_process(){ </span><span> 2</span><span>$this</span>->load->library('smarty'<span>); </span><span> 3</span><span>$file_arr_str</span> = <span>array</span><span>(); </span><span> 4</span><span>$file_arr_process</span> = <span>array</span><span>(); </span><span> 5</span><span>$file_arr_name</span> = <span>array</span><span>(); </span><span> 6</span><span>$file_arr</span> = <span>array</span><span>(); </span><span> 7</span><span>$refresh_flag</span> = 'yes'<span>; </span><span> 8</span><span>$uid</span> = <span>$_REQUEST</span>['uid'<span>]; </span><span> 9</span><span>$url_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span>$uid</span> .'/';<span>//</span><span>@todo</span><span>10</span><span>if</span>(!<span>is_dir</span>(<span>$url_dir</span><span>)){ </span><span>11</span> @<span>mkdir</span>(<span>$url_dir</span>,0777<span>); </span><span>12</span><span> } </span><span>13</span><span>$files</span> = <span>scandir</span>(<span>$url_dir</span><span>); </span><span>14</span><span>15</span><span>if</span>(!<span>empty</span>(<span>$files</span><span>)){ </span><span>16</span><span>foreach</span> (<span>$files</span><span>as</span><span>$key</span> => <span>$value</span><span>) { </span><span>17</span><span>if</span>(<span>$value</span>!='.' && <span>$value</span>!='..'<span>){ </span><span>18</span><span>if</span>(<span>substr</span>(<span>$value</span>, 0 , 5)=="flag_"<span>){ </span><span>19</span><span>$file_size</span> = <span>filesize</span>(<span>$url_dir</span> . <span>$value</span><span>); </span><span>20</span><span>if</span>(!<span>empty</span>(<span>$file_size</span><span>)){ </span><span>21</span><span>$fhandle</span> = <span>fopen</span>(<span>$url_dir</span> . <span>$value</span>, 'rb+'<span>); </span><span>22</span><span>fseek</span>(<span>$fhandle</span>, -1,<span> SEEK_END); </span><span>23</span><span>$fstr</span> = ''<span>; </span><span>24</span><span>while</span>((<span>$c</span> = <span>fgetc</span>(<span>$fhandle</span>)) !== <span>false</span><span>) { </span><span>25</span><span>if</span>(<span>$c</span> == "\n" && <span>$fstr</span>) <span>break</span><span>; </span><span>26</span><span>$fstr</span> = <span>$c</span> . <span>$fstr</span><span>; </span><span>27</span><span>fseek</span>(<span>$fhandle</span>, -2,<span> SEEK_CUR); </span><span>28</span><span> } </span><span>29</span><span>fclose</span>(<span>$fhandle</span><span>); </span><span>30</span><span>$fstr</span> = <span>trim</span>(<span>$fstr</span><span>); </span><span>31</span><span>$fstr_arr_str</span> = <span>explode</span>(',', <span>$fstr</span><span>); </span><span>32</span><span>$file_arr_process</span>[] = 100 * <span>number_format</span>(<span>$fstr_arr_str</span>[0]/<span>$fstr_arr_str</span>[1],2).'%'<span>; </span><span>33</span><span>$file_arr_name</span>[] = <span>substr</span>(<span>$value</span>,5<span>); </span><span>34</span><span> } </span><span>35</span><span> } </span><span>36</span><span> } </span><span>37</span><span> } </span><span>38</span><span>39</span><span>foreach</span> (<span>$file_arr_process</span><span>as</span><span>$key</span> => <span>$value</span><span>) { </span><span>40</span><span>if</span>(<span>$value</span> != '100%'<span>){ </span><span>41</span><span>$refresh_flag</span> = 'no'<span>; </span><span>42</span><span>break</span><span>; </span><span>43</span><span> } </span><span>44</span><span> } </span><span>45</span><span> } </span><span>46</span><span>47</span><span>$file_arr</span> = <span>array</span><span>( </span><span>48</span> 'process' => <span>$file_arr_process</span>, <span>49</span> 'name' => <span>$file_arr_name</span>, <span>50</span> 'refresh_flag' => <span>$refresh_flag</span><span>51</span><span> ); </span><span>52</span><span>$file_arr_json</span> = json_encode(<span>$file_arr</span><span>); </span><span>53</span><span>echo</span><span>$file_arr_json</span><span>; </span><span>54</span> }</spanmicrosoft>
<spanmicrosoft yahei><span> 1</span><span>public</span><span>function</span><span> execscript_download(){ </span><span> 2</span><span>$filename</span> = <span>$_REQUEST</span>['filename'<span>]; </span><span> 3</span><span>$uid</span> = <span>$_REQUEST</span>['uid'<span>]; </span><span> 4</span><span>$file_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span>$uid</span>.'/'.<span>$filename</span><span>; </span><span> 5</span><span>if</span> (!<span>file_exists</span>(<span>$file_dir</span><span>)){ </span><span> 6</span><span>header</span>("Content-type: text/html; charset=utf-8"<span>); </span><span> 7</span><span>echo</span> "File not found!"<span>; </span><span> 8</span><span>exit</span><span>; </span><span> 9</span> } <span>else</span><span> { </span><span>10</span><span>ini_set</span>("memory_limit","500M"<span>); </span><span>11</span><span>header</span>('Content-Description: File Transfer'<span>); </span><span>12</span><span>header</span>('Content-Type: application/octet-stream'<span>); </span><span>13</span><span>header</span>('Content-Disposition: attachment; filename='.<span>basename</span>(<span>$file_dir</span><span>)); </span><span>14</span><span>header</span>('Content-Transfer-Encoding: binary'<span>); </span><span>15</span><span>header</span>('Expires: ' . <span>gmdate</span>('D, d M Y H:i:s') . ' GMT'<span>); </span><span>16</span><span>header</span>('Cache-Control: must-revalidate,post-check=0, pre-check=0'<span>); </span><span>17</span><span>header</span>('Pragma: public'<span>); </span><span>18</span><span>header</span>('Content-Length: ' . <span>filesize</span>(<span>$file_dir</span><span>)); </span><span>19</span><span>readfile</span>(<span>$file_dir</span><span>); </span><span>20</span><span> } </span><span>21</span><span>22</span> }</spanmicrosoft>
现象描述:
当在后台点击生成文件,跳转到下载页的时候,因为下载页是显示文件进度的页面, 竟然出现有时候有刚刚点击的文件进度,有时候没有,就感觉没有生成相应的文件一样;
解决方法:
因为数据文件和进度文件都是生成在程序的某个文件夹file中,所以读取的时候都是读取的文件夹下的文件,从而判断显示进度;
后面才知道,由于后台程序有两台服务器,导致读取以及下载的时候找不到相应的文件夹,两个服务器相应的文件夹弄个共享目录就可以了
<spanmicrosoft yahei><span> 1</span><span>public</span><span>function</span><span> execscript_process_show(){ </span><span> 2</span><span>$this</span>->load->library('smarty'<span>); </span><span> 3</span><span>$uid</span> = <span>$_REQUEST</span>['uid'<span>]; </span><span> 4</span><span>$url_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span>$uid</span> .'/';<span>//</span><span>@todo</span><span> 5</span><span>if</span>(!<span>is_dir</span>(<span>$url_dir</span><span>)){ </span><span> 6</span> @<span>mkdir</span>(<span>$url_dir</span>,0777<span>); </span><span> 7</span><span> } </span><span> 8</span><span>$files</span> = <span>scandir</span>(<span>$url_dir</span><span>); </span><span> 9</span><span>if</span>(!<span>empty</span>(<span>$files</span><span>)){ </span><span>10</span><span>foreach</span> (<span>$files</span><span>as</span><span>$key</span> => <span>$value</span><span>) { </span><span>11</span><span>if</span>(<span>$value</span>!='.' && <span>$value</span>!='..'<span>){ </span><span>12</span><span>foreach</span> (<span>$files</span><span>as</span><span>$key</span> => <span>$value</span><span>) { </span><span>13</span><span>if</span>(<span>$value</span>!='.' && <span>$value</span>!='..'<span>){ </span><span>14</span><span>if</span>(<span>substr</span>(<span>$value</span>, 0 , 5)!="flag_"<span>){ </span><span>15</span><span>$filenamedate</span> = <span>substr</span>(<span>$value</span>, 0,10<span>); </span><span>16</span><span>$today</span> = <span>date</span>('Y-m-d',<span>time</span><span>()); </span><span>17</span><span>$filenamedate</span> = <span>date</span>('Y-m-d',<span>strtotime</span>(<span>$filenamedate</span>)+(STATISTIC_FILE_EXPIRE_DAY-1)*24*3600<span>); </span><span>18</span><span>if</span>(<span>$today</span>><span>$filenamedate</span>){<span>//</span><span>文件过期</span><span>19</span> @<span>unlink</span>(<span>$url_dir</span> . <span>$value</span><span>); </span><span>20</span> @<span>unlink</span>(<span>$url_dir</span> . 'flag_' . <span>$value</span><span>); </span><span>21</span><span> } </span><span>22</span><span> } </span><span>23</span><span> } </span><span>24</span><span> } </span><span>25</span><span> } </span><span>26</span><span> } </span><span>27</span><span> } </span><span>28</span><span>29</span><span>$this</span>->smarty->assign('uid',<span>$uid</span><span>); </span><span>30</span><span>$this</span>->smarty->display('interact/statistic/execscript.tpl'<span>); </span><span>31</span> }</spanmicrosoft>
<spanmicrosoft yahei>http://blog.csdn.net/yysdsyl/article/details/4636457 http://www.codesky.net/article/201202/163385.html http://www.cnblogs.com/zdz8207/p/3765567.html http://blog.163.com/mojian20040228@126/blog/static/4112219320097300922992/ http://php.net/manual/en/features.commandline.php http://blog.csdn.net/yangjun07167/article/details/5603425 http://blog.csdn.net/yunsongice/article/details/5445448 http://www.cppblog.com/amazon/archive/2011/12/01/161281.aspx http://blog.51yip.com/tag/proc_open http://www.justwinit.cn/post/1418/ http://limboy.me/tech/2010/12/05/php-async.html</spanmicrosoft>
以上就介绍了我所经历的大文件数据导出(后台执行,自动生成),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









印刷が必要なファイルを開いたときに、印刷プレビューで表の枠線が何らかの原因で消えてしまった場合は、早めに対処する必要があります。 file このような質問がある場合は、エディターに参加して次のコースを学習してください: Excel で表を印刷するときに枠線が消えた場合はどうすればよいですか? 1. 次の図に示すように、印刷する必要があるファイルを開きます。 2. 以下の図に示すように、必要なコンテンツ領域をすべて選択します。 3. 以下の図に示すように、マウスを右クリックして「セルの書式設定」オプションを選択します。 4. 以下の図に示すように、ウィンドウの上部にある「境界線」オプションをクリックします。 5. 下図に示すように、左側の線種で細い実線パターンを選択します。 6.「外枠」を選択します

Excelは日々の事務作業でデータ処理に使用されることが多く、「フィルター」機能を使用することが多いです。 Excel で「フィルタリング」を実行する場合、同じ列に対して最大 2 つの条件しかフィルタリングできません。では、Excel で同時に 3 つ以上のキーワードをフィルタリングする方法をご存知ですか?次に、それをデモンストレーションしてみましょう。 1 つ目の方法は、フィルターに条件を徐々に追加することです。条件を満たす 3 つの詳細を同時にフィルターで除外する場合は、まずそのうちの 1 つを段階的にフィルターで除外する必要があります。最初に、条件に基づいて姓が「Wang」の従業員をフィルタリングできます。 [OK]をクリックし、フィルター結果の[現在の選択をフィルターに追加]にチェックを入れます。手順は以下の通りです。同様に再度個別にフィルタリングを行う

私たちは日々の仕事や勉強で、他人からExcelファイルをコピーし、そのファイルを開いて内容を追加したり、再編集したりして保存することがありますが、互換性チェックのダイアログボックスが表示されることがあり、非常に面倒です。ソフトウェア. 、通常モードに変更できますか?そこで以下では、エディターがこの問題を解決するための詳細な手順を紹介します。一緒に学びましょう。最後に、忘れずに保存してください。 1. 図に示すように、ワークシートを開き、ワークシートの名前に追加の互換モードを表示します。 2. このワークシートでは、内容を変更して保存すると、図のように互換性チェックのダイアログが必ず表示され、非常に面倒です。 3. [Office] ボタンをクリックし、[名前を付けて保存] をクリックして、

データを処理していると、倍数や温度などのさまざまな記号が含まれるデータに遭遇することがあります。 Excel で上付き文字を設定する方法をご存知ですか? Excel を使用してデータを処理する場合、上付き文字を設定しないと、大量のデータを入力するのがさらに面倒になります。今回はエクセルの上付き文字の具体的な設定方法をエディターがお届けします。 1. まず、図に示すように、デスクトップで Microsoft Office Excel ドキュメントを開き、上付き文字に変更する必要があるテキストを選択します。 2. 次に、図に示すように、右クリックして、クリック後に表示されるメニューで「セルの書式設定」オプションを選択します。 3. 次に、自動的に表示される「セルの書式設定」ダイアログボックスで

ほとんどのユーザーは Excel を使用してテーブル データを処理します。実は Excel にも VBA プログラムがあります。専門家を除けば、この関数を使用したユーザーはあまり多くありません。VBA で記述するときによく使用されるのが iif 関数です。実際には、次の場合と同じです。関数の機能は似ていますが、iif関数の使い方を紹介します。 SQL ステートメントには iif 関数があり、Excel には VBA コードがあります。 iif 関数は Excel ワークシートの IF 関数と似ており、論理的に計算された真値と偽値に基づいて真偽値を判定し、異なる結果を返します。 IF 関数の使用法は (条件、はい、いいえ) です。 VBAのIF文とIIF関数、前者のIF文は条件に応じて異なる文を実行できる制御文であり、後者は条件に応じて異なる文を実行できる制御文です。

ソフトウェアの学習では、Excel が便利なだけでなく、実際の作業で必要なさまざまな形式に対応できるため、Excel の使用に慣れています。Excel は非常に柔軟に使用でき、今日は「みんなのために:Excelの読み取りモードを設定する場所」を持ってきました。 1. コンピュータの電源を入れ、Excel アプリケーションを開き、目的のデータを見つけます。 2. Excel で読み取りモードを設定するには 2 つの方法があります。 1 つ目: Excel には、Excel レイアウトで多数の便利な処理メソッドが配布されています。 Excelの右下に読み取りモードを設定するショートカットがあります。バツマークのパターンを見つけてクリックすると、読み取りモードに入ります。バツマークの右側に小さな立体マークがあります。 。

1. PPT を開き、Excel アイコンを挿入する必要があるページに移動します。 「挿入」タブをクリックします。 2. [オブジェクト]をクリックします。 3. 次のダイアログボックスが表示されます。 4. [ファイルから作成]をクリックし、[参照]をクリックします。 5. 挿入する Excel テーブルを選択します。 6. [OK] をクリックすると、次のページが表示されます。 7. [アイコンで表示]にチェックを入れます。 8. 「OK」をクリックします。

私たちはデータや表、グラフなどの加工などさまざまな作業でMicrosoft Office Excelを使用していますが、Microsoft Office Excelを使用していると、内容が入力できず「入力値が不正です」と表示されることがあります。 Excelで不正な入力値の制限を解除する方法をご存知ですか?それをデモンストレーションしてみましょう。まず、犯罪現場の高解像度の写真を詳しく見てみましょう。セル C1 に内容を入力したら、Enter キーを押すだけで、上記のプロンプトが表示されます。 2. キャンセル後、スプレッドシートのページに戻り、セル C1 を選択します。このとき、図に示すように、セル C1 の右下隅に小さなドロップダウンの三角形の記号があることに気づく人もいるかもしれません。 、 問題は
