Frage

Was ist eine gute Möglichkeit, eine OpenOffice -Tabelle in Perl zu erstellen und zu lesen?

War es hilfreich?

Lösung

Ich denke, dass das Open Office native Dokumentformat auf den Opendocument -Spezifikationen basiert und basic ein mit Reißverschluss komprimiertes XML -Format ist. Da Sie wahr sind, könnten Sie es wahrscheinlich mit Ihren Perl XML -Manipulationstools der Wahl manipulieren.

Alternativ gibt es das Open Office Opendocument Connector Suite von Modulen auf der CPAN Dies bietet eine API auf hoher Ebene für die OpenDocument -Spezifikation.

Meines Wissens sollten die Tabellenmethoden in diesen Modulen sowohl das Lesen als auch das Schreiben von Daten in OO -Calc -Dokumenten ermöglichen.

Andere Tipps

ich benutzte OpenOffice :: Oocbuilder zum Erstellen großer farbcodierter Tische. Mochte es sehr. Für einfachere Aufgaben verwende ich häufig ein einfaches CSV -Format, das von jedem Tabellenkalkulationsprogramm leicht geöffnet wird

Sie könnten jedoch das Excel -Zeug für die Kompatibilität mit anderen Menschen ausgewählt.

OpenOffice unterstützt eine Reihe von Formaten, wenn Sie nach etwas suchen, das Excel-kompatible Tabellenkalkulationen lesen/schreiben kann Tabelle :: Parseexcel zum Lesen und Tabelle :: WriteExcel zum Schreiben. Ich habe sie beide benutzt, sie sind ziemlich reif und funktionieren gut.

Dies ist mit Version 2.4, da die neueste Version instabil ist. Es funktioniert jedoch manchmal mit dem neuesten. Auf diese Weise können Echtzeit -DDE -Funktionen in CALC anstatt Dateien zu manipulieren. Dies verwendet Cygwin Perl auf XP, sollte aber mit anderen arbeiten. Ich möchte nur sagen, dass die Excel VBA -Programmierapi 10 -mal besser und 10 -mal weniger verwirrend ist. Das ist ziemlich schlimm.

Code

use Win32::OLE;

Win32::OLE->Option(Warn => 3); # Turn on warnings for easier debugging

#Win32::OLE->GetActiveObject
# Get the currently running process or create a new one
$objServiceManager = Win32::OLE->GetActiveObject("com.sun.star.ServiceManager") || Win32::OLE->new("com.sun.star.ServiceManager") || die "CreateObject: $!"; 

$Stardesktop = $objServiceManager->createInstance("com.sun.star.frame.Desktop");

# $Stardesktop->terminate();exit; # will kill ALL OpenOffice docs!!!
# Doc = StarDesktop.loadComponentFromURL(sURL, "_default", 0, aMediaDesc)

$propValue[0] = $objServiceManager->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$propValue[0]->{Name} = "Hidden"; # This does not work!
$propValue[0]->{Value} = 1;

#Open the file and update its links if you have DDE links in your file
$propValue[1] = $objServiceManager->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$propValue[1]->{Name} = "UpdateDocMode";
$propValue[1]->{Value} = 3; # com.sun.star.document.UpdateDocMode.FULL_UPDATE

$calc = $Stardesktop->loadComponentfromUrl("file:///C:/Documents and Settings/Chloe/Desktop/MyFile.ods", "MyCalc", 0, \@propValue );
# load a new blank spreadsheet
$calc = $Stardesktop->loadComponentFromURL( "private:factory/scalc", "_blank", 0, [] );

# How to hide, as loading the document hidden does not work.
$calc->getCurrentController->getFrame->getContainerWindow()->setVisible(0);

$oSheet = $calc->getSheets->getByIndex(0);

# how to execute an UNO command, such as menu items
# http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_2.x_Commands
$frame = $calc->getCurrentController->getFrame;
$dispatchHelper = $objServiceManager->createInstance("com.sun.star.frame.DispatchHelper");
$dispatchHelper->executeDispatch(
    $frame, 
    ".uno:CalculateHard",
    #".uno:UpdateAll", 
    #".uno:UpdateAllLinks", 
    #".uno:DataAreaRefresh",
    "_self",
    0,
    []
);


$row = 5;
$cellValue = $oSheet->getCellByPosition(0, $row)->getString(); # get a cell value

# sort in decending order
$range = $oSheet->getCellRangeByName("A1:P$row");
$fields[0] = $objServiceManager->Bridge_GetStruct("com.sun.star.table.TableSortField");
$fields[0]->{Field} = 7; # column number
$fields[0]->{IsAscending} = 0;
$unoWrap = $objServiceManager->Bridge_GetValueObject;
$unoWrap->Set ("[]com.sun.star.table.TableSortField", \@fields);
$sortDx = $range->createSortDescriptor();
$sortDx->[0]->{Name} = "ContainsHeader";
$sortDx->[0]->{Value} = 1;
$sortDx->[3]->{Name} = "SortFields";
$sortDx->[3]->{Value} = $unoWrap;
#$sortDx->[3]->{Value} = \@fields; # You would think this would work? It doesn't.
$range->sort($sortDx);


# create a new sheet to paste to
$calc->getSheets->insertNewByName("NewSheet", 1 );
$sheet2 = $calc->getSheets->getByIndex(1);
$calc->CurrentController->Select($sheet2);

# copy row
$pasteHere = $sheet2->getCellByPosition(0, 0)->CellAddress;
$copyRange = $oSheet->getCellRangeByName("A1:Q1")->RangeAddress;
$oSheet->copyRange($pasteHere, $copyRange);

$cellValue = $sheet2->getCellByPosition(16, $row)->getValue()); # get cell value as integer
$date = $sheet2->getCellByPosition(5, $row)->getString(); # must get dates as strings

$calc->getCurrentController->getFrame->getContainerWindow()->setVisible(1); # set visible
$calc->close(0); # close program window
#print Win32::OLE->LastError, "\n";

/Code

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top