1

ここに画像の説明を入力してください

概要: 1。Perlでは、Spreadsheet::WriteExcelを使用してExcelで作成されたCSVファイルに書き込みます。
2. CSVファイルに入力されるデータは、Mysqlクエリから生成されています。

何が起こっているのか:1。CSV が生成されています。2.1つの行のデータのみが処理されています。

必要なもの: 1。行の形式で、たとえば30秒ごとにデータを定期的に追加します。したがって、毎日巨大なCSVファイルが作成されます。つまり、24時間で2880行が追加されます。

コードは以下の通りです:

use strict;
use warnings;
use DBI;
use Spreadsheet::WriteExcel;

# DEFINING THE DATE 
 ($sec,$min,$hour,$mday,$mon,$year) =localtime(time);
undef $sec;
undef $hour;
undef $min;
$year += 1900;
$mday;
$mon+=1;
if ($mon < 10) {
        $mon = "0".$mon;
    }
if ($mday < 10) {
        $mday = "0".$mday;
    }

# CREATION OF A NEW WORKBOOK AND ADDITION OF A WORKSHEET
$tdate = sprintf("%04d%02d%02d", $year, $mon, $mday);
$SubsLogFile = "Subscription-".$tdate;
$SubsLogFile .= ".csv";

my $workbook  = Spreadsheet::WriteExcel->new($SubsLogFile);
my $worksheet = $workbook->add_worksheet();


#=============================================

# FORMAT FOR THE HEADER
my $format = $workbook->add_format();
$format->set_bold();
$format->set_color('red');
$format->set_align('center');


# CREATION OF THE HEADER   
$worksheet->write(0, 0, "Sub Day", $format);
$worksheet->write(0, 1, "Sub Hour", $format);

#=============================================


###################
## SUBSCRIPTIONS ##
###################

# INPUTTING THE SERVER DETAILS
$db ="abcd";
$user = " abcd ";
$pass = " abcd ";
$host="100.100.100.100";
my $col = 2;



# GENERATING THE SQL QUERIES
$query1 = "SELECT COUNT(*) FROM subscription_detail WHERE creation_date >=CURRENT_DATE();";
 $query2 = "SELECT COUNT(*) FROM subscription_detail WHERE     DATE_FORMAT(creation_date,'%Y-%m-%d %H')  >= DATE_FORMAT(NOW(),'%Y-    %m-%d %H');"; 

# CONNECTING TO THE SERVER
    $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass,{
      PrintError => 0,
      RaiseError => 0
  } ) or die "Can't connect to the database: $DBI::errstr\n";

$sqlQuery1  = $dbh->prepare($query1) or die "Can't prepare $query1: $DBI::errstr\n";
$sqlQuery2  = $dbh->prepare($query2) or die "Can't prepare $query2: $DBI::errstr\n"; 

# EXECUTING THE QUERIES
my $rv = $sqlQuery1->execute or die "can't execute the query: $DBI::errstr\n";
my $rv = $sqlQuery2->execute or die "can't execute the query: $DBI::errstr\n";

#=============================================

# OUTPUTING THE VALUES

while (@row= $sqlQuery1->fetchrow_array()) {
my $data1 = $row[0];
$worksheet->write($col, 0, "$data1");
};


while (@row= $sqlQuery2->fetchrow_array()) {
my $data2 = $row[0];
$worksheet->write($col, 1, "$data2");
};

# Close Workbook
$workbook->close();

インターネット全体をチェックしましたが、解決策やヒントはありません。私はsleep30、counters tecのような多くのことを試しましたが、それは役に立ちません。

あらゆる種類の助けに対する感謝の言葉..:)

4

3 に答える 3

1

私はあなたの質問に少し混乱しています。いくつかの理由で。

CSVファイルまたはXLSファイルを作成しようとしていますか?CSVファイルの場合、なぜSpreadsheet :: WriteExcel(XLSファイルを作成する)を使用しているのですか。XLSファイルの場合、なぜ「.csv」と呼んでいるのですか?

2つのSQLクエリが$sqlQuery1あり、$sqlQuery2ほとんど同じことをしているようです。

の呼び出しでSpreadsheet::WriteExcel::writeは、行と列のパラメーターが入れ替わっているようです。

use strictオンにしたときにコードがコンパイルされないように見えますが、宣言されていない変数(、、、、、、など)がいくつ$secかあります。これにより、実行しているコードが実際に表示されていないように思われます。これは、表示していないコードに問題がある可能性があるため、問題です。$min$hour$mday$mon$year

データベースからデータをフェッチする行にデバッグ出力を配置するなどの基本的なことを試しましたか?では、データが返されていることを確認できますか?データベースでSQLクエリを手動で実行して、期待どおりに機能することを確認しましたか?

于 2013-03-22T14:00:41.050 に答える
1

私はデイブに同意しなければなりません.CSVである単純なテキスト形式でファイルを編集するためにExcelと対話するPerlモジュールを使用することは、扇風機を使用してそよ風を作り、ジェットコースターを構築し、それに継続的に乗るのではなく、暑い日に似ています. .

Text::CSV のインターフェイスが難しい場合は、私のTie::Array::CSVをお勧めしますか、CSV をより簡単に構築できる他の多くのモジュールがあります。

于 2013-03-25T15:37:21.403 に答える
0

これは既存の Excel ファイルに新しい行を単純に追加する方法ではありませんが、次のようになります。

  1. Win32::OLEを使用して、既存の Excel ファイルにデータを直接追加できます (ただし、Excel がインストールされている必要があります)。

  2. または、既存のファイルSpreadsheet::ParseExcelで解析し、名前を変更してから、次にSpreadsheet::WriteExcel (新しい行を含む) で新しいファイルを作成する必要があります。

于 2013-03-22T13:01:13.157 に答える