Автоматизация работы на работе: импорт текста маркера Powerpoint в лист Excel - PullRequest
4 голосов
/ 31 июля 2009

Сегодня меня попросили автоматизировать определенную задачу на работе, которая отнимает у нас много времени! Вот что нужно сделать, и я был бы признателен за любую помощь в том, как я могу это сделать (Советы по внедрению) в рамках моих знаний, если это возможно.

Проблема

У меня есть документ PowerPoint (.ppt). Я хотел бы извлечь текст оттуда (текст в формате маркера). Я хотел бы вставить эти маркеры в лист Excel , каждая точка маркера должна быть строкой. Я также хотел бы поместить в соседний столбец страницу, с которой был взят этот пункт.

Итак, в основном: Извлечь из ppt -> Вставить в лист Excel каждую строку, являющуюся точкой маркера.

Доступные мне технологии

Perl, PHP и Java.

Я бы предпочел бы честно сказать PHP , так как это мой основной язык, но я с удовольствием рассмотрю все, что вы, ребята / девочки, считаете лучшим Второй будет Perl, а затем Java. Я не хочу собирать классы и устанавливать JDK только для этого! :)

Ключевые вопросы

  • Как вы ссылаетесь на точку с маркером?
  • Могу ли я в конечном итоге просто загрузить неструктурированный текст на листе Excel?
  • Существуют ли какие-либо препятствия для чтения из файла ppt?

Обновление

Я бы рассмотрел технологии MS (VB и т. Д.), Если это облегчает жизнь, но я никогда не использовал ее и презираю технологию MS! Надеюсь, меня не разжигают евангелисты! :)

Ответы [ 8 ]

8 голосов
/ 01 августа 2009

Это можно сделать с помощью Perl. Практически все, что вы можете сделать с VBA, можно сделать с помощью Perl через Win32 :: OLE. Я использовал модуль Win32 :: OLE для работы с документами MS-Office, как для извлечения, так и для создания контента. Это было какое-то время. Начните здесь, http://win32.perl.org/wiki/index.php?title=Win32_Perl_Modules около середины страницы.

Документация VBA по каждому из объектов полезна для справки, для определения, какие объекты существуют, а также методов и свойств, доступных для них.

7 голосов
/ 01 августа 2009

Вот пример сценария с использованием Win32 :: OLE .

Кстати, после того, как вы преобразовали слайды в формат, который вы можете обрабатывать, вы можете использовать Spreadsheet :: WriteExcel в не-MS системах для записи вывода. Поэтому я бы порекомендовал две программы: одну для преобразования документов PowerPoint и другую для создания файлов Excel.

Обратите внимание, что отличным источником информации для приложений Microsoft Office является Object Browser. Вы можете получить к нему доступ через Сервис & rarr; Макро & rarr; Редактор Visual Basic. Попав в редактор, нажмите F2 , чтобы просмотреть интерфейсы, методы и свойства, предоставляемые приложениями 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 { $_[0]->Quit }
        ) or die "Oops, cannot start PowerPoint: ",
                 Win32::OLE->LastError, "\n";
    }
    return $app;
}
7 голосов
/ 31 июля 2009

Пух ... вам будет сложно работать с файлами MS Office, используя Perl, PHP или Java. Когда мне приходилось выполнять автоматизацию файлов MS Office, я чаще всего использовал VBA (Visual Basic для приложений). Посмотрите на это. Для многих вещей вы можете просто записать макрос, взглянуть на полученный код и узнать, как на него ссылаются. Затем возьмите фрагменты сгенерированного кода и создайте свои собственные модули и инструменты VBA. Я мог предположить, что такая функциональность может идеально подходить в качестве надстройки для Power Point.

1 голос
/ 01 августа 2009

Это очень похоже на то, что я делаю на работе, хотя я работаю в основном в Excel и Word. Лучше всего будет использовать VBA в PowerPoint для просмотра каждой страницы и поиска маркеров. Затем запишите файл в формате CSV, каждый маркер в отдельной строке, который откроется в Excel, и каждый маркер в отдельной строке.

Найти то, что является пулей, а что нет, может быть обманом. Попробуйте записать некоторые макросы выбора, добавления и удаления маркеров, и, возможно, изменить уровень нескольких. Это должно дать вам достаточно информации о том, какие объекты нужно искать и как с ними можно работать.

1 голос
/ 31 июля 2009

Если у вас есть Zend Framework, это может значительно помочь. Смотрите здесь для полезной документации. См. Здесь для записи в файлы Excel.

1 голос
/ 31 июля 2009

Я думаю, вы, возможно, захотите взглянуть на программы, которые конвертируют из PPT в файл CSV, возможно, с PDF в середине? Когда данные в формате CSV, вы сможете обрабатывать их с помощью php / perl гораздо проще.

Создание этого с нуля займет очень много времени, поскольку форматы документов Office в целом очень сложны.

1 голос
/ 31 июля 2009

Вы можете использовать приложение презентации OpenOffice.org (Impress) для импорта файла Powerpoint. Затем вы можете экспортировать его в собственный формат OpenOffice.org, который является XML. После этого вы сможете анализировать простой текстовый XML на выбранном вами языке.

Как уже отмечали другие люди, если вы хотите работать с форматом Powerpoint напрямую, вам действительно нужно использовать язык Microsoft (VB, VBA, C # и т. Д.).

1 голос
/ 31 июля 2009

Visual Basic для приложений недоступен для вас? Это должно быть встроено в Office, и, поскольку вы переходите из Office в Office, это может быть проще.

...