2009-01-09 8 views

उत्तर

26

सबसे अच्छा तरीका है Spreadsheet::ParseExcel उपयोग करने के लिए है।

#!/usr/bin/perl -w 

use strict; 
use warnings; 

use Spreadsheet::ParseExcel; 

my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse('Book1.xls'); 

for my $worksheet ($workbook->worksheets()) { 

    my ($row_min, $row_max) = $worksheet->row_range(); 
    my ($col_min, $col_max) = $worksheet->col_range(); 

    for my $row ($row_min .. $row_max) { 
     for my $col ($col_min .. $col_max) { 

      my $cell = $worksheet->get_cell($row, $col); 
      next unless $cell; 

      print "Row, Col = ($row, $col)\n"; 
      print "Value  = ", $cell->value(),  "\n"; 
      print "Unformatted = ", $cell->unformatted(), "\n"; 
      print "\n"; 
     } 
    } 
} 

Excel फ़ाइल पर्ल से संदेश भेजने मैं excel2txt जो स्प्रेडशीट का उपयोग करता है की सलाह देते हैं :: ParseExcel बदलने के लिए:

यहाँ एक उदाहरण है।

7

मुझे Spreadsheet::ParseExcel का उपयोग करके बहुत अच्छा भाग्य मिला है।

+0

मुझे इसके रूबी बंदरगाह के साथ अच्छी किस्मत है –

4

'सर्वश्रेष्ठ' तरीका आदर्श रूप से हमारे प्रिय CPAN से मॉड्यूल का उपयोग करना होगा।

जब भी आपको कोई समस्या है तुरंत पूछें: मैंने अभी तक सीपीएएन क्यों नहीं देखा है?

कौन सा मॉड्यूल हालांकि मैं निश्चित नहीं हो सकता, यहां आपको एक प्रारंभ करने की सूची है, उन्हें आजमाएं, देखें कि क्या काम करता है।

1
@echo off 
ECHO CHECK THE VERSION FROM THE PROJECT 
    echo see also this [link][1] 
for /f "tokens=*" %%i in ('Type Version.txt') do set _Version=%%i 
ECHO The _Version is %_Version% 

ECHO remove the output html files 
del *.html /q 
ECHO remove the output log files 
del *.log /q 


::pause 
ECHO %0 > %0.log 
ECHO %0.error.log >%0.error.log 

set BaseDir=D:\perl\sfw\ExcelToHtml.%_Version% 
echo BaseDir is %BaseDir% 1>>%0.log 2>>%0.error.log 
ECHO. 


set LogLevel=3 
echo LogLevel is %LogLevel% 1>>%0.log 2>>%0.error.log 
ECHO. 


::set ExcelFileToParse="%BaseDir%\CoDA_ETL_Integration.xls" 
SET ExcelFileToParse="%BaseDir%\TODO.xls" 
echo ExcelFileToParse is %ExcelFileToParse% 1>>%0.log 2>>%0.error.log 
echo. 

set OutputDir=%BaseDir% 
echo OutputDir is %Outputdir% 1>>%0.log 2>>%0.error.log 
echo. 

ECHO SET THE UNICODE FOR PERL FOR UTF-8 
SET PERL_UNICODE=S 
ECHO %%PERL_UNICODE%% IS %PERL_UNICODE% 

::set PerlScript=parseExcelToCsv.pl 
set PerlScript=ExcelToHtml.pl 
echo PerlScript is %PerlScript% 1>>%0.log 2>>%0.error.log 
ECHO. 


echo Action !!! 1>>%0.log 2>>%0.error.log 
echo perl %BaseDir%\%PerlScript% %LogLevel% %ExcelFileToParse% %OutputDir% 1>>%0.log 2>>%0.error.log 
perl %BaseDir%\%PerlScript% %LogLevel% %ExcelFileToParse% %OutputDir% 1>>%0.log 2>>%0.error.log 

%0.error.log 
%0.log 

::debug pause 

use strict; 
use Spreadsheet::ParseExcel; 
use utf8 ; 
use Encode ; 


package ExcelToHtml ; 



my $DebugLevel = 3 ; 
print defined($ARGV[0]) ? $DebugLevel = $ARGV[0] : "Using max DebugLevel = $DebugLevel", " \n"; 
my $minimumAmountOfCommandLineArgs = 3 ; 
my ($ExcelFileToParse , $OutputDir , $BaseFileName) =(); 


sub main { 
    logMsg("$0 SCRIPT START " , 1); 
    #Action !!! call here methods 
    checkCommandLineArgs();  
    buildNames(); 

    ParseExcelAndlogMsgFiles ($ExcelFileToParse , $BaseFileName , $OutputDir) ; 

    logMsg("$0 SCRIPT STOP " , 1); 

} #eof MAIN 

sub buildNames 
{ 

    $ExcelFileToParse = "$ARGV[1]" ; 
    $OutputDir="$ARGV[2]" ; 
    $BaseFileName = $ExcelFileToParse ; 
    logMsg("\$ExcelFileToParse is $ExcelFileToParse") ; 
    logMsg ("\$OutputDir is $OutputDir") ; 
    logMsg ("\$BaseFileName is $BaseFileName \n"); 
    $BaseFileName =~ s/^(.*)(\\|\/)(.*)/$3/; #strip the directory part 
    logMsg ("\$BaseFileName is $BaseFileName "); 
    $BaseFileName =~ s/^(.*)(\.)(.*)/$1/ ; #strip the file extension 
    logMsg ("\$BaseFileName is $BaseFileName "); 


} #eof sub buildNames 


sub ParseExcelAndlogMsgFiles { 

my $ExcelFileToParse = shift ; 
my $BaseFileName = shift ; 
my $OutputDir = shift ; 
my $strToReturn = ""; 

my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->Parse("$ExcelFileToParse"); 

for my $worksheet ($workbook->worksheets()) { 

     my ($row_min, $row_max) = $worksheet->row_range(); 
     my ($col_min, $col_max) = $worksheet->col_range(); 

     for my $row ($row_min .. $row_max) { 
       my $rowStr = "" ; 
       for my $col ($col_min .. $col_max) { 

         my $cell = $worksheet->get_cell($row, $col); 
         next unless $cell; 

         logMsg (" Row, Col = ($row, $col)") ; 
         logMsg ("\$cell->encoding() is " . $cell->encoding()) ; 

         logMsg (" Value = ", $cell->value()); 
         $rowStr .= makeCell($cell->value())  ;    #The Value 

         logMsg ("Unformatted = ", $cell->unformatted()) ; 

       } #eof col 
      $rowStr = makeRow($rowStr); 
      $strToReturn .= $rowStr ; 
    } #eof for my row 

     my $worksheetName = $worksheet->{'Name'} ; 
     my $FileSheet = "$OutputDir/$BaseFileName" . '.' . $worksheetName . '.' . 'html' ; 
     $strToReturn = makeTable ($strToReturn); 
     $strToReturn = makeFile ($strToReturn); 
     logMsg ("\$strToReturn is $strToReturn ") ; 
     PrintToFile ($FileSheet, $strToReturn) ; 
     $strToReturn = "" ; 
     $FileSheet = "" ; 
     } #eof for my worksheet 

} #eof sub 


sub trim  
{ 
     $_[0]=~s/^\s+//; 
     $_[0]=~s/\s+$//; 
     return $_[0]; 
} 

# =========================================== eof sub trim 
# Action !!! 



sub makeRow 
{ 
    my $row = shift ; 
    return "<tr>" . $row . "</tr> \n" ; 
} 

sub makeCell 
{ 
    my $cell = shift ; 
    return "<td>" . "$cell" . " </td>" ; 
} 

sub makeTable 
{ 
    my $table = shift ; 
    return "\n <table> " . $table . "</table> \n" ; 

} 

sub makeFile 
{ 
    my $file = shift ; 

    $file = "<html> <head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/></head><body> $file </body></html>\n" ; 
    return $file ; 
} 


sub checkCommandLineArgs 
{ 

     if (@ARGV != $minimumAmountOfCommandLineArgs) 
     { 
      logErrorMsg ("Not enougn command line args supplied exit 1" , 1); 
      die "usage: $0 1 args \n" ; 
      exit 1 ; 
     } #eof if 
     else 
     { 
       foreach (@ARGV) { logMsg ("$_ ") ; } 
     } #eof else   if (@ARGV != 4) 


} #eof sub checkCommandLineArgs 

#log a message according to the DebugLevel 
sub logMsg 
{ 
    my $msg = shift ; 
    my $importance = shift ; 

    my $CurrentPerlScriptName = "$0" ; 
    my $niceMonth = GetANiceMonth(); 
    my $logFile = "$CurrentPerlScriptName" . '_' . "$niceMonth" . '.log' ; 
    $msg = GetANiceTime() .' --- ' . $msg . " \n" ; 

    if ($importance == 1) 
    { 
     $msg = "\n============================================================ \n" . $msg ; 
     $msg = $msg . "============================================================ \n" ; 
    } 


    #debug nothing 
    if ($DebugLevel == 0) { return ; } 

    #just logMsg the message 
    if ($DebugLevel == 1) 
    { 
     logMsg ($msg); 
    } #eof if ($DebugLevel == 1) 

    #logMsg the message in 
    if ($DebugLevel == 2) 
    { 
     #READ ALL ROWS OF A FILE TO ALIST 
     open (LOG, ">> $logFile") || print "could not open the \$logFile $logFile !!!\n"; 
     print LOG $msg ; 
     close LOG; 
    } 

    #logMsg the message in 
    if ($DebugLevel == 3) 
    { 
     #READ ALL ROWS OF A FILE TO ALIST 
     open (LOG, ">> $logFile") || print "could not open the \$logFile $logFile !!!\n"; 
     print LOG $msg ; 
     close LOG; 
     print $msg ; 
    } #eof if ($DebugLevel == 3) 


} #eof sub logMsg 

#log a message according to the DebugLevel 
sub logErrorMsg 
{ 
    my $errorMsg = shift ; 
    my $importance = shift ; 

    my $CurrentPerlScriptName = "$0" ; 
    my $niceMonth = GetANiceMonth(); 
    my $errorLogFile = "$CurrentPerlScriptName" . "_" . "$niceMonth" . '.error.log' ; 
    $errorMsg = GetANiceTime() .' --- ' . $errorMsg . " \n" ; 

     if ($importance == 1) 
     { 
      $errorMsg = "\n============================================================ \n" . $errorMsg ; 
      $errorMsg= $errorMsg. "============================================================ \n" ; 
     } 



    #debug nothing 
    if ($DebugLevel == 0) { return ; } 

    #just logMsg the message 
    if ($DebugLevel == 1) {  print $errorMsg ;  } 

    #logMsg the message in a error log file 
    if ($DebugLevel == 2) 
    { 
     #READ ALL ROWS OF A FILE TO ALIST 
     open (ERRLOG, ">> $errorLogFile") || print "could not open the \$errorLogFile $errorLogFile !!!\n"; 
     print ERRLOG $errorMsg ; 
     close ERRLOG; 
    } 

    #logMsg the message in 
    if ($DebugLevel == 3) 
    { 
     #READ ALL ROWS OF A FILE TO ALIST 
     open (ERRLOG, ">> $errorLogFile") || print "could not open the \$errorLogFile $errorLogFile !!!\n"; 
     print ERRLOG $errorMsg ; 
     close ERRLOG; 
     print $errorMsg ; 
    } #eof if ($DebugLevel == 3) 


} #eof sub logErrorMsg 


#GET A NICE TIME 
sub GetANiceTime { 
# Purpose: returns the time in yyyymmdd-format 
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
#---- change 'month'- and 'year'-values to correct format ---- 
$min = "0$min" if ($min < 10); 
$hour = "0$hour" if ($hour < 10); 
$mon = $mon + 1; 
$mon = "0$mon" if ($mon < 10); 
$year = $year + 1900; 
$mday = "0$mday" if ($mday < 10); 
return "$year\.$mon\.$mday" . "-" . "$hour\:$min\:$sec"; 
} #eof sub GetANiceTime 


sub GetANiceMonth { 
# Purpose: returns the time in yyyymmdd-format 
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
#---- change 'month'- and 'year'-values to correct format ---- 
$mon = $mon + 1; 
$mon = "0$mon" if ($mon < 10); 
$year = $year + 1900; 
return "$year\.$mon" ; 
} #eof sub GetANiceTime 



sub PrintToFile { 
my $FileOutput = shift ; 
my $StringToPrint = shift ; 
#READ ALL ROWS OF A FILE TO ALIST 
open (FILEOUTPUT, ">$FileOutput") || 
      print "could not open the \$FileOutput $FileOutput!\n"; 
print FILEOUTPUT $StringToPrint ; 
close FILEOUTPUT ; 

#debug $strToReturn .= $StringToPrint; 

} 
# =========================================== eof sub PrintToFile 



#Action !!! 
main(); 




1 ; 

__END__ 

#VersionHistory: 
#1.0. --- Yordan Georgiev --- Initial creation 
#1.1 --- Yordan Georgiev --- Added conditional logging 
+0

यह बैच फ़ाइलों और पर्ल की एक बड़ी गड़बड़ है। क्या आप इसे थोड़ा सा साफ कर सकते हैं और समझा सकते हैं कि प्रत्येक भाग –

+1

है यह कोड इतना पुराना है कि मुझे इसे खोजने के लिए वास्तव में मेरे जीमेल को Google करना था: https://code.google.com/archive/p/exceltohtml/downloads –

1

http://search.cpan.org/dist/Spreadsheet-Read/Read.pm

स्प्रेडशीट :: पढ़ें पारदर्शी रूप से किसी भी स्प्रेडशीट पढ़ सकते हैं और एक सार्वभौमिक तरीके से पार्स मॉड्यूल है कि वास्तविक स्प्रेडशीट स्कैनिंग करता है के स्वतंत्र में अपनी सामग्री वापस जाने के लिए कोशिश करता है।

+1

@ डीजे-एंड्री-एसएक्सई: एसओ में आपका स्वागत है। कृपया अधिक जानकारी शामिल करें कि यह मॉड्यूल क्यों विचार करने योग्य है (अन्य उत्तरों में सूचीबद्ध किसी अन्य के खिलाफ) – Jayan