使用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的文章, 但 ...
随机推荐
- Android 控件:CheckBox
首先,在布局文件里注冊CheckBox activity_main.xml <LinearLayout xmlns:android="http://schemas.android.co ...
- python路径找类并获取静态字段
Python通过路径找类并获取其中大写的静态字段 settings.py class Foo: DEBUG = True TEST = True xx.py import importlib path ...
- System and method for controlling switching between VMM and VM using enabling value of VMM timer indicator and VMM timer value having a specified time
In one embodiment, a method includes transitioning control to a virtual machine (VM) from a virtual ...
- AutoCAD 出现“安全系统(软件锁许可管理器)不起作用或未正确安装”的解决方法
感谢高飞鸟提供解决方案.当AutoCAD或自动桌子公司的其它产品在启动过程中突然停电或其它原因造成操作系统重启时,可能会造成这些产品的许可出错而无法再运行.一般出错后第一次进入时,会提示你“产品需要激 ...
- [React] Render Elements Outside the Current React Tree using Portals in React 16
By default the React Component Tree directly maps to the DOM Tree. In some cases when you have UI el ...
- Android学习笔记之Bitmap位图的缩放
位图的缩放也可以借助Matrix或者Canvas来实现. 通过postScale(0.5f, 0.3f)方法设置旋转角度,然后用createBitmap方法创建一个经过缩放处理的Bitmap对象,最后 ...
- HTML的SEO(搜索引擎优化)标准
HTML的SEO(搜索引擎优化)标准 一.总结 这个做seo的时候要多看,做网站优化的时候 1. SEO(搜索引擎优化):通过总结搜索引擎的排名规律,对网站进行合理优化,使你的网站在百度和Google ...
- 12. ZooKeeper之Java客户端API使用—创建会话。
转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...
- Python产生随机数组,测试用
import numpy as np if __name__ == '__main__': a=np.random.randint(0,10,size=[3,3]) print(a) 输出: [ ...
- (错误记录)Vue: Unknown custom element
错误: vue.js:634 [Vue warn]: Unknown custom element: <ve-pie> - did you register the component c ...