Top > OOoBasic > Writer > table

Edit

Writer の表を取り扱ってみます。

テーブルコンテナオブジェクト Edit

Writer ドキュメントの表はテキストテーブルコンテナにひとまとめにされて管理されています。このオブジェクトはドキュメントオブジェクトからアクセスすることができます。

TextTable プロパティーまたは getTextTables メソッドを使用してオブジェクトを取得します。

Sub texttables
Dim oDoc As Object
Dim oTables As Object
  oDoc = ThisComponent
  
  oTables = oDoc.TextTables
End Sub

この,テーブルコンテナオブジェクトは次のようなメソッドを持ち,このコンテナに属する表へのアクセスなどに使用します。

boolean hasElements ( void )表があるかどうか
void getByName (
string name )
名前で表のオブジェクトを戻す
[]string getElementNames ( void )すべての表の名前を配列にして戻す
boolean hasByName (
string name )
名前の表があるかどうか
long getCount ( void )表の数を戻す
void getByIndex (
long index )
インデックスの表のオブジェクトを戻す

表オブジェクト Edit

表オブジェクトはテキストテーブルコンテナオブジェクトにひとまとめにしてあります。そこから一つずつ取得します。 テーブルコンテナオブジェクトから個別の表へのアクセスはインデックスまたは名前で行います。

表へインデックスでアクセスするためには, 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)

挿入 Edit

新しい表の作成はドキュメントオブジェクトから新しく com.sun.star.text.TextTable サービスをインスタンス化して利用します。

新しい表の挿入の手順は次のとおりです。順番が違うとうまくいかないことがあるので注意。

  1. com.sun.star.table.TextTable サービスをインスタンス化
  2. setName メソッドで表名を設定する
  3. initialize メソッドで行、列サイズを初期化 (設定) する
  4. insertTextContents メソッドでドキュメントに挿入する
  5. 枠線などを設定する
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

幅の変更 Edit

表の HoriOrientation を変更したのち、幅や余白を変更します。デフォルトの HoriOrientation の値は FULL です。

com.sun.star.text.HoriOrientation説明
NONE0余白で幅が決定
RIGHT1
CENTER2中央
LEFT3
INSIDE4
OUTSIDE5
FULL6行幅
LEFT_AND_WIDTH7幅指定で左余白位置に
oTable.HoriOrientation = com.sun.star.text.HoriOrientation.NONE
oTable.LeftMargin = 1000
oTable.RightMargin = 1000

列区切位置の変更 Edit

列の区切り位置は 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 に分けられます。

並べ替え Edit

Calc のセル範囲のような並べ替えの機能が Writer の表でもサポートされていますが,これも利用してみます。

条件 Edit

並べ替えには,並べ替えを指定するための条件が必要です。ここでは,条件を設定してみます。

createSortDescriptor メソッドを使用して並べ替えのために必要な条件を設定する,記述子を作成します。また,一から作成することもできますが,このメソッドを使用した方が簡単です。

oDesc() = oTable.createSortDescriptor()

このメソッドで取得することのできる記述子の初期並べ替え条件などについて下の表に示します。

propertyvalueindexdescription
IsSortInTablefalse0表の内容または段落のセクションを並べ替えるかどうか
Delimiter321段落の選択範囲を並べ替えるときの列を分割する区切り文字
IsSortColumnstrue2列または行で並べ替える
MaxSortFieldsCount33並べ替えに使用することのできるフィールドの最大数
SortFields4並べ替えに使用するフィールドについて

この表にある index は createSortDescriptor メソッドによって戻される配列のインデックスです。この index に対応する配列の要素にそのプロパティーが収納されています。

たとえば,次のようにして IsSortColumns のプロパティー値を変更,アクセスします。。

oDesc(2).Value = true

実際,この配列は .beans.PropertyValue struct の配列です。そのため,それぞれの要素は, Name および Value のプロパティーを持っています。

それぞれのプロパティーの名前を確認するときには Name プロパティーを使用します。

MsgBox oDesc(2).Name
  • IsSortInTable Delimiter に指定した文字で並べ替えるかどうかを指定する。
  • Delimiter は段落を並べ替えるときに区切り文字として使用する文字の文字コード
  • IsSortColumns は列で並べ替えるときは true を,行で並べ替えるときには false
  • MaxSortFieldsCount 並べ替えで使用することのできるフィールドの最大数で,現在のバージョンでは 3 です。これは読み込むことしかできません。

この条件のなかで, SortFields は他のものとすこし違い,配列として戻されます。これは,並べ替えるときの列や行指定が複数あるものを一つにまとめてあるためです。これについては次で説明します。

フィールド Edit

Writer の表では MaxSortFieldsCount の示すとおりに,指定することのできるフィールドは 3 つなので, SortFields の配列も要素数は 3 です。

SortFields ではつぎの項目を設定します。

Properties of object com.sun.star.table.TableSortField
long Field並び替えのためのフィールドのインデックス
boolean IsAscending昇順で並べ替えるかどうか
boolean IsCaseSensitive大文字と小文字を区別するかどうか
long FieldType並べ替えフィールドのキーの種類
.lang.Locale CollatorLocale並べ替えの際の言語
string CollatorAlgorithm並べ替えのアルゴリズム
  • Field は列もしくは行のインデックス (0 から) を指定します。
  • IsAscending は昇順で true ,降順で false を指定します。
  • IsCaseSensitive は大文字と小文字を区別するときは true ,区別しないときは false を
  • FieldType は並べ替えのときのキーで,どの規則にしたがって順に並べ替えるかをしています。指定は,.table.TableSortFieldType enum のもので行います。
.table.TableSortFieldType enum
AUTOMATIC自動
NUMERIC数字
ALPHANUMERIC文字種
  • CollatorLocale は並べ替えのアルゴリズムのための言語を設定します。
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 の ISO-639 コードを使用して指定します。 Country element は国名を文字列で http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html の ISO-3166 コードを使用して指定します。

  • CollatorAlgorithm では FieldType で指定することのできない,言語ごとの独特の並べ替え方法を指定します。言語を日本語に設定すると,phonetic (alphanumeric last), phonetic (alphanumeric first), charset の三つを使用することができます。
phonetic (alphanumeric first)読み (英数字を先に)
phonetic (alphanumeric last)読み (英数字を後に)
charset

使用することのできる 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 列目,昇順,読み (英数字を先) を指定しています。

並べ替えの実行 Edit

実際に条件を用いて並べ替えを実行するには 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 メソッドを呼び出します。

実際に使用するときには条件を変更してから並べ替えを実行します。

高さの変更 Edit

行の高さの変更は行コンテナから個別の行を取り出して行います。

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 にすると最適な高さになります。

補足 Edit

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

表のアンカー Edit

表が配置されているアンカーは取得しても、カーソルの位置を示すテキスト範囲オブジェクトとして利用できません。 表オブジェクトはテキストコンテンツとして有効なので、それを利用してどうにかします。

表のキャプション Edit

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

表を置換 Edit

表自体を置換して取り除きたい場合には、表のアンカーは役に立たないので次のようにして表の前か後ろにテキストコンテンツを挿入してから、表を削除することで置き換えられます。

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

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