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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


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


処理時間短縮について

ページOpenOffice.org FAQの登録ページ
投稿者タイガー
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-12-11 18:30:51 (土)
OSWin XP
依存するページ
バージョン
edit/refer

メッセージ

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

いつもお世話になっております。 クエリーで取得したデータをカルクに書き込む時、 1レコードを配列に一旦代入して、一気にカルクに書き込む様にしております。 約3万行でテストした結果、Forの所で処理がかなり掛っています。 最後のoRange.setDataArray(ss)シートへの書き込みはすぐに処理されます。

エクセルVBAの場合は、.CopyFromRecordset dbRes で一気にシートに書き込む事ができますが、 OOoBasicで最も同様な事が出来ないでしょうか? 早く書き出す方法は他にないでしょうか? アドバイス宜しくお願い致します。

OOoBasicの場合

	Set cn = New ADODB.Connection
	Set dbRes = New ADODB.Recordset
	cmd = CreateObject("ADODB.Command")
	
	With cn
		.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0"
		.Open mdbURL
	End With

	cmd.ActiveConnection = Cn
	cmd.CommandTimeout = 0
	cmd.CommandText = "SELECT * FROM " & mdbTableName
	dbRes = cmd.Execute

	dim ss(mdbRecotdCount-1,Ubound(mdbFildName)) 'フィールドのレコード数とフィールド名の個数を指定
	If dbRes.RecordCount <> 0 Then
	If dbRes.Eof = false Then
		dbRes.MoveFirst
		Do Until dbRes.EOF
			For i=0 To Ubound(mdbFildName)
				ss(No,i) = dbRes.Fields.Item(mdbFildName(i)).Value
			Next i
			dbRes.MoveNext
			No = No +1
		Loop
	End if
	End if
	
	oRange = oSheet.getCellRangeByPosition(0,1,Ubound(mdbFildName),mdbRecotdCount)
	oRange.setDataArray(ss)
	

’---------------------------------------------------------------------

エクセルVBAの場合:

	Dim dbCon As ADODB.Connection
	Dim dbRes As ADODB.Recordset
	Dim m_Rane As Range
	
	’〜〜処理
	Set dbRes = dbCon.Execute("SELECT * FROM " & m_TableName )

	'フィールド書き込み
	For i = 1 To dbRes.Fields.Count
		m_Rane.Offset(0, i - 1) = dbRes.Fields(i - 1).Name 'フィールド名書き込み
	Next i

	m_Rane.Offset(1, 0).CopyFromRecordset dbRes

	'〜〜処理

方法は幾つかあります

ike@九州 (2010-12-12 14:03:51 (日))

新規シートでA1から固定で項目名ありで良ければ

cmd.CommandText= "SELECT * INTO [Excel 8.0;Database=" & _
"E:\target.xls" & "].[hogehoge] FROM " & テーブル名又はSELECT文 & ";"

上記で Excel 無くても target.xls ファイルが新規作成(シート名hogehoge)されるので、Calc で開けば OK。

もし雛形 Calc ドキュメントの指定位置に書式設定を壊さないで書き込みたいなら
・非表示で上記の xls ファイルを開く
・必要な範囲を getDataArray でデータ取得
・雛形 Calc へ setDataArray で挿入
・非表示 Calc を閉じる

OOo の場合、登録データベース名指定から doImport メソッドで、
保存クエリや新規 SQL で Calc の指定位置に瞬時挿入できますが、項目名必ず挿入され、元の書式はすり替えられます。
なのでセルの書式は再設定の必要が出てくるという仕様です。

Rs.getRows() で取得した配列をそのまま Calc へ SetDataArray 挿入すると
テキストは OK、日付型はダメ、数値は OK、通貨型はダメでした。
クエリで日付型を Double 、通貨型を Long へ変換した結果なら OK かもしれません。

試してみました(その他方法等有りましたら教えて下さい)

タイガー (2010-12-12 17:29:00 (日))

有難う御座います。
まず、書式については、MDBファイルの内容に置き換わって方が良いです。
エクセルファイルがPCにインストールされていない場合がありますので、CSVとして対応します。

PCの環境によりますが、2万行データで試してみました
doImportで行った場合、約75秒。
CSVファイルへ出力してから指定のodsファイルへ書き出した場合、約50秒
結論△諒が若干早かったです。
下記にザックリコード記載しておりますが、その他の方法等あるのでしょうか?
念の為´△離魁璽匹鬟競奪リではありますが記載しております。

また、△両豺腓僚饉粟瀋蠅悩い辰討い泙后
aFileProperties(1).Value = "44,34,0,1"の後の設定フラグをフィールド数分追加する事
一つはCSVへ出力する時に、schema.iniが出来るみたいなのでここから情報を取った方が良いのでしょうか?
その他、良い方法が有りましたらアドバイスお願いいたします。

'.ぅ鵐檗璽箸両豺隋1分15秒

	args1(0).Name = "DatabaseName"
	args1(0).Value = oTitle		'データベース登録した名前
	args1(1).Name = "SourceType"
	args1(1).Value = com.sun.star.sheet.DataImportMode.TABLE
	args1(2).Name = "SourceObject"
	args1(2).Value = "テーブル名"
	
	Set oSM = CreateObject("com.sun.star.ServiceManager")
	Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
	Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, args1())
	Set oSheet = oDoc.Sheets.getByName("Sheet1")
	oSheet.getCellRangebyName("A1").doImport(args1())	
	

一旦csvファイルとして保存してcsvファイルを開き、コピーして対象シートに貼り付ける場合 50秒

	'MDBからCSVへ
	sql = "SELECT * INTO [TEXT;Database=" & CsvPath & "].[" & CsvFileName & "] FROM [" & mdbTableName & "];"
	Set cn = New ADODB.Connection
	Set rs = New ADODB.Recordset
	With cn
		.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0"
		.Open mdbURL
	End With
	rs.Open sql,cn,1,2
	
	’SCVファイルを開き
	aFileProperties(0).Name = "FilterName"
	aFileProperties(0).Value = "Text - txt - csv (StarCalc)"
	aFileProperties(1).Name = "FilterOptions"
	aFileProperties(1).Value = "44,34,0,1"	'フィールド数分のフラグ必要
	oDoc = StarDesktop.loadComponentFromURL(ConvertToUrl(oURL),"_blank", 0, aFileProperties())
	
	'開いたCSVファイルをコピーして
	oSheet = csvDoc.getSheets().getByIndex(0)
	oRange = oSheet.getCellRangeByName("A1")
	oCursor = oSheet.createCursorByRange(oRange)
	oCursor.collapseToCurrentRegion
	oCursor.gotoEndOfUsedArea(true)
	DataArray() = oSheet.getCellRangeByPosition(0, 0, oCursor.getColumns.Count, oCursor.getRows.Count).getDataArray()
	
	'書き込み
	odsSheet.getCellRangeByPosition(x, y, oCursor.getColumns.Count + x, oCursor.getRows.Count + y).setDataArray(DataArray)

追加です エクセルの方がCSVより良かったです

タイガー (2010-12-12 17:56:43 (日))

CSVへ出力を下記に置き換えてやりましたら、何とかなりそうですね

cmd.CommandText= "SELECT * INTO [Excel 8.0;Database=" & _
"E:\target.xls" & "].[hogehoge] FROM " & テーブル名又はSELECT文 & ";"

後、日付型と通貨型が今の所使いませんので・・・
処理時間もCSVと変わりませんでした。

完了にしたいと思います

M.Kamataki (2010-12-13 10:17:58 (月))

タイガーさん、どうでしょうか。

完了お願い致します

タイガー (2010-12-13 15:40:09 (月))

有難う御座いました

お名前:
題名: