单元格和区域

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
doc OOo
Book.png


电子表格由包含单元格的二维列表组成。每个单元格都是使用相对于左上角单元格(位置为 0,0)的 X 位置和 Y 位置定义的。

以下示例创建了一个引用左上角单元格的对象,并在单元格中插入了文本:

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object   

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

Cell = Sheet.getCellByPosition(0, 0)
Cell.String = "Test"
Documentation note.png StarDesktop.CurrentComponent 返回当前组件。如果您正在使用 BASIC IDE,则在运行该宏时,将会返回 BASIC IDE。由于 BASIC IDE 没有电子表格组件,因此会生成运行时错误。

请保存示例代码,并在电子表格文档中运行该宏。有关详细信息,请参见 StarDesktop

除了数字坐标以外,工作表中的每个单元格都具有名称,例如,电子表格左上角的单元格 (0,0) 称为 A1。字母 A 表示列,数字 1 表示行。切勿将单元格的名称位置相混淆,因为名称的行计数从 1 开始,而位置计数从 0 开始。

在 Apache OpenOffice 中,表格单元格可以为空,也可以包含文本、数字或公式。单元格类型不是由单元格中保存的内容决定的,而是由其条目使用的对象属性决定的。可以使用 ValueStringFormula 属性分别插入并调用数字、文本和公式。

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object   

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

Cell = Sheet.getCellByPosition(0, 0)
Cell.Value = 100

Cell = Sheet.getCellByPosition(0, 1)
Cell.String = "Test"

Cell = Sheet.getCellByPosition(0, 2)
Cell.Formula = "=A1"

本示例在字段 A1 至 A3 中分别插入了一个数字、一段文本和一个公式。

Documentation note.png ValueStringFormula 属性取代了用于设置表格单元格值的 PutCell 方法。

Apache OpenOffice 将使用 String 属性输入的单元格内容视为文本,即使该内容为数字也是如此。数字在单元格中左对齐,而不是右对齐。在使用公式时,也要注意文本和数字的区别:

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

Cell = Sheet.getCellByPosition(0, 0)
Cell.Value = 100

Cell = Sheet.getCellByPosition(0, 1)
Cell.String = 1000

Cell = Sheet.getCellByPosition(0, 2)
Cell.Formula = "=A1+A2"

MsgBox Cell.Value

虽然单元格 A1 包含值 100,单元格 A2 包含值 1000,但公式 A1+A2 返回值 100。这是因为单元格 A2 的内容是作为字符串而不是数字输入的。

要检查单元格内容是数字还是字符串,请使用 Type 属性:

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)
Cell = Sheet.getCellByPosition(1,1)

Cell.Value = 1000

Select Case Cell.Type 
Case com.sun.star.table.CellContentType.EMPTY 
   MsgBox "Content: Empty"
Case com.sun.star.table.CellContentType.VALUE
   MsgBox "Content: Value"
Case com.sun.star.table.CellContentType.TEXT
   MsgBox "Content: Text"
Case com.sun.star.table.CellContentType.FORMULA
   MsgBox "Content: Formula"
End Select

Cell.Type 属性返回 com.sun.star.table.CellContentType 枚举值,该值标识了单元格的内容类型。可能的值包括:

EMPTY
无值
VALUE
数字
TEXT
字符串
FORMULA
公式

插入、删除、复制和移动单元格

除了直接修改单元格内容以外,Apache OpenOffice Calc 还提供了一个接口,用于插入、删除、复制或合并单元格。可通过电子表格对象使用此接口 (com.sun.star.sheet.XRangeMovement),它提供了四种修改单元格内容的方法。

insertCell 方法用于在工作表中插入单元格。

Dim Doc As Object
Dim Sheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

CellRangeAddress.Sheet = 0
CellRangeAddress.StartColumn = 1
CellRangeAddress.StartRow = 1
CellRangeAddress.EndColumn = 2
CellRangeAddress.EndRow = 2

Sheet.insertCells(CellRangeAddress, com.sun.star.sheet.CellInsertMode.DOWN)

本示例在电子表格的第一个工作表(编号为 0)中的第二列、第二行交叉处(行号和列号均为 1)插入了一个大小为两行乘两列的单元格区域。指定单元格区域内的任何现有值都将移到该区域之下。

要定义想要插入的单元格区域,请使用 com.sun.star.table.CellRangeAddress 结构。该结构中包含以下值:

Sheet (short)
工作表编号(编号从 0 开始)。
StartColumn (long)
单元格区域中的第一列(编号从 0 开始)。
StartRow (long)
单元格区域中的第一行(编号从 0 开始)。
EndColumn (long)
单元格区域中的最后一列(编号从 0 开始)。
EndRow (long)
单元格区域中的最后一行(编号从 0 开始)。

必须将完整的 CellRangeAddress 结构作为第一个参数传递到 insertCells 方法。insertCells 的第二个参数包含 com.sun.star.sheet.CellInsertMode 枚举值,它定义了如何处理位于插入位置之前的值。CellInsertMode 枚举可以识别以下值:

NONE
当前值保留在目前位置。
DOWN
插入位置及其下面的单元格向下移动。
RIGHT
插入位置及其右侧的单元格向右移动。
ROWS
插入位置之后的行向下移动。
COLUMNS
插入位置之后的列向右移动。

removeRange 方法与 insertCells 方法相对应。该方法可以从工作表中删除 CellRangeAddress 结构中定义的区域。

Dim Doc As Object
Dim Sheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

CellRangeAddress.Sheet = 0
CellRangeAddress.StartColumn = 1
CellRangeAddress.StartRow = 1
CellRangeAddress.EndColumn = 2
CellRangeAddress.EndRow = 2

Sheet.removeRange(CellRangeAddress, com.sun.star.sheet.CellDeleteMode.UP)

本示例从工作表中删除了 B2:C3 单元格区域,然后将下面的单元格向上移动两行。删除类型是由以下某个 com.sun.star.sheet.CellDeleteMode 枚举值定义的:

NONE
当前值保留在当前位置。
UP
插入位置及其下面的单元格向上移动。
LEFT
插入位置及其右侧的单元格向左移动。
ROWS
插入位置之后的行向上移动。
COLUMNS
插入位置之后的列向左移动。

XRangeMovement 接口提供了另外两种方法,分别用于移动 (moveRange) 或复制 (copyRange) 单元格区域。以下示例移动了 B2:C3 区域,以使该区域从位置 A6 开始:

Dim Doc As Object
Dim Sheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
Dim CellAddress As New com.sun.star.table.CellAddress

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

CellRangeAddress.Sheet = 0
CellRangeAddress.StartColumn = 1
CellRangeAddress.StartRow = 1
CellRangeAddress.EndColumn = 2
CellRangeAddress.EndRow = 2

CellAddress.Sheet = 0
CellAddress.Column = 0
CellAddress.Row = 5

Sheet.moveRange(CellAddress, CellRangeAddress)

除了 CellRangeAdress 结构以外,moveRange 方法还需要使用 com.sun.star.table.CellAddress 结构来定义移动目标区域的起始位置。CellAddress 方法提供了以下值:

Sheet (short)
电子表格编号(编号从 0 开始)。
Column (long)
目标列的编号(编号从 0 开始)。
Row (long)
目标行的编号(编号从 0 开始)。

将始终使用 moveRange 方法覆盖目标区域中的单元格内容。与 InsertCells 方法不同,removeRange 方法未提供执行自动移动的参数。

copyRange 方法与 moveRange 方法的工作方式相同,所不同的是 copyRange 插入单元格区域的副本而不是移动该区域。

Documentation note.png 就功能而言,Apache OpenOffice Basic 中的 insertCellremoveRangecopyRange 方法与 VBA 中的 Range.InsertRange.DeleteRange.Copy 方法相同。但在 VBA 中,这些方法应用于相应的 Range 对象;而在 Apache OpenOffice Basic 中,这些方法应用于关联的 Sheet 对象。
Content on this page is licensed under the Public Documentation License (PDL).


Personal tools