1

在此处输入图像描述

概述: 1. 在 Perl 中,我使用 Spreadsheet::WriteExcel 写入 Excel 创建的 CSV 文件。
2. 要输入 CSV 文件的数据是由 Mysql 查询生成的。

发生了什么: 1. 正在生成 CSV。2. 只处理一行数据。

需要什么: 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();
#

检查了整个互联网,但没有解决方案或提示。我已经尝试了很多东西,比如 sleep 30, counters tec,但它没有帮助。

感谢任何形式的帮助.. :)

4

3 回答 3

1

我对你的问题有点困惑。有几个原因。

您是在尝试创建 CSV 文件还是 XLS 文件?如果它是 CSV 文件,那么为什么要使用 Spreadsheet::WriteExcel (它会创建 XLS 文件)。如果它是一个 XLS 文件,那你为什么称它为“.csv”?

您似乎有两个 SQL 查询,$sqlQuery1它们$sqlQuery2的作用几乎相同。

您的调用Spreadsheet::WriteExcel::write似乎交换了行和列参数。

看起来您的代码在use strict打开时无法编译,但是您有许多未声明的变量($sec, $min, $hour, $mday,$mon等等$year)。这让我觉得我们实际上并没有看到您正在运行的代码 - 这是一个问题,因为问题很可能出在您没有向我们展示的代码中。

您是否尝试过诸如将调试输出放入从数据库中获取数据的行之类的基本操作?因此,您可以确定正在返回数据吗?您是否尝试过手动在数据库上运行 SQL 查询以确保它们按预期工作?

于 2013-03-22T14:00:41.050 回答
1

我必须同意 Dave,使用与 Excel 交互的 Perl 模块来编辑 CSV 的简单文本格式的文件就像在炎热的一天,而不是使用风扇来创造微风,建造过山车并连续骑行.

如果 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 回答