文書ドキュメント: テキスト以外のオブジェクト
本章のここまでの説明は、テキストの段落および段落部位のみを扱ってきました。しかし文書ドキュメントには、テキスト以外のオブジェクトも存在します。これに該当するのは、テーブル、テキストフィールド、ディレクトリ、図形描画オブジェクトなどです。このようなオブジェクトは、テキスト内の任意の位置に配置することができます。
基本機能と共に、これらの Apache OpenOffice オブジェクトはすべて、com.sun.star.text.TextContent という共通基本サービスをサポートしています。このサービスでは、次の属性が利用できます。
- AnchorType (Enum)
- TextContent オブジェクトのアンカーの種類を決定します (com.sun.star.text.TextContentAnchorType 列挙型に従うデフォルト値)。
- AnchorTypes (sequence of Enum)
- 特殊な TextContent オブジェクトをサポートするすべての AnchorTypes の列挙。
- TextWrap (Enum)
- TextContent オブジェクト周囲のテキストの折り返しの種類を特定します (com.sun.star.text.WrapTextMode 列挙型に従ったデフォルト値)。
TextContent のオブジェクトは、オブジェクトの作成、挿入、削除に関するものなど、いくつかのメソッドを共有しています。
- 新しい TextContent オブジェクトを作成するには、ドキュメントオブジェクトの createInstance メソッドを使用します。
- オブジェクトを挿入するには、テキストオブジェクトのinsertTextContent メソッドを使用します。
- TextContent オブジェクトを削除するには、removeTextContent メソッドを使用します。
これらのメソッドの使用法については、次の節で例をいくつか説明します。
テーブル
次のサンプルコードでは、先に説明した createInstance メソッドを利用してテーブル (表) を作成します。
Dim Doc As Object Dim Table As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Table = Doc.createInstance("com.sun.star.text.TextTable") Table.initialize(5, 4) Doc.Text.insertTextContent(Cursor, Table, False)
Python のサンプル:
def inset_img(): # abstract the objects in varialbes, doc, text and img, note we used the XSCRIPTCONTEXT doc = XSCRIPTCONTEXT.getDocument() text = doc.getText() cursor = text.createTextCursor() # not sure Table = doc.createInstance(u'com.sun.star.text.TextTable') # Verify code Table.initialize(5, 4) #inser the image in the text area location text.insertTextContent(text.getEnd(), Table, False)
テーブルを作成した後、initialize の呼び出しを使用してテーブルの行数と列数を設定し、insertTextContent を使用して文書ドキュメントに挿入します。
前の例を見るとわかるように、insertTextContent メソッドには、挿入する Content オブジェクト以外に、2 つのパラメータを渡す必要があります。
- 挿入位置を指定する Cursor オブジェクト。
- Content オブジェクトをカーソルの現在の選択範囲と置き換えるか (True) または現在の選択テキストの直前に挿入するか (False) を指定するブール値。
文書ドキュメントに挿入されたすべてのテーブルの取得は、簡単なループで処理できます。この処理には、文書ドキュメントオブジェクトの getTextTables() メソッドを使用します。
Dim Doc As Object Dim TextTables As Object Dim Table As Object Dim I As Integer Doc = StarDesktop.CurrentComponent TextTables = Doc.getTextTables() For I = 0 to TextTables.count - 1 Table = TextTables(I) ' Editing table Next I
![]() |
Apache OpenOffice では、ドキュメントオブジェクトの TextTables リストを使用してテキストテーブルにアクセスできます。先に見たサンプルコードでは、テキストテーブルの作成法について説明しました。テキストテーブルへのアクセスについては、次の節で説明します。 |
テーブルの編集
テーブルは、個別の行で構成されています。そして各行は、いくつかのセルに分割されています。厳密に言うと、Apache OpenOffice にはテーブルの列は存在しません。ここでのテーブル列は、複数の行を上下方向に並べた結果として形成された、いわば見かけ上の存在です。ただし、Apache OpenOffice には、テーブルに簡単にアクセスできるよう、列を操作するメソッドがいくつか用意されています。これらのメソッドは、セルを結合していないテーブルを扱う場合に有用です。
ここではまず、テーブル自体のプロパティーについて説明します。これらは、com.sun.star.text.TextTable サービスで定義されています。以下に、重要度の高いテーブルオブジェクトの属性を示します。
- BackColor (Long)
- テーブルの背景色。
- BottomMargin (Long)
- 100 分の 1 ミリ単位で指定した下部マージン。
- LeftMargin (Long)
- 100 分の 1 ミリ単位で指定した左マージン。
- RightMargin (Long)
- 100 分の 1 ミリ単位で指定した右マージン。
- TopMargin (Long)
- 100 分の 1 ミリ単位で指定した上部マージン。
- RepeatHeadline (Boolean)
- テーブルヘッダをすべてのページに表示します。
- Width (Long)
- 100 分の 1 ミリ単位で指定したテーブルの絶対幅。
テーブル行
テーブルは、行を含むリストで構成されます。次のサンプルコードでは、テーブル内の行を取得して書式を設定します。
Dim Doc As Object Dim Table As Object Dim Cursor As Object Dim Rows As Object Dim Row As Object Dim I As Integer Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Table = Doc.createInstance("com.sun.star.text.TextTable") Table.initialize(5, 4) Doc.Text.insertTextContent(Cursor, Table, False) Rows = Table.getRows For I = 0 To Rows.getCount() - 1 Row = Rows.getByIndex(I) Row.BackColor = &HFF00FF Next
この例では、最初に Table.getRows を使用して、すべての行を含むリストを作成しています。リストをさらに処理するには、com.sun.star.table.XtableRows インターフェースに属する getCount および getByIndex メソッドを使用します。getByIndex メソッドは、com.sun.star.text.TextTableRow サービスをサポートする行オブジェクトを返します。
com.sun.star.table.XtableRows インターフェースの主要なメソッドを次に示します。
- getByIndex(Integer)
- 指定したインデックスの行オブジェクトを返します。
- getCount()
- 行オブジェクトの数を返します。
- insertByIndex(Index, Count)
- テーブルの Index の位置に Count 行を挿入します。
- removeByIndex(Index, Count)
- テーブルの Index の位置から Count 行を削除します。
getByIndex および getCount メソッドはすべてのテーブルで使用できますが、insertByIndex および removeByIndex メソッドを使用できるのは、セルを結合していないテーブルだけです。
com.sun.star.text.TextTableRow サービスは次のプロパティーを提供します。
- BackColor (Long)
- 行の背景色。
- Height (Long)
- 100 分の 1 ミリ単位で指定した行の高さ。
- IsAutoHeight (Boolean)
- テーブルの高さを内容に合わせて動的に調節する。
- VertOrient (const)
- テキスト枠の縦の方向 — テーブル内でのテキストの縦方向の詳細 (com.sun.star.text.VertOrientation で定義されている値)。
列
列には行と同じ方法でアクセスし、Column オブジェクトの getByIndex、getCount、insertByIndex、および removeByIndex メソッドを使用します。このオブジェクトは、getColumns を使用して取得します。ただしこれらのメソッドが利用できるのは、セルを結合していないテーブルだけです。また、Apache OpenOffice Basic では、列単位でセルの書式を設定することはできません。このような処理を行うには、テーブルのセルを個別に書式設定する必要があります。
セル
Apache OpenOffice ドキュメントの各セルには、固有の名前が付いています。Apache OpenOffice のカーソルがセル内にある場合、そのセルの名前がステータスバーに表示されます。通常、左上隅のセルは A1 と表示され、右下隅のセルは Xn と表示されます。X は列を示す文字で、n は行を示す番号です。セルオブジェクトにアクセスするには、テーブルオブジェクトの getCellByName() メソッドを使用します。次のサンプルコードでは、ループを使用してテーブル内のすべてルにアクセスし、個々のセルごとに該当する行と列の番号を表示します。
Dim Doc As Object Dim Table As Object Dim Cursor As Object Dim Rows As Object Dim RowIndex As Integer Dim Cols As Object Dim ColIndex As Integer Dim CellName As String Dim Cell As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Table = Doc.createInstance("com.sun.star.text.TextTable") Table.initialize(5, 4) Doc.Text.insertTextContent(Cursor, Table, False) Rows = Table.getRows Cols = Table.getColumns For RowIndex = 1 To Rows.getCount() For ColIndex = 1 To Cols.getCount() CellName = Chr(64 + ColIndex) & RowIndex Cell = Table.getCellByName(CellName) Cell.String = "row: " & CStr(RowIndex) + ", column: " & CStr(ColIndex) Next Next
テーブルのセルは、通常のテキストに相当します。関連する TextCursor オブジェクトの作成用に、createTextCursor インターフェースがサポートされています。
CellCursor = Cell.createTextCursor()
したがって、個々の文字および段落に対して設定可能なすべての書式オプションが、自動的に使用できるようになります。
次のサンプルコードでは、文書ドキュメント上のすべてのテーブルを調べて、数値の入ったセルのみを右揃えにしますが、セルの書式設定の際に段落プロパティーを利用しています。
Dim Doc As Object Dim TextTables As Object Dim Table As Object Dim CellNames Dim Cell As Object Dim CellCursor As Object Dim I As Integer Dim J As Integer Doc = StarDesktop.CurrentComponent TextTables = Doc.getTextTables() For I = 0 to TextTables.count - 1 Table = TextTables(I) CellNames = Table.getCellNames() For J = 0 to UBound(CellNames) Cell = Table.getCellByName(CellNames(J)) If IsNumeric(Cell.String) Then CellCursor = Cell.createTextCursor() CellCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.RIGHT End If Next Next
この例では、ループで処理したすべてのテキストのテーブルを含む TextTables リストを作成しています。続いて、Apache OpenOffice はこれらの各テーブルに関連付けられているセル名のリストを作成します。次にこのリストを基にして、第 2 のループを開始します。このループでは、セル内のデータが数値であるかを判定し、その結果に応じて書式を設定します。そのために、まずテーブルセルの内容を参照する TextCursor オブジェクトを作成してから、テーブルセルの段落プロパティーを適用しています。
テキスト枠
テキスト枠も、テーブルやグラフと同様に TextContent オブジェクトとして扱われます。テキスト枠は本質的に通常のテキストと同質のものですが、ページ上の任意の位置に配置できることと、ドキュメント本文のテキストの流れから外れた存在である点が異なります。
これまでに見てきた TextContent オブジェクトと同様に、テキスト枠の場合も、オブジェクトの作成とドキュメント上への挿入は、それぞれ個別の操作として実行します。
Dim Doc As Object Dim TextTables As Object Dim Cursor As Object Dim Frame As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Frame = Doc.createInstance("com.sun.star.text.TextFrame") Doc.Text.insertTextContent(Cursor, Frame, False)
テキスト枠の作成には、ドキュメントオブジェクトの createInstance メソッドを使用します。作成後のテキスト枠は、Text オブジェクトの insertTextContent メソッドを使用して、ドキュメントへ挿入します。その際には、com.sun.star.text.TextFrame というサービス名を指定する必要があります。
テキスト枠の挿入位置は Cursor オブジェクトにより指定されるため、挿入時はこのオブジェクトも準備しておく必要があります。
![]() |
Apache OpenOffice のテキスト枠は、MS Word の位置フレームに相当する機能です。ただし、VBA の処理では、Document.Frames.Add メソッドを使用しますが、StarSuite Basic では上述したように、ドキュメントオブジェクトの TextCursor および createInstance メソッドを使用して作成します。 |
テキスト枠オブジェクトには、テキスト枠の表示位置や動作を制御するために、各種の属性が用意されています。これらプロパティーの大部分は com.sun.star.text.BaseFrameProperties サービスで定義されているもので、これは各 TextFrame サービスでもサポートされています。以下に主要なプロパティーを示します。
- BackColor (Long)
- テキスト枠の背景色。
- BottomMargin (Long)
- 100 分の 1 ミリ単位で指定した下部マージン。
- LeftMargin (Long)
- 100 分の 1 ミリ単位で指定した左マージン。
- RightMargin (Long)
- 100 分の 1 ミリ単位で指定した右マージン。
- TopMargin (Long)
- 100 分の 1 ミリ単位で指定した上部マージン。
- Height (Long)
- 100 分の 1 ミリ単位で指定したテキスト枠の高さ。
- Width (Long)
- 100 分の 1 ミリ単位で指定したテキスト枠の幅。
- HoriOrient (const)
- テキスト枠の横長書式 (com.sun.star.text.HoriOrientation で定義されている値)。
- VertOrient (const)
- テキスト枠の縦方向 (com.sun.star.text.VertOrientation で定義されている値)。
次のサンプルコードでは、これらのプロパティーを使用してテキスト枠を作成します。
Dim Doc As Object Dim TextTables As Object Dim Cursor As Object Dim Frame As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Cursor.gotoNextWord(False) Frame = Doc.createInstance("com.sun.star.text.TextFrame") Frame.Width = 3000 Frame.Height = 1000 Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER Frame.TopMargin = 0 Frame.BottomMargin = 0 Frame.LeftMargin = 0 Frame.RightMargin = 0 Frame.BorderDistance = 0 Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE Frame.VertOrient = com.sun.star.text.VertOrientation.LINE_TOP Doc.Text.insertTextContent(Cursor, Frame, False)
このサンプルコードでは、テキスト枠の挿入位置を指定するために TextCursor を作成しています。実際の挿入位置は、1 つ目と 2 つ目の単語の間です。そして、Doc.createInstance を使用してテキスト枠を作成します。その後、テキスト枠の各属性に必要な値を指定しています。
AnchorType (TextContent サービス) プロパティーと VertOrient (BaseFrameProperties サービス) プロパティーとの関係には注意が必要です。AnchorType は AS_CHARACTER 値を受け取ります。これは、テキスト枠をテキストフロー中に直接挿入して、通常の文字として動作するよう指定するものです。このような指定により、たとえばテキストフローが途中で改行される場合、このテキスト枠も次の行に送られるようになります。一方の VertOrient プロパティーに指定した LINE_TOP という値は、テキスト枠とテキストの上端を同じ高さにするための設定です。
初期値の設定終了後、insertTextContent を使用してテキスト枠を文章ドキュメントに挿入します。
テキスト枠の内容を編集するには、TextCursor を使用する必要がありますが、その使用法はすでに説明したように、テキスト枠の場合も特に違いはありません。
Dim Doc As Object Dim TextTables As Object Dim Cursor As Object Dim Frame As Object Dim FrameCursor As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Frame = Doc.createInstance("com.sun.star.text.TextFrame") Frame.Width = 3000 Frame.Height = 1000 Doc.Text.insertTextContent(Cursor, Frame, False) FrameCursor = Frame.createTextCursor() FrameCursor.charWeight = com.sun.star.awt.FontWeight.BOLD FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.CENTER FrameCursor.String = "This is a small Test!"
上記のサンプルコードでは、テキスト枠を作成して現在のドキュメントに挿入し、このテキスト枠内部に TextCursor を移動しています。次にこのカーソルを使用して、テキスト枠内の表示フォントの太字への設定および、段落配置の中央揃への設定を行なっています。そして最後に「This is a small test!」という文字列を、テキスト枠内に表示させています。文字列。
テキストフィールド
テキストフィールドは、通常のテキストを拡張する追加ロジックを提供するので、TextContent オブジェクトです。テキストフィールドの文書ドキュメントへの挿入では、他の TextContent オブジェクトの場合と同様のメソッドを使用します。
Dim Doc As Object Dim DateTimeField As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() DateTimeField = Doc.createInstance("com.sun.star.text.TextField.DateTime") DateTimeField.IsFixed = False DateTimeField.IsDate = True Doc.Text.insertTextContent(Cursor, DateTimeField, False)
このサンプルコードでは、現在の日付を表示するテキストフィールドを、文書ドキュメントの先頭に挿入しています。IsDate プロパティーへの True の指定は、日付のみを表示し、時刻は表示しないことを意味します。また、IsFixed への False の指定は、ドキュメントを開く際に日付を自動更新することを意味します。
![]() |
VBA ではフィールドの種類を指定するのに Document.Fields.Add メソッドのパラメータを使用しますが、Apache OpenOffice Basic ではフィールドの種類を指定するサービス名がその役割を担っています。 |
Apache OpenOffice の従来バージョンでは、テキストフィールドを操作するのに、Selection オブジェクトで使用できた各種のメソッドを利用する必要がありました (たとえば InsertField、DeleteUserField、SetCurField)。
Apache OpenOffice 2.x では、テキストフィールドの処理もオブジェクト指向の概念に基づくよう改められました。つまりテキストフィールドを構築するに当たっては、最初に該当するタイプのテキストフィールドを作成してから、必要な属性値を指定して初期化する必要があります。このような処理を経た後、insertTextContent メソッドを使用してテキストフィールドをドキュメントに挿入します。このような処理の流れは、先に紹介したサンプルコードに示した通りです。主要なフィールドの種類およびそれらの属性については、次の節で説明しています。
テキストフィールド関係の操作では、ドキュメントへの挿入以外にも、ドキュメント上のフィールドを検索するという処理も行えます。次のサンプルコードでは、ループを使って文書ドキュメント上のすべてのテキストフィールドにアクセスし、フィールドの種類を確認します。
Dim Doc As Object Dim TextFieldEnum As Object Dim TextField As Object Dim I As Integer Doc = StarDesktop.CurrentComponent TextFieldEnum = Doc.getTextFields.createEnumeration While TextFieldEnum.hasMoreElements() TextField = TextFieldEnum.nextElement() If TextField.supportsService("com.sun.star.text.TextField.DateTime") Then MsgBox "Date/time" ElseIf TextField.supportsService("com.sun.star.text.TextField.Annotation") Then MsgBox "Annotation" Else MsgBox "unknown" End If Wend
テキストフィールドの存在を設定する起点となるのは、ドキュメントオブジェクトの TextFields リストです。このサンプルコードでは、Enumeration オブジェクトを作成することでこのようなリストを取得し、すべてのテキストフィールドにアクセスするループに入ります。検出されたテキストフィールドに対しては、supportsService メソッドを用いて、そのサポートするサービスを確認します。フィールドの種類が日付/時刻 (date/time) ないしコメント (annotation) の場合は、該当するフィールドの種類をメッセージボックスに表示します。その他の種類のフィールドに対しては、「unknown」と表示します。
以下に、重要なテキストフィールドとそのプロパティーを示します。すべてのテキストフィールドに関するリストについては、『API reference』の com.sun.star.text.TextField モジュールを参照してください (Apache OpenOffice Basic では、先に見たサンプルコードの表記と同様に、テキストフィールドのサービス名の大文字と小文字を区別する必要があります)。
ページ数、語数、文字数
テキストフィールドについては、次のサービスが利用できます。
- com.sun.star.text.TextField.PageCount
- com.sun.star.text.TextField.WordCount
- com.sun.star.text.TextField.CharacterCount
それぞれページ数、語数、文字数を返します。これらは次のプロパティーをサポートしています。
- NumberingType (const)
- 番号付け形式 (com.sun.star.style.NumberingType の定数に従ったガイドライン)。
現在のページ
現在のページ番号を表示するフィールドをドキュメントに挿入するには、テキストフィールドに com.sun.star.text.TextField.PageNumber を指定します。この場合は、次のプロパティーが利用できます。
- NumberingType (const)
- 番号形式 (com.sun.star.style.NumberingType の定数に従ったガイドライン)。
- Offset (short)
- ページ番号に追加するオフセット値 (負の値も指定可能)。
次のサンプルコードでは、ページ番号表示用のフッタをドキュメントに挿入します。
Dim Doc As Object Dim DateTimeField As Object Dim PageStyles As Object Dim StdPage As Object Dim FooterCursor As Object Dim PageNumber As Object Doc = StarDesktop.CurrentComponent PageNumber = Doc.createInstance("com.sun.star.text.TextField.PageNumber") PageNumber.NumberingType = com.sun.star.style.NumberingType.ARABIC PageStyles = Doc.StyleFamilies.getByName("PageStyles") StdPage = PageStyles("Default") StdPage.FooterIsOn = True FooterCursor = StdPage.FooterTextLeft.Text.createTextCursor() StdPage.FooterTextLeft.Text.insertTextContent(FooterCursor, PageNumber, False)
このサンプルコードでは、まず com.sun.star.text.TextField.PageNumber サービスをサポートするテキストフィールドを作成しています。Apache OpenOffice ではヘッダおよびフッタ行をページテンプレートに定義しているため、PageStyles のリストから選択することによりオブジェクトを作成しています。
フッタ行を表示するには、FooterIsOn プロパティーに True を設定します。テキストフィールドをドキュメントに挿入する際には、左揃え表示を指定したテキストオブジェクトを使用しています。
コメント
コメント (注釈) フィールド (com.sun.star.text.TextField.Annotation) は、文章ドキュメント上で黄色のシンボルとして表示されます。このシンボルをクリックすると、テキストフィールドが開き、挿入箇所の文章に関するコメントを入力できるようになります。コメントフィールドでは、次の属性が利用できます。
- Author (String)
- 作成者の名前。
- Content (String)
- コメントテキスト。
- Date (Date)
- コメントが入力された日付。
日付と時刻
日付/時刻フィールド (com.sun.star.text.TextField.DateTime) は、現在の日付および時刻の表示に使用します。この場合は、次のプロパティーが利用できます。
- IsFixed (Boolean)
- True を指定すると、表示時間を更新させず、False を指定するとドキュメントを開く際に自動更新する。
- IsDate (Boolean)
- True を指定するとフィールドに現在の日付を表示させ、それ以外の場合は現在の時刻を表示する。
- DateTimeValue (struct)
- フィールドの現在の内容 (com.sun.star.util.DateTime 構造体)。
- NumberFormat (const)
- 日付および時刻の書式。
章名および章番号
テキストフィールドに章名を表示するには、com.sun.star.text.TextField.Chapter 型を使用します。表示形式は、次の 2 つの属性で指定します。
- ChapterFormat (const)
- 章名と章番号のどちらを表示するかを指定する (com.sun.star.text.ChapterFormat に定められた値)。
- Level (Integer)
- 章名ないし章番号として表示させる章レベルを指定する。指定値は 0 が最高レベルに該当します。
ブックマーク
ブックマーク (com.sun.star.text.Bookmark サービス) は TextContent オブジェクトです。このためテキストマークの作成と挿入も、すでに説明したものと同様の手順で行えます。
Dim Doc As Object Dim Bookmark As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor() Bookmark = Doc.createInstance("com.sun.star.text.Bookmark") Bookmark.Name = "My bookmarks" Doc.Text.insertTextContent(Cursor, Bookmark, True)
このサンプルコードでは、ブックマークの挿入位置の指定用に Cursor というオブジェクトを作成してから、実際のブックマークオブジェクト (Bookmark) を作成しています。このブックマークは、名前を付けてから、insertTextContent を用いてカーソル位置に挿入します。
ブックマークへのアクセスには、Bookmarks と呼ばれるリストを使用します。また個々のテキストマークは、番号または名前により特定できます。
次のサンプルコードでは、文書ドキュメント上で特定のブックマークを選択して、該当位置へテキストを挿入します。
Dim Doc As Object Dim Bookmark As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Bookmark = Doc.Bookmarks.getByName("My bookmarks") Cursor = Doc.Text.createTextCursorByRange(Bookmark.Anchor) Cursor.String = "Here is the bookmark"
ここでは getByName メソッドを用いて、ブックマークをその名前で特定しています。そして createTextCursorByRange を用いて Cursor というオブジェクトを作成して、このブックマークのアンカー位置を取得します。最後にこのカーソルの示す位置に、文字列を挿入しています。
Content on this page is licensed under the Public Documentation License (PDL). |