2011-02-15 5 views
0

À l'origine, j'ai essayé d'ouvrir un fichier XML avec Excel. Mais comme cela prend beaucoup de temps j'ai analysé le XML moi-même dans un fichier texte délimité par des tabulations. Je pensais avoir trouvé la bonne syntaxe sur internet. J'ai essayé le code ci-dessous en utilisant les valeurs que j'ai enregistrées avec une macro Excel. J'ai un fichier délimité par des tabulations de 18 colonnes. L'erreur apparaît dans la dernière ligne du code ci-dessous lors de l'appel de la méthode "Worksheets".Comment ouvrir un fichier texte délimité par des tabulations dans Excel en utilisant Perl et OLE?

Message d'erreur: Impossible d'appeler la méthode "Worksheets" sans référence de colis ou objet à la ligne ./PostProcessingDev.pl 70.

use Win32::OLE; 
use Win32::OLE::Const 'Microsoft Excel'; 
Win32::OLE->Option(Warn => 3); 

use strict; 

my $Excel; 
my $Sheet; 
my $Workbook; 


$Excel = CreateObject OLE "Excel.Application"; 

$Workbook = $Excel->Workbooks->OpenText({Filename =>"$inSelf->{'TXT'}", 
    Origin => xlMSDOS, 
    StartRow => 1, 
    DataType => xlDelimited, 
    TextQualifier => xlDoubleQuote, 
    ConsecutiveDelimiter => "False", 
    Tab => "True", 
    Semicolon => "False", 
    Comma => "False", 
    Space => "False", 
    Other => "False", 
    FieldInfo => [[1, xlTextFormat], 
    [2, xlTextFormat], 
    [3, xlTextFormat], 
    [4, xlTextFormat], 
    [5, xlTextFormat], 
    [6, xlTextFormat], 
    [7, xlTextFormat], 
    [8, xlTextFormat], 
    [9, xlTextFormat], 
    [10, xlTextFormat], 
    [11, xlTextFormat], 
    [12, xlTextFormat], 
    [13, xlTextFormat], 
    [14, xlTextFormat], 
    [15, xlTextFormat], 
    [16, xlTextFormat], 
    [17, xlTextFormat], 
    [18, xlTextFormat]], 
    TrailingMinusNumbers => "True"}); 

$Sheet = $Workbook->Worksheets(1); 

Répondre

2

Avez-vous vraiment analyser TSV à l'aide Exceller? S'il n'y a rien de fantaisie dans vos fichiers, vous pourriez bien utiliser quelque chose comme ceci:

my $file = 'some tsv file'; 
{ 
    open my $in,"<",$file or die "$file: $!"; 
    while(<$in>) { 
     chomp; 
     my @cols = split /\t/; 
     # do something with columns in @cols array 
    } 
} 

Si Excel est nécessaire pour une raison que je ne vois pas, le problème est que OpenText méthode retourne Vrai/Faux et non objet Workbook. Cela fonctionne:

use strict; 

use Win32::OLE; 
use Win32::OLE::Const 'Microsoft Excel'; 
use Data::Dump;  # for dd 

Win32::OLE->Option(Warn => 3); 

my $Excel = Win32::OLE->new("Excel.Application"); 
$Excel->Workbooks->OpenText({ 
    Filename    => 'enter the full path to file', 
    Origin    => xlMSDOS, 
    StartRow    => 1, 
    DataType    => xlDelimited, 
    TextQualifier  => xlDoubleQuote, 
    Tab     => "True", 
    TrailingMinusNumbers => "True" 
}); 

my $Sheet = $Excel->ActiveWorkbook->Worksheets(1); 
my $Data = $Sheet->UsedRange()->{Value}; 

dd $Data; # arrayref (rows) of arrayrefs (columns) 
+0

Vous ne devez pas analyser les fichiers xSV par des séparations/expressions rationnelles. Identique à CSV, utilisez un module approprié (Texte: CSV_CS) – DVK

+0

Merci pour votre réponse rapide. Non, je n'utilise pas Excel comme analyseur. La partie d'analyse que j'ai écrite moi-même comme je ne peux ni utiliser ni installer les mudules requis. Je fais tout à l'intérieur des tableaux Pearl. Le TSV ainsi que le fichier Excel est la sortie. Comme l'écriture Excel Cell by Cell est de ralentir (dizaines de milliers de lignes) par rapport à l'ouverture d'un TSV, je veux juste ouvrir le TSV et le stocker comme Excel. En essayant votre code sur un fichier texte à 4 lignes, il reste dans la méthode OpenText. Comment puis-je voir ce qui se passe? Puis-je déboguer les méthodes OLE? – user617474

+0

Je n'ai pas bien compris ce que vous voulez. Si vous écrivez CSV avec l'extension .CSV, Excel est associé et est capable de l'ouvrir directement. Par débogage 'OLE', c'est un peu compliqué, mais vous pouvez mettre' $ Excel -> {Visible} = 1; 'après l'initialisation et vous pouvez voir ce qui se passe dans Excel. – bvr

0

essayez d'utiliser Text::CSV. il prend en charge les délimiteurs définis par l'utilisateur. Voir la description du module.

0

Merci du tout pour vos réponses. Cela a résolu mon problème. Tout ce que je voulais faire avec la méthode OpenText était de convertir un fichier TSV en Excel car c'est le format de résultat dont j'ai besoin. Comme je ne pouvais pas trouver une solution sur le Web avant de fournir le code complet:

use Win32::OLE; 
use Win32::OLE::Const 'Microsoft Excel'; 
use strict; 

Win32::OLE->Option(Warn => 3); 

my $FileName = "Complete Path of TSV File"; 

my $Excel = Win32::OLE->new("Excel.Application"); 

# Open Tab separated Text file in Excel, all 18 columns are "Text" formated 
$Excel->Workbooks->OpenText({ 
    Filename  => $FileName, 
    Origin  => xlMSDOS, 
    StartRow  => 1, 
    DataType  => xlDelimited, 
    TextQualifier => xlDoubleQuote, 
    Tab   => "True", 
    FieldInfo  => [[1, xlTextFormat], 
    [2, xlTextFormat], 
    [3, xlTextFormat], 
    [4, xlTextFormat], 
    [5, xlTextFormat], 
    [6, xlTextFormat], 
    [7, xlTextFormat], 
    [8, xlTextFormat], 
    [9, xlTextFormat], 
    [10, xlTextFormat], 
    [11, xlTextFormat], 
    [12, xlTextFormat], 
    [13, xlTextFormat], 
    [14, xlTextFormat], 
    [15, xlTextFormat], 
    [16, xlTextFormat], 
    [17, xlTextFormat], 
    [18, xlTextFormat]], 
    TrailingMinusNumbers => "True" 
}); 

my $Sheet = $Excel->ActiveWorkbook->Worksheets(1); 
$Sheet->Activate; 

my $Workbook = $Excel->ActiveWorkbook; 

# Replace the "*.txt" file extension by "*.xls" for Excel 
$FileName =~ s/txt$/xls/; 

# Turn off the "This file already exists" message. 
$Excel->{DisplayAlerts} = 0; 
# Save file as Excel 2000-2003 Workbook (command for Excel 2007) 
$Workbook->SaveAs({Filename => $FileName, FileFormat => xlExcel8}); 
$Excel->Quit; 
Questions connexes