#!/usr/bin/perl | |
# | |
# Filename: | |
# --------- | |
# Office.pm | |
# | |
# Description: | |
# ------------ | |
# Microsoft Office access functions. | |
# | |
# Auther: | |
# ------- | |
# mtk01542 | |
# | |
# Note: | |
# ----- | |
# Hints for Win32 Ole: for object, use 'abc->def'; for attribute, use 'abc->{def}'. | |
# | |
# Log: | |
# ----- | |
# 2006/12/26 Create for Excel part. | |
# | |
package Office; # declare package library | |
use strict; | |
# for use of Excel | |
use Win32::OLE qw(in with); | |
use Win32::OLE::Const 'Microsoft Excel'; | |
$Win32::OLE::Warn = 3; | |
#****************************************************************************** | |
# Global Data | |
#****************************************************************************** | |
my $g_excel_name = ""; | |
my $g_excel; | |
my $g_book; | |
my $g_sheet; | |
my %g_fontAttr = ('Name' => 'Arial', 'Size' => 11, 'Bold' => 0, 'ColorIndex' => 1); | |
my %g_fontColorHash = ('black' => 1, 'white' => 2, 'red' => 3, 'blue' => 5); | |
my $curr_obj; | |
#****************************************************************************** | |
# Export Function | |
#****************************************************************************** | |
#****************************************************************************** | |
# FUNCTION | |
# excelGetColIndex | |
# DESCRIPTION | |
# get column index by given cell names and desired row | |
# PARAMETERS | |
# para 1 - reference to cell name array | |
# para 2 - reference to index hash | |
# para 3 - desired row number | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelGetColIndex() | |
{ | |
my $indexStrArray_ref; | |
my $indexHash_ref; | |
my $row; | |
($indexStrArray_ref, $indexHash_ref, $row) = @_; | |
foreach my $indexStr (@{$indexStrArray_ref}) | |
{ | |
${$indexHash_ref}{$indexStr} = 0; | |
my $col = 1; | |
my $str = trim(excelRead($row, $col)); | |
while ($str ne "") | |
{ | |
if ($str =~ /^$indexStr$/i) | |
{ | |
${$indexHash_ref}{$indexStr} = $col; | |
#print "$indexStr = $col\n"; | |
} | |
$col++; | |
$str = trim(excelRead($row, $col)); | |
} | |
} | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelNew | |
# DESCRIPTION | |
# new an excel file | |
# PARAMETERS | |
# para 1 - filename | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelNew() | |
{ | |
$g_excel_name = $_[0]; | |
$g_excel = Win32::OLE->new('Excel.Application', 'Quit') or die "Oops, cannot start Excel"; | |
#Win32::OLE->Option(CP => Win32::OLE::CP_UTF8); | |
$curr_obj = $g_excel; | |
$g_book = $g_excel->Workbooks->Add; | |
$g_sheet = $g_book->Worksheets(1); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelOpen | |
# DESCRIPTION | |
# open an excel file | |
# PARAMETERS | |
# para 1 - filename | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelOpen() | |
{ | |
my $file = $_[0]; | |
$g_excel = Win32::OLE->new('Excel.Application', 'Quit') or die "Oops, cannot start Excel"; | |
#Win32::OLE->Option(CP => Win32::OLE::CP_UTF8); | |
$curr_obj = $g_excel; | |
die "\n[ERROR] $file doesn't exist!\n" if (!(-e $file)); | |
$g_book = $g_excel->Workbooks->Open("$file"); | |
$g_sheet = $g_book->Worksheets(1); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetWorksheet | |
# DESCRIPTION | |
# set worksheet of excel file | |
# PARAMETERS | |
# para 1 - worksheet name | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetWorksheet() | |
{ | |
my $worksheet; | |
($worksheet) = @_; | |
$g_sheet = $g_book->Worksheets($worksheet); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelAddWorksheet | |
# DESCRIPTION | |
# add worksheet to excel file | |
# PARAMETERS | |
# para 1 - worksheet name | |
# para 2 - how to add? to right/left or rightest | |
# para 3 - name of reference worksheet | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelAddWorksheet() | |
{ | |
my $name; | |
my $cmd; | |
my $arg; | |
($name, $cmd, $arg) = @_; | |
$arg = $g_book->ActiveSheet->{Name} if ($arg eq ''); # set to current if empty | |
if ($cmd eq 'rightest') | |
{ | |
# add worksheet as rightest one | |
$g_book->Worksheets->add( | |
{After=>$g_book->Worksheets($g_book->Worksheets->{Count})})->{Name} = $name; | |
} | |
elsif ($cmd eq 'right') | |
{ | |
# add worksheet at the right of given worksheet | |
$g_book->Worksheets->add( | |
{After=>$g_book->Worksheets($arg)})->{Name} = $name; | |
} | |
else | |
{ | |
# add worksheet at the left of given worksheet | |
$g_book->Worksheets->add( | |
{Before=>$g_book->Worksheets($arg)})->{Name} = $name; | |
} | |
$g_sheet = $g_book->Worksheets($name); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelOpenText | |
# DESCRIPTION | |
# open a text file to excel | |
# PARAMETERS | |
# para 1 - text filename | |
# para 2 - delimiter character | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelOpenText() | |
{ | |
my $file = $_[0]; | |
my $delimiter = $_[1]; | |
$g_excel = Win32::OLE->new('Excel.Application', 'Quit') or die "Oops, cannot start Excel"; | |
#Win32::OLE->Option(CP => Win32::OLE::CP_UTF8); | |
$curr_obj = \$g_excel; | |
$g_book = $g_excel->Workbooks->Open($file, 0, 0, 6, 0, 0, 0, 2, $delimiter); | |
$g_sheet = $g_book->Worksheets(1); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSaveAs | |
# DESCRIPTION | |
# save as another excel file | |
# PARAMETERS | |
# para 1 - filename | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSaveAs() | |
{ | |
$g_book->SaveAs("$_[0]"); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelClose | |
# DESCRIPTION | |
# close excel file | |
# PARAMETERS | |
# none | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelClose() | |
{ | |
if ($g_excel_name ne "") | |
{ | |
$g_book->SaveAs("$g_excel_name"); | |
} | |
$g_book->Close(); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelWriteRow | |
# DESCRIPTION | |
# write data items to row | |
# PARAMETERS | |
# para 1 - row | |
# para 2 - start of col | |
# para 3 - reference to data array (e.g. \@abc) | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelWriteRow() | |
{ | |
my $row = $_[0]; | |
my $col = $_[1]; | |
my $data_ref = $_[2]; | |
foreach my $item (@$data_ref) | |
{ | |
excelSetFontAttr($g_sheet->Cells($row,$col)); | |
$g_sheet->Cells($row,$col)->{Value} = "$item"; | |
$col++; | |
} | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelWriteCol | |
# DESCRIPTION | |
# write data items to column | |
# PARAMETERS | |
# para 1 - start of row | |
# para 2 - column | |
# para 3 - reference to data array (e.g. \@abc) | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelWriteCol() | |
{ | |
my $row = $_[0]; | |
my $col = $_[1]; | |
my $data_ref = $_[2]; | |
foreach my $item (@$data_ref) | |
{ | |
excelSetFontAttr($g_sheet->Cells($row,$col)); | |
$g_sheet->Cells($row,$col)->{Value} = "$item"; | |
$row++; | |
} | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelWrite | |
# DESCRIPTION | |
# write a cell | |
# PARAMETERS | |
# para 1 - row | |
# para 2 - col | |
# para 3 - data | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelWrite() | |
{ | |
my $row = $_[0]; | |
my $col = $_[1]; | |
my $data = $_[2]; | |
excelSetFontAttr($g_sheet->Cells($row,$col)); | |
$g_sheet->Cells($row,$col)->{Value} = "$data"; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelRead | |
# DESCRIPTION | |
# read a cell | |
# PARAMETERS | |
# para 1 - row | |
# para 2 - col | |
# RETURNS | |
# data read | |
#****************************************************************************** | |
sub excelRead() | |
{ | |
my $row = $_[0]; | |
my $col = $_[1]; | |
return $g_sheet->Cells($row,$col)->{Value}; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelDelCol | |
# DESCRIPTION | |
# delete a column | |
# PARAMETERS | |
# para 1 - column to delete | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelDelCol() | |
{ | |
$g_sheet->Columns($_[0])->Delete; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelDelRow | |
# DESCRIPTION | |
# delete a row | |
# PARAMETERS | |
# para 1 - row to delete | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelDelRow() | |
{ | |
$g_sheet->Rows($_[0])->Delete; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelColAlignment | |
# DESCRIPTION | |
# set alignment to specified column | |
# PARAMETERS | |
# para 1 - column to set | |
# para 2 - alignment type (center, right, left) | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelColAlignment() | |
{ | |
my $col; | |
my $align; | |
my %alignHash = ('center' => xlCenter, 'right' => xlRight, 'left' => xlLeft); | |
($col, $align) = @_; | |
$g_sheet->Columns($col)->{HorizontalAlignment} = $alignHash{$align}; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelColAlignmentAll | |
# DESCRIPTION | |
# set alignment to all columns | |
# PARAMETERS | |
# para 1 - alignment type (center, right, left) | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelColAlignmentAll() | |
{ | |
my $col; | |
my $align; | |
my %alignHash = ('center' => xlCenter, 'right' => xlRight, 'left' => xlLeft); | |
($align) = @_; | |
$g_sheet->Cells->EntireColumn->{HorizontalAlignment} = $alignHash{$align}; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetTextOrientation | |
# DESCRIPTION | |
# set text orientation to specified cell | |
# PARAMETERS | |
# para 1 - row to set | |
# para 2 - column to set | |
# para 3 - degree | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetTextOrientation() | |
{ | |
my $row; | |
my $col; | |
my $degree; | |
($row, $col, $degree) = @_; | |
$g_sheet->Cells($row,$col)->{'Orientation'} = $degree; # background color | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelAutoFilter | |
# DESCRIPTION | |
# enable auto-filter for all data (usually used when all data are ready) | |
# PARAMETERS | |
# none | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelAutoFilter() | |
{ | |
$g_sheet->Cells->AutoFilter(); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelAutoFit | |
# DESCRIPTION | |
# set auto-fit to specified column | |
# PARAMETERS | |
# para 1 - column to set | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelAutoFit() | |
{ | |
$g_sheet->Columns($_[0])->AutoFit; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelAutoFitAll | |
# DESCRIPTION | |
# set auto-fit to all. | |
# note that this only works when there's already data in cells. | |
# PARAMETERS | |
# none | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelAutoFitAll() | |
{ | |
$g_sheet->Cells->EntireColumn->AutoFit; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetFontName | |
# DESCRIPTION | |
# set cell font name (e.g. Arial) | |
# PARAMETERS | |
# para 1 - font name | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetFontName() | |
{ | |
my $fontName; | |
($fontName) = @_; | |
$g_fontAttr{'Name'} = $fontName if ($fontName ne ""); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetFontSize | |
# DESCRIPTION | |
# set cell font size | |
# PARAMETERS | |
# para 1 - font size | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetFontSize() | |
{ | |
my $fontSize; | |
($fontSize) = @_; | |
$g_fontAttr{'Size'} = $fontSize if ($fontSize > 0); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetFontColor | |
# DESCRIPTION | |
# set cell font color | |
# PARAMETERS | |
# para 1 - font color name | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetFontColor() | |
{ | |
my $fontColor; | |
($fontColor) = @_; | |
$g_fontAttr{'ColorIndex'} = $g_fontColorHash{$fontColor} if (defined $g_fontColorHash{$fontColor}); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetFontBold | |
# DESCRIPTION | |
# set cell font bold | |
# PARAMETERS | |
# para 1 - font bold | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetFontBold() | |
{ | |
my $fontBold; | |
($fontBold) = @_; | |
$g_fontAttr{'Bold'} = $fontBold if ($fontBold =~ /[0-1]/); | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# setVisible | |
# DESCRIPTION | |
# write excel file | |
# PARAMETERS | |
# para 1 - visible (1) or not (0) | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub setVisible() | |
{ | |
$$curr_obj->{Visible} = 1; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelWrapText | |
# DESCRIPTION | |
# set wrap-text to specified column | |
# (use this when there's data in specified column) | |
# PARAMETERS | |
# para 1 - column to set | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelWrapText() | |
{ | |
$g_sheet->Columns($_[0])->{WrapText} = 1; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelWrapTextAll | |
# DESCRIPTION | |
# set wrap-text to all columns | |
# PARAMETERS | |
# none | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelWrapTextAll() | |
{ | |
$g_sheet->Cells->EntireColumn->{WrapText} = 1; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetColumnWidth | |
# DESCRIPTION | |
# set width of specified column | |
# PARAMETERS | |
# para 1 - column to set | |
# para 2 - width | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetColumnWidth() | |
{ | |
$g_sheet->Columns($_[0])->{ColumnWidth} = $_[1]; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetColumnWidthAll | |
# DESCRIPTION | |
# set width of all columns | |
# PARAMETERS | |
# para 1 - width | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetColumnWidthAll() | |
{ | |
$g_sheet->Cells->EntireColumn->{ColumnWidth} = $_[0]; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelShrinkToFit | |
# DESCRIPTION | |
# set shrink-to-fit to specified column | |
# PARAMETERS | |
# para 1 - column to set | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelShrinkToFit() | |
{ | |
$g_sheet->Columns($_[0])->{ShrinkToFit} = 1; | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# excelShrinkToFitAll | |
# DESCRIPTION | |
# set shrink-to-fit to all columns | |
# PARAMETERS | |
# noneß | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelShrinkToFitAll() | |
{ | |
$g_sheet->Cells->EntireColumn->{ShrinkToFit} = 1; | |
} | |
#****************************************************************************** | |
# Internal Data | |
#****************************************************************************** | |
#****************************************************************************** | |
# Program Start | |
#****************************************************************************** | |
1; # return success | |
#****************************************************************************** | |
# Internal Function | |
#****************************************************************************** | |
#****************************************************************************** | |
# FUNCTION | |
# excelSetFontAttr | |
# DESCRIPTION | |
# set cell font attributes | |
# PARAMETERS | |
# $oleObject_ref - reference to ole object, may be cells, range, rows, columns, etc. | |
# RETURNS | |
# none | |
#****************************************************************************** | |
sub excelSetFontAttr() | |
{ | |
my $oleObject_ref; | |
($oleObject_ref) = @_; | |
#$g_sheet->Cells($row,$col)->Interior->{'ColorIndex'} # background color | |
while (my ($key, $val) = each(%g_fontAttr)) | |
{ | |
$oleObject_ref->Font->{$key} = $val if ($val ne ""); | |
} | |
} | |
#****************************************************************************** | |
# FUNCTION | |
# trim | |
# DESCRIPTION | |
# trim left and right spaces | |
# PARAMETERS | |
# $str [IN] - string to process | |
# RETURNS | |
# processed string | |
#****************************************************************************** | |
sub trim() | |
{ | |
my $str; | |
($str) = @_; | |
$str =~ s/(^\s*)|(\s*$)//g; | |
return $str; | |
} |