4

Perl で OpenOffice スプレッドシートを作成して読み取る良い方法は何ですか?

4

4 に答える 4

10

オープン オフィスのネイティブ ドキュメント形式は、OpenDocument 仕様に基づいており、基本的には zip 圧縮された XML 形式であると思います。これが本当なら、お好みの perl XML 操作ツールを使用しておそらく操作できます。

あるいは、OpenDocument 仕様に高レベルの API を提供するOpen Office OpenDocument Connector モジュール スイートが CPANにあります。

私の知る限り、これらのモジュールのテーブル メソッドは、OO Calc ドキュメントのデータの読み取りと書き込みの両方を許可する必要があります。

于 2008-11-10T15:41:24.550 に答える
5

大きな色分けされたテーブルを作成するためにOpenOffice::OOCBuilderを使用しました。とても気に入りました。より単純なタスクには、スプレッドシート プログラムで簡単に開くことができるプレーンな CSV 形式をよく使用します。

ただし、他の人との互換性のために Excel のものを選択する場合があります。

于 2008-11-10T15:32:00.637 に答える
3

OpenOfficeは、Excel互換のスプレッドシートを読み書きできるものを探している場合は、さまざまな形式をサポートしています。読み取りにはSpreadsheet :: ParseExcelを、書き込みにはSpreadsheet:: WriteExcelを確認してください。私は両方を使用しました、それらはかなり成熟していてうまく機能します。

于 2008-11-10T15:14:14.993 に答える
1

最新バージョンは不安定であるため、これはバージョン2.4の場合です。時々ですが、最新のもので動作します。これにより、ファイルを操作するのではなく、CalcでリアルタイムのDDE機能を使用できるようになります。これはXPでCygwinPerlを使用していますが、他のユーザーと連携するはずです。Excel VBAプログラミングAPIは、10倍優れており、混乱が10倍少ないと言いたいだけです。それはかなり悪いです。

[コード]

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";

[/コード]

于 2010-05-06T10:05:59.580 に答える