Top > OOobbs3 > 36

OOobbs3/36 Edit

  • サマリ: CSV読込からの帳票作成マクロ
  • 環境: Calc
  • 状態: 解決
  • 投稿者: efui?
  • 投稿日: 2010-11-11 (木) 16:20:28

質問 Edit

こちらで勉強させて頂いている初心者です。 現在、ダイアログ形式でのファイル指定可能な CSV読込みタイプの帳票作成に挑んでおります。

少しずつ進めて、新規フレームに内容を吐く事には成功したのですが、 そこで手詰まりしてしまいました。。。

狙っている結果としましては、 イベントをキックしたメインのシートの帳票レイアウトに沿って、 開始位置指定で値を埋め込んでいきたいのですが、 うまくいかず手詰まり状態になってしまています。 方法についてご助言頂けたら非常に助かります。 宜しくお願いします。

<以下 作成中のコード>

Sub CsvInputButton_Click
	
	Dim oFilePicker As Object
	Dim nDlgResult As Integer
	Dim sFiles() As String
	Dim sFilename As String
	Dim sFilepath As String
	Dim aFileProperties(1) As New com.sun.star.beans.PropertyValue
	Dim csvLine As String
	'dialogs.FilePicker でダイアログが使える
	oFilePicker =     createUnoService("com.sun.star.ui.dialogs.FilePicker")
	
	' 保存するダイアログの場合、このように設定
	'oFilePicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))
	
  	' ダイアログの初期化
	oFilePicker.appendFilter( "CSVファイル (*.csv)", "*.csv" )
	oFilePicker.setCurrentFilter( "CSVファイル (*.csv)" )
 	'If(G_OptionID = 1) Then
	'	oFilePicker.setDefaultName("SearchResultList.csv")
	'End If
	oFilePicker.setTitle("取込みファイルの指定")
	
	'ダイアログ表示
	nDlgResult = oFilePicker.execute()
	' 開く(OK)が押された場合は、1が返される
	IF nDlgResult <> 1 Then
		'キャンセル押下
 		Exit Sub
	END IF
	sFiles() = oFilePicker.getFiles()
	sFilename = sFiles(0)
	msgbox sFilename
	sFilepath  = ConvertFromURL( sFilename)
	msgbox sFilepath
	
	aFileProperties(0).Name = "FilterName"
	aFileProperties(0).Value = "Text - txt - csv (StarCalc)"
	aFileProperties(1).Name = "FilterOptions"
	'【①区切り文字】カンマ:44、タブ:9、セミコロン:59、スペース:32
	'【②引用符】ダブルクォート:34、シングルクォート:39、無し:省略
	'【③文字コード】OS標準:0、Unicode(UTF-16):65535、UTF-7:75、
	'                     UTF-8:76、EUC-JP:69、ISO-2022-JP:72、Shift_JIS:64
       '【④データ開始行】
	'【⑤以降、列ごとの書式】標準は1、文字列は2、MDY形式の日付は3、
	' DMY形式の日付は4、YMD形式の日付は5、無視する(読み込まない)列は9
	aFileProperties(1).Value = _
	"44,34,0,29,1/9/2/9/3/9/4/9/5/9/6/9/7/9/8/9/9/9/10/9/"	
StarDesktop.loadComponentFromURL(ConvertToUrl(sFilepath), "_blank", 0, aFileProperties())

回答 Edit

  • シートの一部分に CSV ファイルからのデータを埋め込むというわけですね。次のようにして範囲を CSV ファイルにリンクした後、そのリンクを削除するとデータだけが残り、挿入したような感じになります。
Sub insertAtCsv
 oDoc = ThisComponent
 oAreaLInks = oDoc.AreaLinks
 
 aCellAddr = CreateUnoStruct("com.sun.star.table.CellAddress")
 With aCellAddr
   .Sheet = 0
   .Column = 1
   .Row = 2
 End With
 
 sURL = "file:///home/asuka/Desktop/out.csv"
 ' リンクを作成
 oAreaLInks.insertAtPosition(aCellAddr, sURL, "A1:G10", _
     "Text - txt - csv (StarCalc)", "44,34,0,1,1")
 ' 作成したリンクを削除
 nIndex = oAreaLInks.getCount() - 1
 oAreaLInks.removeByIndex(nIndex)
End Sub

insertAtPosition メソッドの引数は次のとおりです。

  • データをリンクする位置を示す左上のセルのアドレス
  • リンク先ドキュメントファイル URL
  • リンク先ドキュメントでの範囲名 (範囲アドレス、名前付き範囲、データベース範囲)
  • フィルタ名
  • フィルタオプション

挿入 - 外部へリンクで CSV ファイルを選択すると範囲が選択できずに挿入できませんが、API から行う場合には上記のように適当にセル範囲を指定してやると挿入できます。

リンク先が CSV ファイルの場合には名前付き範囲やデータベース範囲がありません。一方で、セル範囲アドレスでの指定は行えます。このときに指定するアドレスは CSV ファイル内のデータ範囲より大きくても構いません。CSV ファイルのデータに無い範囲のセルは空に上書きされます。

  • はにゃ? &{2010-11-11 (木) 18:29:21};

早速のご回答、ありがとうございます。 ファイルのリンクを行う事に関してはばっちりでした。 ありがとうございます。 しかし、設定の仕方が悪いのか、全角文字の項目が文字化けしてしまいます。

oAreaLInks.insertAtPosition(aCellAddr, sURL, "A1:G10", _
     "Text - txt - csv (StarCalc)", "44,34,0,1,1")

頂いたサンプルコードでは"44,34,0,1,1"部分でいう”0”部分が文字コードかと思い、 いろいろと変更して試してみたのですがダメでした。

フィルタオプション設定値は、loadComponentFromURL()とは別物なのでしょうか。。。

あと、ド素人質問で申し訳ないのですが、リンクしたデータを貼付時点で開始位置だけではなく、 指定セル埋め込みにする事は、出来ないですよね・・・?(汗) 一旦、一時シート的な所にご教授頂いたリンク形式で貼り付けたものを取得しなおし、 貼り付けるような方法でいけるのか?と仮定して調べてみようと思っておるところです。

重ね重ねで申し訳ありませんが、宜しくお願いしますm(__)m

  • efui2010-11-12 (金) 14:13:30
  • どうやら文字コードだけでなく区切り文字なども認識してくれません。オプションが利用されていないんだと思います。指定セル埋め込みというのは、CSVからのデータをばらばらの位置に入力したいということだと思いますが、API 関数の呼び出し一度では無理ですね。 -- はにゃ? 2010-11-12 (金) 19:04:47
  • はにゃ?さん。 ありがとうございました。もう少し粘ってみます! セルへの貼付も一時ワークシートを介しての方法を模索してみます。ありがとうございました。 -- efui 2010-11-15 (月) 09:10:52

感想,コメント,メモ Edit



Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes