Perl通过CGI操作Excel文档
着手写一个工具: 在Web页面中选择器件类型和数量,然后生成配置报价预览,并提供销售配置表和BOM表的xls下载链接。
1. 搭建开发平台:
安装CentOS7.2最小版,配置网络, 注意网卡配置文件中的网关字符串是NETMASK,不是MASK。
yum install vim yum install gcc yum install httpd
配置httpd, 以/var/www/cgi-bin/为默认目录,该目录中index.html为默认主页;
编辑/var/www/cgi-bin/目录下的.htaccess文件:
# 使用rewrite方法,实现http://172.16.210.143/test.pl # 为 http://172.16.210.143/test (不带perl的后缀) RewriteEngine on RewriteRule ^test$ test.pl RewriteRule ^result$ result.pl # 实现xls文件的自动下载 <Files *.xls> ForceType application/octet-stream Header set Content-Disposition attachment </Files>
2. 编辑index.html页面,获取输入信息。index.html的forum中输入的信息传递到result.pl。
3. Perl无法实现在同一个xls表格中单元格(cell)的复制(内容和格式),必须先生成一个拷贝xls, 然后对拷贝的xls进行内容填充和格式编辑。如果通过CPAN安装Spreadsheet::ParserExcel和Spreadsheet::WriteExcel模块,可以安装成功,也能在命令行模式正常运行,但是如果在浏览器中运行result.pl时,会提示报错
[cgi:error] [pid 4778] [client 192.168.1.104:52082] AH01215: Can't loc +ate Spreadsheet/ParseExcel.pm in @INC (@INC contains: /usr/local/lib6 +4/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/shar +e/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /var/www/ +cgi-bin/result.pl line 11.
这个问题困扰了我一天多时间,最后我在perlmonks上发帖求助,解决了这个问题。原来CPAN安装模块可能会出现问题,需要手工方式安装。我在metacpan上下载了Spreadsheet::ParseExcel的源文件(tar.gz), 然后复制到/usr/local/src目录中解压进行安装,会提示需要安装其它的功能模块,逐一下载并安装。
Crypt-RC4-2.02.tar.gz Digest-Perl-MD5-1.9.tar.gz IO-stringy-2.111.tar.gz OLE-Storage_Lite-0.19.tar.gz Parse-RecDescent-1.967015.tar.gz Spreadsheet-ParseExcel-0.65.tar.gz Spreadsheet-WriteExcel-2.40.tar.gz
成功安装Spreadsheet::ParseExcel和Spreadsheet::Write模块后,在web中执行CGI就没有问题了。
4. 使用require引用其它perl代码,避免主程序过长。主程序中的参数能直接传递到require引用的新代码中。
5. 解决xls中文输入乱码的问题,使用以下方法进行中文转码解决
decode("utf-8",$string)
6. xls中单元格格式的获取和设置问题.
格式获取:
#!/usr/bin/perl -w use strict; use Spreadsheet::ParseExcel; use Spreadsheet::WriteExcel; # Open the template with SaveParser my $parser = new Spreadsheet::ParseExcel; my $workbook = $parser->Parse('1.xls'); my $worksheet = $workbook->worksheet(0); my $cell = $worksheet->get_cell(7,8); my $format = $cell->get_format(); my $pattern = $format->{Fill}->[0]; my $color1 = $format->{Fill}->[1]; my $color2 = $format->{Fill}->[2]; my $wrap = $format->{Wrap}; my $font = $format->{Font}; my $fontcolor = $font->{Color}; my $bold = $font->{Bold}; my $alignH = $format->{AlignH}; my $alignV = $format->{AlignV};; print $color1,"\n"; print $color2,"\n"; #$workbook->close();
格式设置:
$format_cell_bdh = $workbook_bom_s12->add_format(); $format_cell_bdh->set_align('center'); $format_cell_bdh->set_align('vcenter'); $format_cell_bdh->set_bottom('1');
解决上述问题,就可以对Excel做各种操作了。为了方便,我使用了比较老的xls文件,并未测试xlsx格式。