Automatisation d'un travail au travail: Importation de texte Bullet PowerPoint dans une feuille Excel

StackOverflow https://stackoverflow.com/questions/1214452

Question

On m'a demandé d'automatiser une tâche particulière au travail aujourd'hui, qui prend beaucoup de temps! Ce qui suit est ce qui doit être fait et j'apprécierais toute aide sur la façon dont je peux le faire (conseils de mise en œuvre) dans les limites de mes connaissances, si possible.

Problème

J'ai un document PowerPoint (.ppt). Je voudrais extraire le texte à partir de là (le texte est au format balle). Je voudrais insérer ces points de puces dans une feuille Excel , chaque puce doit être une ligne. . J'aimerais également mettre dans la colonne adjacente la page à partir de laquelle ce texte a été repris.

Donc, en gros: Extrait de ppt - > Insérez dans une feuille Excel chaque ligne constituant une puce.

Technologies disponibles pour moi

Perl, PHP et Java.

Je préférerais préférer PHP , car c’est ma langue principale, mais je suis heureux d’envisager tout ce qui vous semble préférable. Deuxièmement, Perl, puis Java. Je ne veux pas compiler des classes et installer le JDK rien que pour ça! :)

Questions clés

  • Comment faites-vous référence à une puce?
  • Est-ce que je risque de me retrouver avec juste une charge de texte non structuré dans la feuille Excel?
  • Existe-t-il des obstacles à la lecture d'un fichier ppt?

Mettre à jour

Je considérerais les technologies MS (VB, etc.) si cela simplifie la vie, mais je ne les ai jamais utilisées et je méprise la technologie MS! J'espère que les évangélistes ne me flamberont pas! :)

Était-ce utile?

La solution

Voici un exemple de script utilisant Win32 :: OLE .

En passant, une fois que vous avez converti les diapositives en un format que vous pouvez traiter, vous pouvez utiliser Tableur :: WriteExcel sur les systèmes non-MS pour écrire le résultat. Par conséquent, je recommanderais deux programmes: l’un pour transformer les documents PowerPoint et l’autre pour générer les fichiers Excel.

Notez que le navigateur d’objets est une excellente source d’informations pour les applications Microsoft Office. Vous pouvez y accéder via Outils & # 8594; Macro & # 8594; Visual Basic Editor. Une fois dans l’éditeur, appuyez sur F2 pour parcourir les interfaces, méthodes et propriétés fournies par les applications Microsoft Office.

#!/usr/bin/perl

use strict;
use warnings;

use FindBin qw( $Bin );
use File::Spec::Functions qw( catfile );

use Win32::OLE;
use Win32::OLE::Const 'Microsoft PowerPoint';
$Win32::OLE::Warn = 3;

my $ppt = get_ppt();
$ppt->{Visible} = 1;

my $ppt_file = catfile $Bin, 'test.ppt';
my $doc = $ppt->Presentations->open( $ppt_file );
my $slides = $doc->Slides;
my $num_slides = $slides->Count;

for my $slide_idx (1 .. $num_slides) {
    print "=== Begin Slide $slide_idx ===\n";

    my $slide = $doc->Slides->Item( $slide_idx );
    my $shapes = $slide->Shapes;
    my $num_shapes = $shapes->Count;

    for my $shape_idx (1 .. $num_shapes) {
        my $shape = $shapes->Item($shape_idx);
        next unless $shape->HasTextFrame;

        my $pars = $shape->TextFrame->TextRange->Paragraphs;
        my $num_pars = $pars->Count;
        for my $par_idx (1 .. $num_pars) {
            my $par = $pars->Paragraphs($par_idx,1);
            print_par( $par );
        }
    }

    print "=== End Slide $slide_idx ===\n\n";
}

sub print_par {
    my ($par) = @_;
    my @bullets = qw( - * > + = @ );

    my $bullet_format = $par->ParagraphFormat->Bullet;
    my $bullet_type = $bullet_format->Type;

    my $bullet_char = '';

    if ($bullet_type == ppBulletNumbered) {
        $bullet_char = $bullet_format->Number . "\t";
    }
    elsif( $bullet_type == ppBulletUnnumbered ) {
        # Need a Unicode => ASCII mapping if you want to use
        # $bullet_format->Character
        my $indent = $par->IndentLevel % scalar @bullets;
        $bullet_char = $bullets[$indent] . "\t";
    }

    my $text = $par->Text;
    $text =~ s/\s+$//;

    print $bullet_char, $text,"\n";
}

sub get_ppt {
    my $app;
    eval {
        $app = Win32::OLE->GetActiveObject('PowerPoint.Application');
    };

    die "$@\n" if $@;

    unless($app) {
        $app = Win32::OLE->new(
            'PowerPoint.Application', sub { 

Voici un exemple de script utilisant Win32 :: OLE .

En passant, une fois que vous avez converti les diapositives en un format que vous pouvez traiter, vous pouvez utiliser Tableur :: WriteExcel sur les systèmes non-MS pour écrire le résultat. Par conséquent, je recommanderais deux programmes: l’un pour transformer les documents PowerPoint et l’autre pour générer les fichiers Excel.

Notez que le navigateur d’objets est une excellente source d’informations pour les applications Microsoft Office. Vous pouvez y accéder via Outils & # 8594; Macro & # 8594; Visual Basic Editor. Une fois dans l’éditeur, appuyez sur F2 pour parcourir les interfaces, méthodes et propriétés fournies par les applications Microsoft Office.

<*>[0]->Quit } ) or die "Oops, cannot start PowerPoint: ", Win32::OLE->LastError, "\n"; } return $app; }

Autres conseils

Cela peut être fait avec Perl. Pratiquement tout ce que vous pouvez faire avec VBA peut être fait avec Perl via Win32 :: OLE. J'ai utilisé le module Win32 :: OLE pour travailler avec des documents MS-Office, à la fois pour l'extraction et la création de contenu. Cela fait longtemps cependant. Commencez ici, http://win32.perl.org/wiki/index.php ? title = Win32_Perl_Modules à propos du milieu de la page.

La documentation VBA sur chacun des objets est utile pour référencer, trouver quels objets il y a, ainsi que les méthodes et propriétés disponibles.

Euh ... vous aurez du mal à gérer les fichiers MS Office avec Perl, PHP ou Java. Quand je devais faire l’automatisation pour les fichiers MS Office, j’utilisais le plus souvent VBA (Visual Basic pour Applications). Jetez un coup d'oeil. Pour beaucoup de choses, vous pouvez simplement enregistrer une macro, regarder le code produit et apprendre comment les choses sont référencées. Prenez ensuite des morceaux du code généré et créez vos propres modules et outils VBA. J'imagine qu'une telle fonctionnalité pourrait parfaitement constituer un complément pour Power Point.

Visual Basic pour applications n'est-il pas disponible? Cela devrait être intégré à Office et, puisque vous devenez Office-to-Office, cela pourrait être plus simple.

Vous pouvez utiliser l'application de présentation d'OpenOffice.org (Impress) pour importer le fichier Powerpoint. Vous pouvez ensuite l'exporter au format natif OpenOffice.org, XML. Vous devriez alors pouvoir analyser le XML en texte brut avec la langue de votre choix.

Comme d'autres personnes l'ont souligné, si vous souhaitez utiliser directement le format Powerpoint, vous devez utiliser un langage Microsoft (VB, VBA, C #, etc.).

Je pense que vous voudrez peut-être vous intéresser aux programmes qui convertissent un fichier PPT en fichier CSV, éventuellement avec PDF au centre? Une fois que les données sont au format CSV, vous pourrez peut-être les traiter par php / perl beaucoup plus facilement.

Effectuer cette opération à partir de zéro prendra beaucoup de temps, car les formats de document Office sont très compliqués en général.

Si vous avez le Framework Zend disponible, cela peut aider considérablement. Voir ici  pour une documentation utile. Voir ici pour écrire dans des fichiers Excel.

Cela ressemble beaucoup à ce que je fais au travail, bien que je travaille principalement dans Excel et Word. Votre meilleur pari serait d’utiliser VBA dans PowerPoint pour regarder chaque page et trouver les puces. Puis écrivez dans un fichier au format CSV, chaque puce sur une ligne différente, qui s’ouvrira dans Excel, chaque puce sur sa propre ligne.

Trouver ce qui est une balle et ce qui ne l’est pas pourrait être une astuce. Essayez d’enregistrer des macros en sélectionnant, en ajoutant et en supprimant des puces, et éventuellement en modifiant le niveau de quelques-unes. Cela devrait vous donner suffisamment d’informations sur les objets à rechercher et sur la manière de les utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top