Преобразование .xlsx в xml в Perl - PullRequest
1 голос
/ 04 марта 2011

Я пытаюсь преобразовать файл .xlsx в файл .xml. Первая строка (заголовок) файла .xlsx станет тегами файла XML.

Я написал ниже код, который работает нормально -

 open(XML, ">temp.csv") or die "not able to open $!";

 use Spreadsheet::XLSX;
 my $excel = Spreadsheet::XLSX -> new ('test.xlsx');

 foreach my $sheet (@{$excel -> {Worksheet}}) {
         $sheet -> {MaxRow} ||= $sheet -> {MinRow};
         foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) {
                $sheet -> {MaxCol} ||= $sheet -> {MinCol};
                foreach my $col ($sheet -> {MinCol} ..  $sheet -> {MaxCol}) {
                        my $cell = $sheet -> {Cells} [$row] [$col];
                        if ($cell) {
                           print XML $cell -> {Val};
                        }
                        unless($col == $sheet -> {MaxCol}) {print XML ",";} 
                }
                unless( $row == $sheet -> {MaxRow}){print XML "\n";}
         }
  }
 close(XML);
 use XML::CSV; 
 my $csv_obj = XML::CSV->new(); 
    $csv_obj->parse_doc("temp.csv", {headings => 1});
    $csv_obj->print_xml("out.xml");

Может кто-нибудь предложить лучший код (Модуль), так как мне приходится обрабатывать большие файлы .xlsx.

Заранее спасибо.

Человек

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Если ваш код работает, то зачем вам что-то лучше? Если это только для скорости, вам нужно найти способ, чтобы избежать записи временного файла .csv. Файл ввода-вывода идет медленно, и вы пишете, а затем перечитываете и разбираете. Разве вы не можете прочитать данные в хеш, а затем сбросить их в файл XML, используя что-то вроде XML::Simple или любой другой модуль XML в CPAN? Снова написание CSV, перечитывание, повторный анализ и написание XML будут медленными!

1 голос
/ 17 марта 2011

Есть ли у вас доступ к Windows box с Excel 2007 или выше? Тогда вы могли бы сделать что-то вроде:

my $excel = Win32::OLE->new( 'Excel.Application' )
  or die "Could Not Start Excel.\n";
$excel->{ 'Visible' }           = 0;
$excel->{ DisplayAlerts }       = 0;

my $workbook = $excel->Workbooks->Open( 'test.xlsx' );

#save as Spreadsheet XML (46)
# 51 = xlsx, more mappings here: http://www.datapigtechnologies.com/downloads/Excel_Enumerations.txt
$workbook->SaveAs( $output_file, 46 );
$workbook->Close();
$excel->Quit();
0 голосов
/ 11 июля 2013

На githup существует проект по разработке облегченного XLSX ридера .В настоящее время он находится в каком-то альфа-состоянии, но работает.Вы можете попробовать, если хотите.

...