「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:4402
現在:2


特定シートのCSV形式保存

ページOpenOffice.org FAQの登録ページ
投稿者もり
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-05-07 16:44:34 (木)
OSWindows XP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

お世話になります。

複数シートから構成されるCalcファイルの 1シートのみをCSVファイル形式で保存するマクロを作成したいのですが マクロの記録で得たコードをもとに下記の関数を作成しました。

Sub subWriteCSV

  dim document   as object
  dim dispatcher as object
  
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(2) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "URL"
  args1(0).Value = "file:///C:/K%E7%99%BE/a.csv"
  args1(1).Name = "FilterName"
  args1(1).Value = "Text - txt - csv (StarCalc)"
  args1(2).Name = "FilterOptions"
  args1(2).Value = "44,0,60,1"
	
  dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())

End Sub

実際に動かしてみると 警告メッセージ 「警告ドキュメントa.csvの保存の際アクティブなシートだけが保存されました。」 が表示されてしまいます。

CSVファイルに出力するシートの、シートインデックスの値を指定し 確認メッセージが表示されないようにするには どのようにした良いのでしょうか?

ご教示よろしくお願いいたします。


無題

tani (2009-05-07 17:20:13 (木))

保存にはstoreAsURL()メソッドを使ってください。
シートをアクティブにするにはsetActiveSheet()メソッドを使ってください。

無題

tani (2009-05-07 17:34:25 (木))

ちょっと淡白すぎるかなと思ったので、追記しときます。それぞれのメソッドの仕様は、
http://api.openoffice.org/
のAPIリファレンスにあります。ただここは人を突き放す感じのストイック(笑)なページですので、
「OOo Basic storeAsURL」とか「OOo Basic setActiveSheet」とかでググってみてください。
英語の検索結果も表示するようにするとサンプルコードがかなりヒットすると思います。
ちなみにstoreAsURLに渡すFilter設定とかは上のマクロ記録でとれたものが、ほとんどそのままのように見えますので有効活用すると結構簡単にできると思います。

こんなのもどうでしょう

M.Kamataki (2009-05-07 17:43:39 (木))

sub subWriteCSV

dim oDoc   as object
dim dispatcher as object
oDoc   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 2

dispatcher.executeDispatch(oDoc, ".uno:JumpToTable", "", 0, args1())

oDoc = ThisComponent
Dim args(1) As New com.sun.star.beans.PropertyValue
args(0).Name = "FilterName"
args(0).Value = "Text - txt - csv (StarCalc)"
args(1).Name = "FilterOptions"
args(1).Value = "44,0,60,1"

oDoc.storeToURL(ConvertToUrl("c:\text.csv"),args())

end sub

なんとなく無駄なコードもある気がしますが、とりあえず動くマクロになったので投稿します。

Dispatchの".uno:JumpToTable"を使っている部分は「マクロの記録」です。上記の場合は、2番目のシートにジャンプしています。

CSVの書き出しは以下のWebページを参考にしています。

http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FCalc%2FCSV
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs%2F110

保存時のメソッドは"storeToURL"と"storeAsURL"では微妙に違うみたいですが、実際に実行してみると、どちらも既存のファイルがあると上書きされます。

質問とは関係ありませんが、ソースコードを投稿する際、それぞれの行の先頭に半角スペースを挿入すると良いと思います。詳しくはPukiWikiの「テキスト整形のルール」の「整形済みテキスト」をご覧ください。デザインが崩れることなく投稿できます。

"storeToURL"が良いようです

M.Kamataki (2009-05-07 18:07:15 (木))

わかりました。"storeAsURL"だと、マクロを実行したファイルが"text.csv"のような名前に変更されちゃいました。つまり出力したCSVファイルを読み込んでいる状態にCalcがなってしまうので、これはまずいと思います。わたしは"storeToURL"が良いと思います。

無題

tani (2009-05-07 18:26:20 (木))

storeAsURLとstoreToURLの違いは
http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XStorable.html
に載ってます。ようするにstoreAsURLがファイル→名前をつけて保存でstoreToURLがファイル→エクスポートになるはずみたいです。(現在の機能的な差異は厳密ではなく鎌滝さんが指摘されている動作くらいでしょうか。)
確かに鎌滝さんがおっしゃるように「oDoc = ThisComponent」の場合はstoreToURLのほうが都合がよいと思います。また「oDoc = StarDesktop.LoadComponentFromURL(fugafuga)」みたいな感じで始まる場合は、storeAsURLのほうが都合がよいことが多いと思います。

あとSheetをアクティブにする部分のコードはマクロ記録のものを使うよりもsetActiveSheet()メソッドを使った方がすっきりかけます。

無題

もり (2009-05-07 18:38:54 (木))

ありがとうございます。
大変勉強になります。

皆様にご教示頂いた内容をもとに
下記の関数を作成し、正常に処理できるようになりました。
ありがとうございました。

'---
Sub subWriteCSV(sFilename as string)

 Dim oSheet as object
 Dim args(1) As New com.sun.star.beans.PropertyValue

 oSheet = ThisComponent.getSheets().getByIndex(3)
 ThisComponent.CurrentController.setActiveSheet (oSheet)

 args(0).Name = "FilterName"
 args(0).Value = "Text - txt - csv (StarCalc)"
 args(1).Name = "FilterFlags"
 args(1).Value = "UTF8"
 ThisComponent.storeToURL(ConvertToUrl(sFilename), args())

End Sub

'---

無題

もり (2009-05-07 18:41:39 (木))

関数がバラバラになってしまいました(;△;)
見づらい投稿になってしまい申しわけございません。

完了にします

M.Kamataki (2009-05-07 21:36:03 (木))

もりさん、サンプルコードをありがとうございます。なお、コード表示の部分を直しました。空行のところも行頭に半角スペースを入れておけば、バラバラになりません。

無題

もり (2009-05-09 14:20:19 (土))

Kamataki様

修正ありがとうございます。
不慣れで申し訳ありません。
以後、気を付けます。

お名前:
題名: