表
Writer の表を取り扱ってみます。 テーブルコンテナオブジェクト
Writer ドキュメントの表はテキストテーブルコンテナにひとまとめにされて管理されています。このオブジェクトはドキュメントオブジェクトからアクセスすることができます。 TextTable プロパティーまたは getTextTables メソッドを使用してオブジェクトを取得します。 Sub texttables Dim oDoc As Object Dim oTables As Object oDoc = ThisComponent oTables = oDoc.TextTables End Sub この,テーブルコンテナオブジェクトは次のようなメソッドを持ち,このコンテナに属する表へのアクセスなどに使用します。
表オブジェクト
表オブジェクトはテキストテーブルコンテナオブジェクトにひとまとめにしてあります。そこから一つずつ取得します。 テーブルコンテナオブジェクトから個別の表へのアクセスはインデックスまたは名前で行います。 表へインデックスでアクセスするためには, getByIndex メソッドを使用します。 また,名前でアクセスするには getByName メソッドを使用します。 表のインデックスは表を挿入した順に振られます。 Sub texttable Dim oDoc As Object Dim oTables As Object Dim oTable As Object oDoc = ThisComponent oTables = oDoc.TextTables If oTables.hasElements Then oTable = oTables.getByIndex(0) End If End Sub 上記のコードでは一つ目の表のオブジェクトを取得しています。表が一つもなければこのコードは動作しません。 たとえば,一番最後に挿入した表を取得するには,インデックスを工夫して,つぎのようにすればいいかもしれません。 oTable = oTables.getByIndex(oTables.getCount() -1) 挿入
新しい表の作成はドキュメントオブジェクトから新しく com.sun.star.text.TextTable サービスをインスタンス化して利用します。 新しい表の挿入の手順は次のとおりです。順番が違うとうまくいかないことがあるので注意。
Sub insert_table_1 oDoc = ThisComponent oText = oDoc.getText() oTable = oDoc.createInstance("com.sun.star.text.TextTable") oTable.setName("NewTable") oTable.initialize(5,4) oText.insertTextContent(oText.getEnd(), oTable, True) border = oTable.TableBorder bline = border.TopLine bline.OuterLineWidth = 0 border.TopLine = bline oTable.TableBorder = border End Sub 幅の変更
表の HoriOrientation を変更したのち、幅や余白を変更します。デフォルトの HoriOrientation の値は FULL です。
oTable.HoriOrientation = com.sun.star.text.HoriOrientation.NONE oTable.LeftMargin = 1000 oTable.RightMargin = 1000 列区切位置の変更
列の区切り位置は TableColumnSeparators で指定します。全体の幅は TableColumnRelativeSum プロパティで指定された値であり、そのうち列数 -1 の列の相対幅を指定します。最後の列は残りの幅になります。 列が二つの時には区切りはひとつです。 Dim aTCS(0) As New com.sun.star.text.TableColumnSeparator aTCS(0).Position = 3000 aTCS(0).IsVisible = True oTable.TableColumnSeparators = aTCS また、デフォルトの TableColumnRelativeSum は 10000 なので上記では 3:7 に分けられます。 並べ替え
Calc のセル範囲のような並べ替えの機能が Writer の表でもサポートされていますが,これも利用してみます。 条件
並べ替えには,並べ替えを指定するための条件が必要です。ここでは,条件を設定してみます。 createSortDescriptor メソッドを使用して並べ替えのために必要な条件を設定する,記述子を作成します。また,一から作成することもできますが,このメソッドを使用した方が簡単です。 oDesc() = oTable.createSortDescriptor() このメソッドで取得することのできる記述子の初期並べ替え条件などについて下の表に示します。
この表にある index は createSortDescriptor メソッドによって戻される配列のインデックスです。この index に対応する配列の要素にそのプロパティーが収納されています。 たとえば,次のようにして IsSortColumns のプロパティー値を変更,アクセスします。。 oDesc(2).Value = true 実際,この配列は .beans.PropertyValue struct の配列です。そのため,それぞれの要素は, Name および Value のプロパティーを持っています。 それぞれのプロパティーの名前を確認するときには Name プロパティーを使用します。 MsgBox oDesc(2).Name
この条件のなかで, SortFields は他のものとすこし違い,配列として戻されます。これは,並べ替えるときの列や行指定が複数あるものを一つにまとめてあるためです。これについては次で説明します。 フィールド
Writer の表では MaxSortFieldsCount の示すとおりに,指定することのできるフィールドは 3 つなので, SortFields の配列も要素数は 3 です。 SortFields ではつぎの項目を設定します。
Dim aLocale As New com.sun.star.lang.Locale aLocale.Language = "ja" 'Japanese aLocale.Country = "JP" 'JAPAN 上記のコードでは言語を "日本語" ,国を "日本" に設定しています。ロケールの設定は com.sun.star.lang.Locale struct を使用して行われます。 Language element は言語を文字列で http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
使用することのできる CollatorAlgorithm を調べる方法については補足に書きます。 実際にフィールドを変更するには次のような感じになります。 oDesc() = oTable.createSortDescriptor() oFields() = oDesc(4).Value 'Index of Fields is 4. With oFields(0) .Field = 1 .FieldType = com.sun.star.table.TableSortFieldType.ALPHANUMERIC .IsAscending = true .CollatorAlgorithm = "phonetic (alphanumeric first)" End With With oFields(1) .Field = 2 .FieldType = com.sun.star.table.TableSortFieldType.ALPHANUMERIC .IsAscending = true .CollatorAlgorithm = "phonetic (alphanumeric first)" End With フィールドを二つ使用して,一つ目の条件に 2 列目,昇順,読み (英数字を先) を指定し,二つ目の条件に 2 列目,昇順,読み (英数字を先) を指定しています。 並べ替えの実行
実際に条件を用いて並べ替えを実行するには sort メソッドを使用します。 Sub texttable_sort Dim oDoc As Object Dim oTables As Object Dim oTable As Object Dim oDesc() As Object oDoc = ThisComponent oTables = oDoc.TextTables oTable = oTables.getByIndex(0) oDesc() = oTable.createSortDescriptor() oTable.sort(oDesc()) End Sub ただ並べ替えを実行してみるのなら上記のコードのようになります。条件を指定するための oDesc() を引数にとって sort メソッドを呼び出します。 実際に使用するときには条件を変更してから並べ替えを実行します。 高さの変更
行の高さの変更は行コンテナから個別の行を取り出して行います。 Sub table_10 oTables = ThisComponent.getTables() oTable = oTables.getByIndex(0) oRows = oTable.getRows() oRow = oRows.getByIndex(0) oRow.SizeType = com.sun.star.text.SizeType.FIX oRow.Height = 2000 End Sub SizeType を FIX に変更した後高さを指定します。また、MIN を指定すると最小高さに、VARIABLE にすると最適な高さになります。 補足
CollatorLocale についての補足です。CollatorLocale で使用することのできるアルゴリズムを調べるには, .i18n.Collator サービスを利用します。 このサービスの XCollator インターフェースのメソッド listCollatorAlgorithms を使用します。 Sub collator Dim oCollator As Object Dim aAlgorithms() As String oCollator = createUnoService("com.sun.star.i18n.Collator") aAlgorithms() = oCollator.listCollatorAlgorithms(aLocale) For i = 0 To Ubound(aAlgorithms()) Msgbox aAlgorithms(i) Next i End Sub 表のアンカー
表が配置されているアンカーは取得しても、カーソルの位置を示すテキスト範囲オブジェクトとして利用できません。 表オブジェクトはテキストコンテンツとして有効なので、それを利用してどうにかします。 表のキャプション
ODT ファイル以外から作成したドキュメントではインポート時には表のキャプションにフィールドを使うことができません。タグなどを挿入しておいて次のようにして置換するといった方法が必要です。 以下の例では [tagid] を Table 1. といった形式に置換します。数字は表番号付けフィールドです。 Sub ReplaceCaptionTagWithNumbering sTableCaptionTag = "[tagid]" sTableCaptionPrefix = "Table " sTableCaptionSuffix = ". " oDoc = ThisComponent oFieldMaster = oDoc.getTextFieldMasters().getByName( _ "com.sun.star.text.fieldmaster.SetExpression.Table") oDesc = oDoc.createSearchDescriptor() oDesc.SearchString = sTableCaptionTag oText = None oCursor = None oRange = None oRanges = oDoc.findAll(oDesc) For i = 0 To oRanges.getCount() - 1 step 1 oField = oDoc.createInstance( _ "com.sun.star.text.textfield.SetExpression") oField.NumberFormat = 4 ' Arabic 'oField.IsFixedLanguage = False oField.attachTextFieldMaster(oFieldMaster) oRange = oRanges.getByIndex(i) oText = oRange.getText() oCursor = oText.createTextCursorByRange(oRange) ' replace tag with prefix oRange.setString(sTableCaptionPrefix) ' numbering field oText.insertTextContent(oCursor, oField, False) ' put suffix oText.insertString(oCursor, sTableCaptionSuffix, False) Next End Sub 表を置換
表自体を置換して取り除きたい場合には、表のアンカーは役に立たないので次のようにして表の前か後ろにテキストコンテンツを挿入してから、表を削除することで置き換えられます。 Sub ReplaceTable ReplaceTableWithString("hoge") End Sub Sub ReplaceTableWithString(sText) oDoc = ThisComponent oText = oDoc.getText() oCursor = oText.createTextCursor() oTables = oDoc.getTextTables() For i = oTables.getCount() -1 To 0 step -1 oTable = oTables.getByIndex(i) oParagraph = oDoc.createInstance("com.sun.star.text.Paragraph") oParagraph.setString(sText) oText.insertTextContentAfter(oParagraph, oTable) oText.removeTextContent(oTable) Next End Sub |