1

以下は、処理中のシートデータの進行状況をユーザーに通知するために進行状況バーを配置したスクリプトです。問題は、xlsをcsvに保存するプロセス全体が実行された後に進行状況バーが表示されることです。次のようにすると、現在のシートが処理中のときに進行状況バーが正しく表示されます。ありがとう、

 $excel = new Spreadsheet_Excel_Reader();
    $excel->setOutputEncoding('UTF-16');
    $excel->read('Student2.xls');
    $x=1;
    $sep = ",";

   $nbSheets = count($excel->sheets);
  echo $x." -  ".$nbSheets;

  $total = $nbSheets - 1;

for($i = 0; $i < $nbSheets; $i++) {


    // Calculate the percentation
    $percent = intval($i/$total * 100)."%";

    // Javascript for updating the progress bar and information
    echo '<script language="javascript">
    document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\">&nbsp;</div>";
    document.getElementById("information").innerHTML="'.$i.' row(s) processed.";
    </script>';

    // This is for the buffer achieve the minimum size in order to flush data
    echo str_repeat(' ',1024*64);

    // Send output to browser immediately
    flush();
    //sleep(1);

   ob_start();
    while($x<=$excel->sheets[$i]['numRows']) {
        $y=1;
        $row="";
        while($y<=$excel->sheets[$i]['numCols']) {
            $cell = isset($excel->sheets[$i]['cells'][$x][$y]) ? $excel->sheets[$i]['cells'][$x][$y] : '';
            $row.=($row=="")?"\"".$cell."\"":"".$sep."\"".$cell."\"";
            $y++;
        } 
        echo $row."\n"; 
        $x++;
    }
    $x = 1; $y = 1;
    $fp = fopen("data.csv",'a');
    fwrite($fp,ob_get_contents());
    fclose($fp);
    ob_end_clean();

}

echo "CSV file created successfully";
// Tell user that the process is completed
echo '<script language="javascript">document.getElementById("information").innerHTML="Process completed"</script>';
4

3 に答える 3

0

あなたのコードとあなたが言及したリンクを確認しました。コードには1つの違いがあり、違いはコメントを付けたsleep(1);ことです。このコマンドだけのために、作業の進行状況バーを正しく表示できません。

コメントを外すsleep(1);と、コードが正しく機能します。

于 2012-12-09T10:17:47.750 に答える
0

多分これはあなたの問題を解決するかもしれません:

question#6556790 : echo-string-while-every-long-loop-iteration-flush-not-working

data.csvまた、ファイルへの書き込みに出力バッファを使用するのはなぜですか? $row."\n"出力バッファは、データを出力するためのものなので、この場合は単純に関数に渡す方が論理的だと思いfwriteます。ここで何か不足している場合は修正してください。

于 2012-12-09T09:00:58.847 に答える
0

これを実現するには、AJAX などのクライアント サーバー通信フレームワークを使用する必要があります。

このサンプル コードを確認してみてください(記事の下部にあるリンクからコードをダウンロードしてください)。

This SO questionthis questionは、同様の問題に対処しているようです。

言いたくないことですが、「ajax php progressbar」を検索すると、多くの例が表示される可能性があります。

于 2012-12-09T10:06:39.650 に答える