2017-04-04 74 views
2

我们需要生成excel文件和单元格值应在公式栏中以mm/dd/yyyy格式(1/1/1901)显示,并在相应单元格中显示为yyyy-mm-dd格式(1901-01-01)。有人可以帮助如何使用Perl来实现这一点,请参考下面的屏幕截图,这将显示我们需要如何。如何在公式栏中将excel单元格值显示为“1/1/1901”,并使用perl将相同的单元格显示为“1901-01-01”

我们使用模块Excel :: Writer :: XLSX,我们尝试了下面的代码,但它在编辑栏和单元格中都显示了相同的格式。

 if ($cell =~ qr[^(\d{4})/(\d{1,2})/(\d{1,2})$]) 
     { 
     my $format1 = $workbook->add_format(num_format => 'yyyy-mm-dd'); 
     my $date = sprintf "%02d/%02d/%04d", $2, $3, $1; 
     $worksheet->write_date_time($iR, $iC, ${date}, $format1); 
     } 

截屏

+1

你看,你的示例文件有格式?看起来你正在做正确的事情,但也许你可以从原始文件中学到一些东西。也可能有助于使用Spreadsheet :: XLSX来查看文件中的格式。 – simbabque

+0

你为什么删除截图? – jm666

回答

2

从文档:

最直接的方法是将您的日期转换为ISO8601 YYYY-MM-DDTHH:MM:SS.SSS日期格式并使用write_date_time() 工作表方法:

演示:

use strict; 
use warnings; 

use Excel::Writer::XLSX; 

my $wb = Excel::Writer::XLSX->new('perl.xlsx'); 
my $ws = $wb->add_worksheet(); 

$ws->set_column('A:B', 25); 

my $date_format = $wb->add_format(num_format => 'yyyy-mm-dd'); 

my($d,$m,$y) = (20,1,1901); 

#your current 
my $current = sprintf "%02d/%02d/%04d", $d,$m,$y; 
$ws->write('A1', 'using: %02d/%02d/%04d'); 
$ws->write_date_time('B1', $current, $date_format); 

#you want 
my $wanted = sprintf "%04d-%02d-%02dT", $y,$m,$d; 
$ws->write('A2', 'using: %04d-%02d-%02dT'); 
$ws->write_date_time('B2', $wanted, $date_format); 

产生在Excel

excel screenshot

+0

非常感谢!它按照我们的要求工作。 –

相关问题