对Excel进行处理

Perl实现

有一表格需要进行格式化处理,其要求如下:

  1. 档案编号重复 少部分在xls文件中,大部分与数据库冲突。
  2. 日期格式错误 正确格式:xxxx-xx-xx
  3. 所有汉字的空格问题
  4. 非法性别 除了男女之外

code

程序如下:

#! /usr/bin/perl

###############################################################################
# Author:               **斌
# Date:                 2012-02-22
# Version:              V0.1
###############################################################################

###############################################################################
# Modified by:          xiaobin (XB)
# Modified date:        2012-03-31
# Version:              V0.3
###############################################################################

###############################################################################
# Modified by:          xiaobin (XB)
# Modified date:        2012-04-01
# Version:              V0.4
###############################################################################

###############################################################################
# Modified by:          
# Modified date:        
# Version:              
###############################################################################

###############################################################################
# 版权说明:                                                                  #
#           本程序版权归李贵斌所有,解释权属于所有者。                        #
#           作为一个整体使用时,请附带以上说明。                              #
#                                                                             #
#           本程序完全免费使用。                                              #
###############################################################################

###############################################################################
#                               使用说明                                      #
###############################################################################
#                                                                             #
#   命令行:perl processData.PL xxx.xls >> xxx.txt                            #
#                                                                             #
#   参数解释:                                                                #
#           1. xxx.xls 为要进行处理的Excel文件名                              #
#           2. >> 为管道符号                                                  #
#           3. xxx.txt 为要保存的文件                                         #
#                                                                             #
###############################################################################


use strict;
use warnings;
use Encoding;

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;



###############################################################################
# 主程序
#
###############################################################################
my $oExcel = Spreadsheet::ParseExcel->new;
die "You must provide a filename to $0"
        ."to be parsed as an Excel file" unless @ARGV;

#set for charactor
my $oFmtC = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => "GB2312");

if($#ARGV < 0) {
    exit;
}

my $oBook = $oExcel->Parse($ARGV[0], $oFmtC);
my($iR, $iC, $oWkS, $oWkC);

PrnBook($oBook);


###############################################################################
# 主子程序
#
###############################################################################
sub PrnBook {
    my($oBook) = @_;
    my($iR, $iC, $oWkS, $oWkC);

    for(my $iSheet=0; $iSheet < $oBook->{SheetCount}; $iSheet++) {
        $oWkS = $oBook->{Worksheet}[$iSheet];

        my $sn = 0;

        print "序号\t建档日期\t性别\t出生日期\r\n";
        print "====\t==========\t====\t==========\r\n";

        for(my $iR = $oWkS->{MinRow};
                defined $oWkS->{MaxRow} && $iR < $oWkS->{MaxRow} + 1; $iR++) {
            $sn = $iR + 1;
            print "$sn,\t";

            for(my $iC = $oWkS->{MinCol};
                        defined $oWkS->{MaxCol} && $iC < $oWkS->{MaxCol} + 1;
                        $iC++) {

                $oWkC = $oWkS->{Cells}[$iR][$iC];

                checkDateFmt($iC, $oWkC);
                check2Sex($iC, $oWkC);
            }

            print "\r\n";
        }
        print "============ 共处理 $sn 行数据 ============\r\n";
    }
}

###############################################################################
# 模块说明:子程序
#
# 功能说明:检查日期格式
#           $_[0] == 4 为检查第4列的数据(0, 1, 2, 3, 4)
#           $_[0] == 7 为检查第7列的数据(0, 1, 2, 3, 4, 5, 6, 7)
###############################################################################
sub checkDateFmt {
    if ($_[0] == 4 || $_[0] == 7) {

        if ($_[1]->Value =~ m{ \s }xms) {
        	 die "Not Value!";
        }

        if ($_[1]->Value =~
            m{
                ^
                ([1-9]) ([0-9]) ([0-9]) ([0-9])     # Year
                [-] +                               # -
                ([0-9]) ([0-9])                     # Month
                [-] +                               # -
                ([0-9]) ([0-9])                     # Day
                $
            }xms
            ) {
            if ($_[0] == 4) {
                print "$1$2$3$4-$5$6-$7$8,\t";
            }
            else {
                print "$1$2$3$4-$5$6-$7$8\t";
            }
        }
        elsif ($_[1]->Value =~
            m{
                ^
                ([1-9]) ([0-9]) ([0-9]) ([0-9])     # Year
                [-] ?                               # -
                ([0-9]) ([0-9])                     # Month
                [-] ?                               # -
                ([0-9]) ([0-9])                     # Day
                $
            }xms
            ) {
            print "$1$2$3$4-$5$6-$7$8\t";
        }
        else {
            print "not match.\t";
        }

    }
}

###############################################################################
# 模块说明:子程序
#
# 功能说明:检查性别
#           (男, 女)
#           $_[0] == 5 为检查第4列的数据(0, 1, 2, 3, 4, 5)
###############################################################################
sub check2Sex {
    my $strMan = Encode::decode("CP936", "男");
    my $strWoman = Encode::decode("CP936", "女");

    if ($_[0] == 5) {
        unless (Encode::decode("CP936", $_[1]->Value) =~
            m{
                ( $strMan | $strWoman )
            }xms
            ) {
            print "Unknow\t";
        }
        else {
            print Encode::encode("CP936", $1).",\t";
        }
    }
}