使用perl读取Excel
使用perl读取Excel
环境
- windows 7
- ActiveState Perl
- Win32::OLE[perl package]
基本功能
- 循环处理多个sheet
- 读取Excel单元,提取interface信息
- 格式化标准输出
- 格式化写入文件
解析结果
Perl代码
#!/usr/bin/perl -w
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
#################################################
# Main-routine
#################################################
$Win32::OLE::Warn = 3; # die on errors...
my $modulename ="";
my $Sheet ="";
my $Book ="";
my @inports;
my @outports;
my @vgports;
my $excelvalue="";
my $Has_Help = "";
my $work = "";
if( $#ARGV < 0 ) {
&print_usage;
exit;
}
my $filename ="";
&parse_argv;
if( $Has_Help =~ /TRUE/ ) #显示帮助说明
{
&print_usage;
exit;
}
if($work =~ /TRUE/ ) #读取表格生成verilog接口文件
{
chomp($filename);
# get already active Excel application or open new
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');
# open Excel file
$Book = $Excel->Workbooks->Open("$filename");
# You can dynamically obtain the number of worksheets, rows, and columns
# through the Excel OLE interface. Excel's Visual Basic Editor has more
# information on the Excel OLE interface. Here we just use the first
# worksheet, rows 1 through 4 and columns 1 through 3.
# select worksheet number 1 (you can also select a worksheet by name)
#for(my $sheetnum=1; $sheetnum < 3;$sheetnum++) #手动设置sheet数量,循环处理每个sheet
for(my $sheetnum=2; $sheetnum < 12 ;$sheetnum++) #手动设置sheet数量,循环处理每个sheet
{
$Sheet = $Book->Worksheets($sheetnum);
&write_result; #写入文件
}
for(my $sheetnum=2; $sheetnum < 12;$sheetnum++) #手动设置sheet数量,循环处理每个sheet
{
$Sheet = $Book->Worksheets($sheetnum); #手动设置sheet数量
&output_result; #Windows终端显示结果
}
# clean up after ourselves
$Book->Close;
print "\nParse Complete!\n";
exit;
}
else
{
&print_usage;
exit;
}
#################################################
# Sub-routine: print_usage() 帮助说明
#################################################
sub print_usage {
print "\nUsage: excel2verilog.pl [-option] <excel_file> \\\n";
print " [-w <excel_file>] \\\n";
print " [-h] \n\n";
print "For example:\n";
print " perl excel2verilog.pl -w C:/Users/D/Desktop/test.xls\n";
print " perl excel2verilog.pl -h \n";
print "\n";
print " Please modify the quantity of sheets\(see line 59 and line 65\)\n";
print "\n";
}
#################################################
# Sub-routine : parse_argv() 参数读入
#################################################
sub parse_argv {
my $all_arg = "-h|-w";
for(my $i=0; $i<=$#ARGV; $i++) {
if( $ARGV[$i] =~ /-w/ ) {
$i++;
if(!defined $ARGV[$i])
{
$Has_Help = "TRUE";
}
$work = "TRUE";
$filename = $ARGV[$i];
}
elsif( $ARGV[$i] =~ /-h/ ) {
$Has_Help = "TRUE";
}
else { ### other options
$Has_Help = "TRUE";
}
}
}
#################################################
# Sub-routine : get io 得到excel表格中的有用参数存入数组中
#################################################
sub get_io{
@inports =(); #使用全局变量,分析一个sheet需要清空数组
@outports =();
@vgports =();
$modulename ="";
my $ipnamerow;
my $ipnamecol;
my $pinnamerow;
my $pinnamecol;
my $endrow;
foreach my $row (1..100) #将端口数据存入数组,注意扫描范围
{
foreach my $col (1..5) #处理1-5行得到“IP name”/“Pin name”/“Size”的位置
{
# skip empty cells
next unless defined $Sheet->Cells($row,$col)->{'Value'};
# get position
$excelvalue = $Sheet->Cells($row,$col)->{'Value'};
if($excelvalue =~ /ip name/i)
{
$ipnamerow = $row;
$ipnamecol = $col;
$modulename = $Sheet->Cells($ipnamerow,($ipnamecol+1))->{'Value'};
#printf("%s,%s\n",$ipnamerow,$ipnamecol);
}
if($excelvalue =~ /pin name/i)
{
$pinnamerow = $row;
$pinnamecol = $col;
#printf("%s\n",$pinnamerow);
}
if($excelvalue =~ /size/i)
{
$endrow = $row - 1;
#printf("%s\n",$endrow);
}
}
}
foreach my $row (($pinnamerow + 1)..$endrow) #端口处理,存入数组
{
next unless defined $Sheet->Cells($row,$pinnamecol)->{'Value'};
foreach my $col ($pinnamecol)
{
# skip empty cells
next unless defined $Sheet->Cells($row,$col)->{'Value'};
if(($Sheet->Cells($row,$col)->{'Value'}) eq "IN")
{
next; # skip "IN" cells
}
if(($Sheet->Cells($row,$col)->{'Value'}) eq "OUT")
{
next; # skip "OUT" cells
}
$_ = $Sheet->Cells($row,$col+1)->{'Value'};
if(/P|G|I\/O/) #inout
{
push(@vgports,$Sheet->Cells($row,$col)->{'Value'});
}
elsif(/\bO\/D\b|\bO\/A\b/) #output
{
push(@outports,$Sheet->Cells($row,$col)->{'Value'});
}
elsif(/\bI\/A\b|\bI\/D\b/) #input
{
push(@inports,$Sheet->Cells($row,$col)->{'Value'});
}
}
}
}
#################################################
# Sub-routine : output_result 格式化输出verilog代码
#################################################
sub output_result{
&get_io; #得到表格中的数据
printf("module %s\(\n",$modulename);
foreach my $vgport (@vgports)
{
$_ = $vgport;
if(/(.*)\<(\d*)\:/i)
{
printf("inout [%2d:0] %s,\n",$2,$1);
}
else
{
printf("inout %s,\n",$vgport);
}
}
print "\n";
foreach my $inport (@inports)
{
$_ = $inport;
if(/(.*)\<(\d*)\:/i)
{
printf("input [%2d:0] %s,\n",$2,$1);
}
else
{
printf("input %s,\n",$inport);
}
}
print "\n";
my $n = @outports;
my $i =0;
foreach my $outport (@outports)
{
$_ = $outport;
if(/(.*)\<(\d*)\:/i)
{
printf("output [%2d:0] %s",$2,$1);
}
else
{
printf("output %s",$outport);
}
$i++;
if($i < $n)
{
print(",");
}
print("\n");
}
print "\);\n";
print "\n\n\n";
print "endmodule\n";
print "\n\n\n";
}
#################################################
# Sub-routine : write_result 格式化写入verilog 代码
#################################################
sub write_result{
&get_io;
unlink "$modulename.v";
open(MODULE, ">> $modulename.v") || die ("Could not open file tempA.txt! \n");
printf MODULE ("module %s\(\n",$modulename);
foreach my $vgport (@vgports)
{
$_ = $vgport;
if(/(.*)\<(\d*)\:/i)
{
printf MODULE ("inout [%2d:0] %s,\n",$2,$1);
}
else
{
printf MODULE ("inout %s,\n",$vgport);
}
}
print MODULE "\n";
foreach my $inport (@inports)
{
$_ = $inport;
if(/(.*)\<(\d*)\:/i)
{
printf MODULE ("input [%2d:0] %s,\n",$2,$1);
}
else
{
printf MODULE ("input %s,\n",$inport);
}
}
print MODULE "\n";
my $n = @outports;
my $i =0;
foreach my $outport (@outports)
{
$_ = $outport;
if(/(.*)\<(\d*)\:/i)
{
printf MODULE ("output [%2d:0] %s",$2,$1);
}
else
{
printf MODULE ("output %s",$outport);
}
$i++;
if($i < $n)
{
print MODULE (",");
}
print MODULE ("\n");
}
print MODULE "\);\n";
print MODULE "\n\n\n";
print MODULE "endmodule\n";
close MODULE
}
参考资料
功能丰富的 Perl: 用 Perl 读写 Excel 文件
使用perl读取Excel的更多相关文章
- perl读取excel
因为工作当中遇到要处理大数据的excel的玩意,最多的有几十万行.用perl的方式试试,看看效果如何. ppm install OLE::Storage_Lite #如果不安装这个,后面两个安装不了 ...
- perl 读取Excel写入txt 乱码
用perl读出excel的内容(中文),然后输出在txt中乱码,但是打印在控制台正常. 解决办法: use Encode qw/from_to/; from_to($value, 'gb2312', ...
- Perl读取Excel中的数据
#!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel;#PERL的Spreadsheet::ParseExcel模块支持Excel的读操作 ...
- Perl读写Excel简单操作
Perl读写Excel简单操作 使用模块 Spreadsheet::ParseExcel Spreadsheet::WriteExcel 读Excel #!/usr/bin/perl -w use s ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
/** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...
- C#读取Excel,或者多个excel表,返回dataset
把excel 表作为一个数据源进行读取 /// <summary> /// 读取Excel单个Sheet /// </summary> /// <param name=& ...
- PHP读取EXCEL时间
在使用php读取excel表格中的时间时得到一串数字而不是时间:40359.58333333334 excel 中的时间值是自1900年以来的天数,注意是格林威治时间php 中的时间值是自1970年以 ...
- Open Xml 读取Excel中的图片
在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...
随机推荐
- (43)JS运动之链式运动框架
链式运动框架就是一系列的运动分阶段进行,在普通的运动框架上加上一个參数function,这个function表示下一个要运行的动作.详细代码例如以下: <!DOCTYPE HTML> &l ...
- ellipsize-TextView省略号的设定
ellipsize主要是当TextView的文字过长的时候,我们可以让它显示省略号 用法如下: 在xml中 <!--省略号在结尾--> android:ellipsize = " ...
- android图像处理系列之七--图片涂鸦,水印-图片叠加
图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...
- Spider_req
requests模块 安装(用管理员身份去打开Anaconda Prompt) conda install requests python -m pip install requests # 以管理员 ...
- CListCtrl 隔行变色
响应消息 ON_NOTIFY(NM_CUSTOMDRAW, ListCtrl的ID, OnNMCustomdrawList) 实现函数OnNMCustomdrawList void CFinishWe ...
- Debian9 安装后的配置笔记
安装Debian9后,需要做的事,具体如下: 以下内容主要参考:https://www.cnblogs.com/OneFri/p/8308340.html感谢作者的分享. su 输入密码,登录root ...
- 在安卓(手机)上运行 Ubuntu (Linux)
在安卓(手机)上运行 Ubuntu (Linux) 由于x86 和 arm 是跨平台的,所使用的编译器自然也不同.如果要在电脑上编译安卓手机上的程序,则需在电脑端建立ARM交叉编译环境,这个过程是在耗 ...
- RocketMQ集群消费的那些事
说明 RocketMQ集群消费的时候,我们经常看到类似注释里面 (1,(2 的写法,已经有时候有同学没注意抛异常的情况就是(3 模拟的情况.那么这3种情况到底是怎么样的呢?你是否都了然于心呢?下面我们 ...
- Linux下读写寄存器
arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU.比如arm和x86就不一样, ...
- vsphere client 参数
转自:http://blog.163.com/sword_111/blog/static/66589416201422964544918/ C:\Program Files (x86)\VMware\ ...