使用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的更多相关文章

  1. perl读取excel

    因为工作当中遇到要处理大数据的excel的玩意,最多的有几十万行.用perl的方式试试,看看效果如何. ppm install OLE::Storage_Lite #如果不安装这个,后面两个安装不了 ...

  2. perl 读取Excel写入txt 乱码

    用perl读出excel的内容(中文),然后输出在txt中乱码,但是打印在控制台正常. 解决办法: use Encode qw/from_to/; from_to($value, 'gb2312', ...

  3. Perl读取Excel中的数据

    #!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel;#PERL的Spreadsheet::ParseExcel模块支持Excel的读操作 ...

  4. Perl读写Excel简单操作

    Perl读写Excel简单操作 使用模块 Spreadsheet::ParseExcel Spreadsheet::WriteExcel 读Excel #!/usr/bin/perl -w use s ...

  5. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

  6. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  7. C#读取Excel,或者多个excel表,返回dataset

    把excel 表作为一个数据源进行读取 /// <summary> /// 读取Excel单个Sheet /// </summary> /// <param name=& ...

  8. PHP读取EXCEL时间

    在使用php读取excel表格中的时间时得到一串数字而不是时间:40359.58333333334 excel 中的时间值是自1900年以来的天数,注意是格林威治时间php 中的时间值是自1970年以 ...

  9. Open Xml 读取Excel中的图片

      在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...

随机推荐

  1. ios UITextView 提示文本

    定义两个UITextView,一个用于输入文本,一个用于显示提示信息,当输入文本为空时显示提示信息,否则不显示提示信息. //6.3.1文字内容提示 _contentTextViewTip = [[U ...

  2. 修改android的wifi客户端名称的两种方法

    修改android的wifi客户端名称的两种方法     手机连接到无线路由时,在dhcp的客户端列表里面是这样的名称"android-89425253e5de3a2",这就是安卓 ...

  3. searchView-风格调整

    5.1以后的searchView 风格调整属性相比于4.4有了些更改.我们先看代码 <style name="DeskClock.Theme" parent="an ...

  4. actionBarTab-actionBarTab自定义 布局没法改变其中字体相对中间的位置

    我们经常遇到对actionBarTab 进行操作的情况.现在记录修改它的样式的方法,已经如何自定义tab的显示布局 1.在你的theme主题中添加<item name="android ...

  5. 带你走进EJB--EJB和Spring对比(转)

    http://blog.csdn.net/jnqqls/article/details/17723417 通过对EJB系列的总结和学习我们已经对EJB有了基本的了解,但是为了更进一步的去深入学习EJB ...

  6. Vue 的 createElement 函数的参数问题的小笔记

    官方文档的说明. 第二个参数的值是要生成的标签的属性数据.点击查看详情. 第三个参数则是组件标签内的数据,数据里面的内容会渲染在第一个参数的标签内.通常会在此指定各插槽 slot 对应的位置,也可以在 ...

  7. BZOJ2527: [Poi2011]Meteors(整体二分)

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  8. Shiro学习总结(10)——Spring集成Shiro

    1.引入Shiro的Maven依赖 [html] view plain copy <!-- Spring 整合Shiro需要的依赖 --> <dependency> <g ...

  9. php函数,static,globalkeyword及三种变量作用域

    函数 和js函数相似,关注php与其它语言不用的地方 函数的形參默认值 形式: function f($a,$b=3,$vc = "abc"){ } 注意:没有给默认值的形參必须传 ...

  10. ubuntu-系统卡慢解决(转载)

    ubuntu系统狠慢 或者很卡的原因 1.  涉及内存小或者虚拟SWAP分区调整问题    可以通过 系统监视器 进行查看      在UBUNTU系统里面,并不是你的物理内存全部耗尽之后,系统才使用 ...