前言
更多内容,请访问我的 个人博客。
前言
用perl处理excel有两种流行的模块:一种是 win32:OLE
模块,优点是功能强大,在excel上能做的事情用这个模块都能做,缺点是无法跨平台,必须在win系统上使用且必须安装office软件;另一种是 Spreadsheet
模块,优点是跨平台,不依赖系统和软件,缺点是功能不是很多,但基本功能都能实现。
如果在win平台处理excel,建议使用 win32:OLE
模块(教程传送门),本文主要讲解 Spreadsheet
模块的使用方法。
了解
从 Spreadsheet::ParseExcel 和 Spreadsheet::WriteExcel 的官方资料中我们可以知道:
Spreadsheet::ParseExcel
- 是用于提取excel信息
- 仅支持Excel 95-2003格式
Spreadsheet::WriteExcel
- 是用于新建excel信息
- 仅支持Excel 97-2007格式
也就是说,如果想更好的支持 xlsx
格式的excel需要用到 Spreadsheet::ParseXLSX 和 Excel::Writer::XLSX 模块。
另外, Spreadsheet::ParseExcel::SaveParser 可以支持在已存在的
xls
表中修改数据,但是支持效果远没有win32:OLE
模块强大,修改之后的表格会丢失部分不支持的宏命令和表格等,最遗憾的是仅支持xls
,并不支持xlsx
。
安装模块
在终端中输入 sudo perl -MCPAN -e "install 'Spreadsheet::ParseExcel'"
,回车,如下图:
若出现如下图,则安装成功:
使用方法 - 提取Excel
引用 use Spreadsheet::ParseExcel;
类,如下:
- use Spreadsheet::ParseExcel;
- 复制代码
Parser
new()
new()方法可以新建一个提取类,如下:
- my $parser = Spreadsheet::ParseExcel->new(); #新建提取类
- 复制代码
若是2007版以上的excel,则需要用到 Spreadsheet::ParseXLSX ,如下:
- use Spreadsheet::ParseXLSX; #引用
- my $parser = Spreadsheet::ParseXLSX->new(); #新建xlsx提取类
- 复制代码
若excel需要密码才能打开,则新建密码提取类,如下:
- $parser = Spreadsheet::ParseExcel->new( Password => 'secret' ); #若excel需要密码才能打开,则新建密码提取类
- 复制代码
parse($filename)
获取excel表的工作薄,若无则返回 under
- my $workbook = $parser->parse('Book1.xls'); #获取excel表的工作薄,若无则返回 `under`
- 复制代码
error()
判断是否存在该excel表格
- # error_code() => error()
- # ============ =======
- # 0 => ''
- # 1 => '文件没有找到'
- # 2 => '该文件不是标准的excel格式文档'
- # 3 => '文件加密了'
-
- if ( !defined $workbook ) { #一般需要判断是否存在该excel表格
- die $parser->error_code(), $parser->error(), ".\n";
- }
- 复制代码
Workbook
Spreadsheet::ParseExcel::Workbook
是由 Spreadsheet::ParseExcel
的 parse()
方法获得,有如下几种常用方法(完整方法使用传送门):
- $workbook->worksheets()
- $workbook->worksheet()
- $workbook->worksheet_count()
- $workbook->get_filename()
- 复制代码
worksheets()
循环获取所有的sheet表,如下:
- for my $worksheet ( $workbook->worksheets() ) {
- #循环获取所有的sheet表
- ...
- }
- 复制代码
worksheet()
通过sheet表名或表索引获取单一sheet表,若无则返回 under
,如下:
- $worksheet = $workbook->worksheet('Sheet1'); #获取名为"Sheet1"的sheet表
- $worksheet = $workbook->worksheet(0); #获取第一张sheet表
- 复制代码
worksheet_count()
获取sheet表的个数,如下:
- my $worksheet_count = $workbook->worksheet_count(); #获取sheet表的个数
- 复制代码
get_filename()
获取excel表的全路径+名称,如下:
- my $filename = $workbook->get_filename(); #获取excel表的全路径+名称
- 复制代码
Worksheet
Spreadsheet::ParseExcel::Worksheet
是由 worksheets()
或 worksheet()
方法获得,有如下几种常用方法(完整方法使用传送门):
- $worksheet->get_cell()
- $worksheet->row_range()
- $worksheet->col_range()
- $worksheet->get_name()
- 复制代码
get_cell(col)
由指定行和列获取单元格,若不存在则返回 under
,如下:
- my $cell = $worksheet->get_cell($row, $col); #由指定行和列获取单元格
- 复制代码
row_range()
返回一个二元列表 ($min, $max)
,表示行数的最小值和最大值,如下图:
- my ( $row_min, $row_max ) = $worksheet->row_range(); #行数的最小值和最大值
- 复制代码
col_range()
返回一个二元列表 ($min, $max)
,表示列数的最小值和最大值,如下图:
- my ( $col_min, $col_max ) = $worksheet->col_range(); #列数的最小值和最大值
- 复制代码
get_name()
获取sheet的名称,如下图:
- my $name = $worksheet->get_name(); #获取sheet的名称
- 复制代码
Cell
Spreadsheet::ParseExcel::Cell
有如下几种常用方法(完整方法使用传送门):
- $cell->value()
- $cell->unformatted()
- 复制代码
value()
获取单元格的值(有格式)。例如,在单元格中输入数字 123
,单元格显示为 123.00
, 方法value()
的返回值为 123.00
。如下:
- my $value = $cell->value(); #获取单元格的值(有格式)
- 复制代码
unformatted()
获取单元格的值(无格式)。例如,在单元格中输入数字 123
,单元格显示为 123.00
,方法 unformatted()
的返回值为 123
。如下:
- my $value = $cell->unformatted(); #获取单元格的值(有格式)
- 复制代码
高级方法 - 提取Excel
Format
获取 单元格格式
,如下:
- my $format = $cell->get_format(); #获取单元格格式
- 复制代码
Spreadsheet::ParseExcel::Format
类有如下方法:
- $format->{Font}
- $format->{AlignH}
- $format->{AlignV}
- $format->{Indent}
- $format->{Wrap}
- $format->{Shrink}
- $format->{Rotate}
- $format->{JustLast}
- $format->{ReadDir}
- $format->{BdrStyle}
- $format->{BdrColor}