スポンサーリンク

Ooo Calc Basicマクロで,ブックと同じフォルダ上でテキストファイルに書き込みするサンプルコード。シート上の情報をテキスト出力する最も簡単な方法

Excel/Wordオフィス製品のTipsまとめへ


OpenOffice.org CalcのBasicマクロで,テキストファイルに書き込みする一番簡単なサンプルコード。

テキストファイルは,ブックと同じフォルダ上に,自動的に新規作成される。

同名のファイルが既に存在する場合は,上書きされる。

' ブックと同じフォルダに
' テキストファイルを作成し書き込むテスト
Sub write_txt_file_test

	' 文字列構築
	br = Chr(13) ' 改行
	tb = Chr(9) ' タブ
	s = tb & "hoge" & br
	
	' 書き出し
	output_txt s, getThisWorkbookPath & "hoge.txt"
	
	msgbox "書き出しました。"
End Sub


' ファイル書き出し
Sub output_txt( s, output_path )
	'msgbox output_path

	' ファイルを開く。新規作成も上書きもOK
	fp = FreeFile 
	Open output_path For Output As #fp

	' 書き込み
	Print #fp, s

	' 終了
	Close #fp
End Sub
	

' このブックの存在するフォルダをフルパスで返す。
' Excel VBAでの ThisWorkbook.Pathに相当
Function getThisWorkbookPath

	' このブックのフルパスをURLとして取得
	encoded_url = ThisComponent.getURL
	
	' URLをWindows用のパスに変換
	windows_filepath = ConvertFromUrl(encoded_url )
	
	' ファイルパスからディレクトリパスを抽出
	windows_dir_path = file_path_to_dir_path(windows_filepath)

	getThisWorkbookPath = windows_dir_path
	
End Function


' ファイルのフルパスから,
' ファイルの存在するディレクトリのパスを
' Windowsの形式で抽出する。
' 末尾に\を含む文字列が返る。
Function file_path_to_dir_path(file_path)
	' 左から何文字分を抽出すればよいか
	str_length = 0
	
	' 何文字目に\があるか,という毎回の検索結果
	match_index = 1
	
	' \が見つかる限り検索を続ける
	Do While match_index <> 0
		
		' 前回見つかった位置よりも後で\を探す
		match_index = InStr(match_index + 1, file_path, "\")
		
		' \が見つかった場合
		If match_index <> 0 Then
			str_length = match_index
		End If
		
	Loop
	
	' ファイルパスから,左から指定文字数だけ抽出
	s = Left(file_path, str_length)
	
	file_path_to_dir_path = s

End Function

これを実行すると,ブックが保存されたフォルダ上にテキストが作成される。

シート上の情報をもとに外部ファイル出力する,とても便利な方法だ。


上記のコードは,「ブックの存在するフォルダパスを取得」という関数を使っている。
その関数については下記エントリを参照。

Ooo CalcのBasicマクロで,ブックの存在するフォルダのフルパスを取得する関数のサンプルコード。Excel VBAのThisWorkbook.Pathのように親ディレクトリを返す
http://computer-technology.hateblo.jp/entry/20150914/p2

  • OpenOffice.org のCalcで,ブックの保存されているフォルダのフルパスを一発で取得する関数のサンプルコード。 Excel VBAでの ThisWorkbook.Pathに相当する。


テキスト書き込みの処理は,基本的にはExcel VBAと同じだ。

ファイルハンドルを初期化してから開き,
そのハンドルに対してPrintするだけ。

ドキュメント作成を楽にするための,Excel VBA 頻出8パターン
http://language-and-engineering.hatenablog.jp/entry/20090401/p1#L167

  • (5)ファイル出力(書き込み)
    • ここで,入力よりも出力を先に持ってきたのには十分なわけがある。


ファイルおよびディレクトリ (OpenOffice.org 実行時ライブラリ) - Apache OpenOffice Wiki
https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Files_and_Directories_(Runtime_Library)

  • テキストファイルへの書き込み。
    • テキストファイルにアクセスするには、該当ファイルを事前にオープンしておく必要があります。
    • その際には、フリーのファイルハンドルを使って、アクセスするファイルを特定します。
  • フリーのファイルハンドルを作成するには、FreeFile 関数を使用します。
    • このハンドルは、Open 命令によるファイルオープン時にパラメータとして指定します。


ファイル書き込み時にエラーメッセージが表示されるケースもある。

Windows上で書き込み権限のないフォルダを指定していたり,
書き込み先のファイルパスが間違っているのが原因だ。

faq/5/407 - OpenOffice.org Q&A
http://oooug.jp/faq/index.php?faq%2F5...

  • エラーとして「デバイスI/Oエラー」というのも表示された
    • 書き込みができなかったことを示しています。
  • c:\ではなく、たとえば書き込み権限のある「C:\Users\(ユーザー名)」以下に変更すれば、マクロは動作します。


ここで紹介したのは,ファイル書き込みの一番原始的な方法。

ファイル書き込みのための便利オブジェクトは色々存在する。

OOoBasic/Generic/textfile - ...?
http://hermione.s41.xrea.com/pukiwiki...

  • com.sun.star.ucb.SimpleFileAccess サービスを利用したファイルへのアクセス
    • com.sun.star.io.TextInputStream サービスを利用することで, テキストファイルを読み込むことができます。
  • 書き込みには com.sun.star.io.TextOutputStream サービスを利用します。

注意点

ひとつ注意点がある。

それは,OOo Basicでは,文字列変数の長さに上限があるということ。

65535文字を超える長さの文字列は存在できない。

それ以上の長さの内容を代入しようとすると,空文字列になってしまう。


なので,冒頭のコードを実行する際にも注意が必要だ。

ファイルに保存したい文字列の内容が長すぎると実行できない。

その場合,文字列を変数に保存せず,
その都度ファイルに段階的に書き込むようにすればよい。

文字列変数 - Apache OpenOffice Wiki
https://wiki.openoffice.org/wiki/JA/D...

  • OpenOffice.org Basic では、文字列変数を Unicode で保存します。
  • 1 つの文字列変数には、最大 65535 文字を格納できます。


Extensions development basic ja - Apache OpenOffice Wiki
https://wiki.openoffice.org/wiki/Exte...

  • 文字列変数は 65535 文字のユニコード文字を格納できます


Excel/Wordオフィス製品のTipsまとめへ