Top > OOoBasic > Writer > table

*表 [#bb43d4d1]
Writer の表を取り扱ってみます。

#contents
**テーブルコンテナオブジェクト [#qc9f6add]
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 ''(&br; string name ),名前で表のオブジェクトを戻す
,[]string ''getElementNames ''( void ),すべての表の名前を配列にして戻す
,boolean ''hasByName ''(&br; string name ),名前の表があるかどうか
,long ''getCount ''( void ),表の数を戻す
,void ''getByIndex ''(&br; long index ),インデックスの表のオブジェクトを戻す
**表オブジェクト [#vbd121a5]
表オブジェクトはテキストテーブルコンテナオブジェクトにひとまとめにしてあります。そこから一つずつ取得します。
テーブルコンテナオブジェクトから個別の表へのアクセスはインデックスまたは名前で行います。

表へインデックスでアクセスするためには, ''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)
**挿入 [#cccff43f]
新しい表の作成はドキュメントオブジェクトから新しく com.sun.star.table.TextTable サービスをインスタンス化して利用します。
新しい表の作成はドキュメントオブジェクトから新しく com.sun.star.text.TextTable サービスをインスタンス化して利用します。

新しい表の挿入の手順は次のとおりです。順番が違うとうまくいかないことがあるので注意。
+com.sun.star.table.TextTable サービスをインスタンス化
+setName メソッドで表名を設定する
+initialize メソッドで行、列サイズを初期化 (設定) する
+insertTextContents メソッドでドキュメントに挿入する
+枠線などを設定する

 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
** 幅の変更 [#m5d6d473]

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

|com.sun.star.text.HoriOrientation|値|説明|h
|NONE|0|余白で幅が決定|
|RIGHT|1|右|
|CENTER|2|中央|
|LEFT|3|左|
|INSIDE|4||
|OUTSIDE|5||
|FULL|6|行幅|
|LEFT_AND_WIDTH|7|幅指定で左余白位置に|

 oTable.HoriOrientation = com.sun.star.text.HoriOrientation.NONE
 oTable.LeftMargin = 1000
 oTable.RightMargin = 1000
** 列区切位置の変更 [#y0ff39ec]

列の区切り位置は 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 に分けられます。
**並べ替え [#v64d49bf]
Calc のセル範囲のような並べ替えの機能が Writer の表でもサポートされていますが,これも利用してみます。
***条件 [#k069f3d1]
並べ替えには,並べ替えを指定するための条件が必要です。ここでは,条件を設定してみます。

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

 oDesc() = oTable.createSortDescriptor()

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

,property,value,index,description
,IsSortInTable,false,0,表の内容または段落のセクションを並べ替えるかどうか
,Delimiter,32,1,段落の選択範囲を並べ替えるときの列を分割する区切り文字
,IsSortColumns,true,2,列または行で並べ替える
,MaxSortFieldsCount,3,3,並べ替えに使用することのできるフィールドの最大数
,SortFields,,4,並べ替えに使用するフィールドについて

この表にある 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'' は他のものとすこし違い,配列として戻されます。これは,並べ替えるときの列や行指定が複数あるものを一つにまとめてあるためです。これについては次で説明します。



***フィールド [#wdc79bf5]
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 列目,昇順,読み (英数字を先) を指定しています。
***並べ替えの実行 [#xc22d547]
実際に条件を用いて並べ替えを実行するには ''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'' メソッドを呼び出します。

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

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

 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 にすると最適な高さになります。
**補足 [#r592d3da]
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

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


** 表のキャプション [#te0cce94]
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

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

 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