如何在Perl中使用Excel::Writer::XLSX编写hh:mm:ss.fff

如何在Perl中使用Excel::Writer::XLSX编写hh:mm:ss.fff,perl,Perl,我正在用Perl生成一个报告。报告已生成,但遗憾的是格式不正确,带有额外的撇号“ 从mysql获取的数组:$month[$i][7](注意:该列使用的是time(3)类型。示例:00:22:12.212) 用于将数据写入excel的Perl命令:$sheet1->write($row,7,$month[$i][7],$format1)#7 列的格式: my $format1 = $workbook->add_format( center_across => 1, bold =>

我正在用Perl生成一个报告。报告已生成,但遗憾的是格式不正确,带有额外的撇号

  • 从mysql获取的数组:
    $month[$i][7]
    (注意:该列使用的是
    time(3)
    类型。示例:
    00:22:12.212

  • 用于将数据写入excel的Perl命令:
    $sheet1->write($row,7,$month[$i][7],$format1)#7

  • 列的格式:

    my $format1 = $workbook->add_format(
    center_across => 1,
    bold => 0,
    size => 11,
    border => 1,
    text_wrap => 1,
    color => 'black',
    bg_color => '#ffffff',
    num_format => 'hh:mm:ss.000',
    align => 'center',
    valign => 'vcenter');
    
当我双击列时,撇号仅显示:

我已经用这些数据绘制了图表,但是列是用文本格式化的,所以我认为这就是为什么图表没有显示线条的原因。在将数组写入Excel之前,是否应该将其转换为Perl中的时间


我很抱歉,因为前面的问题不清楚,我的英语也不好


谢谢大家的支持

这是一个定制的Excel。单引号
用于在Excel中强制数字进入字符串上下文。它不会显示,但会使Excel将数字放在左侧而不是右侧

#!/usr/bin/perl

$string = "002212212"; # => 00:22:12.212

$string =~ s/^(\d{2})(\d{2})(\d{2})(\d{3})/$1:$2:$3.$4/;

print $string, "\n\n";

您还可以在左上角看到绿色小三角形,以及它显示在所选列旁边的

我相信Excel::Writer::XLSX会尝试猜测您是否有字符串或数字,但由于您的格式非常奇怪,因此它看不出正确


您可以尝试使用而不是
write
。但我们需要知道变量
$month[$i][7]
中的具体内容。如果是文本
00:22:12.212
,这可能没有帮助。

我找到了用perl中的excel writer插入时间值的方法

步骤1:将数据写入另一列

$worksheet1->write("A2","00:22:12.212",$datablank);
  • 文本大小为1且颜色为白色的格式。这样,列A2将看起来像空的。(不要再写入A2列)

    my$datablank=$workbook->add\u格式(
    粗体=>0,
    大小=>1,
    边框=>0,
    text_wrap=>1,
    颜色=>“白色”,
    num_format=>'[h]:mm:ss.000'
    );

步骤2:用
TIMEVALUE
编写一个公式,如下所示:

$worksheet1->write_formula("A1","=TIMEVALUE(A2)",$datatimeformat);
  • 格式:

    my$datatimeformat=$workbook->add\u格式(
    中心横截面=>1,
    粗体=>0,
    大小=>11,
    边框=>1,
    text_wrap=>1,
    颜色=>“黑色”,
    bg_color=>“#ffffff”,
    num_format=>“hh:mm:ss.000”,
    align=>“居中”,
    valign=>“vcenter”)


注意:我们应该使用A1列中的值来绘制图表

您尝试的示例代码对于了解我们如何帮助您是必要的。我建议使用正则表达式。嗨,大卫,我已经编辑了我的问题。请帮助解决我的问题。@RafaelNguyen如果你在评论中回答人们,你需要在他们的名字前面添加一个
@
字符,就像我刚才做的那样。这样,此人就会收到通知。它还将让您自动完成的名称,使它更容易。您评论的帖子的所有者将始终得到通知。所以,如果你写信给我,你会写
@simbabque
。但每条消息只能突出显示一个人。就友好而言,这里没有必要说你好、谢谢、问候或其他什么。你的名字在你的帖子下面,投票就像说谢谢一样。@simbabque这在下一篇帖子中有所提及。你需要将MySQL时间转换成一个数字,表示Excel中的日期。请参阅Excel::Writer::XLSX文档的一节。特别是第一部分:关于Excel中的日期和时间,需要了解两件重要的事情:1。Excel中的日期/时间是实数加上Excel数字格式。2.Excel::Writer::XLSX不会自动将write()中的日期/时间字符串转换为Excel日期/时间。虽然这提供了一个答案,但您可以通过添加代码的功能以及为什么需要这样做的说明来对其进行改进。我们也非常感谢您提供文档链接。:)以防他们无法找出
\d
与数字匹配?不,这是自文档化代码的典型例子。“自文档化”和“正则表达式”从来就不属于同一句话。@ra我想你是在混为一谈。Excel中的格式用于显示,而不是存储。在内部,这只是一个数字。你需要给它一个浮动。您不需要mysql来计算。另一种方法是在Excel中使用一个简单的文本字段,忽略“.我已经尝试写入”数字,但得到了以下警告:
参数“00:01:44.375000”不是数字加号(+),位于/usr/local/lib/perl5/site\u perl/5.16.3/Excel/Writer/XLSX/Work‌​sheet.pm第2190行
我使用了以下查询来获取该变量:
从表中选择秒到秒时间(avg(timediff(column1,column2))
这两列都在MySQL中使用
date(5)
类型。您现在有一个不同的问题@Rafael。如果你想要数字,就用数字。
00:01:04.375000
是一个字符串。它包含冒号
。当然你不能在上面做加法,因为加法只对数字起作用。你需要做出决定。要么您想将数字输入Excel并告诉Excel将其格式设置为该字符串,要么您想将字符串设置为该格式。Excel是否介意在那里进行计算时使用