Excel 文件连接工具提供了在 AnyLogic 模型中轻松访问 MS Excel(.xls, .xlsx)文件的平台无关方式。使用此对象,您可以:
- 读取 Excel 文件并浏览其内容,
演示模型: 读取和写入 Excel 文件
在 AnyLogic Cloud 中打开模型页面。在那里,您可以运行模型或下载它(通过点击模型源文件)。 - 读取各种类型的单个单元格的值和公式,
演示模型: 从单元格中读取不同数据类型的数据
在 AnyLogic Cloud 中打开模型页面。在那里,您可以运行模型或下载它(通过点击模型源文件)。 - 读取 AnyLogic 表函数的内容,
- 读取 AnyLogic 一维和二维数组,
- 创建新的单元格
- 写入单个单元格并更改其类型,
- 将 AnyLogic 数据集写入 Excel 电子表格,
演示模型: 在 Excel 中将模型输出显示为图表
在 AnyLogic Cloud 中打开模型页面。在那里,您可以运行模型或下载它(通过点击模型源文件)。 - 保存修改后的电子表格。
如何添加 Excel 文件访问工具
-
从 连接 面板中拖动 Excel 文件 元素到图形图表上。您也可以直接从其他应用程序拖动 Excel 文件到 AnyLogic 图形图表上。在这种情况下,AnyLogic 会自动在图形图表上添加一个新的 Excel 文件 元素,其中包含添加的 Excel 文件。
-
在 属性 视图中,更改元素的 名称。此名称将用于从代码中识别和访问此对象。
-
在 文件 字段中,指定此元素将要使用的工作簿文件。点击 浏览 按钮定位文件。
如果文件存储在模型文件夹中,文件 字段将显示相对路径;否则,它将显示绝对路径。一旦选定,源文件将自动出现在 项目 视图的模型资源文件夹中。这样,您将能够跟踪源文件的当前状态,在绝对和相对文件路径之间切换等。
-
转到 高级 部分。保留选中的 模型启动时加载 复选框。这将在模型启动时自动从文件加载工作簿,并允许您使用此 Excel 文件。
-
如果您期望在指定的 Excel 文件中保存一些数据,请保留选中的 模型终止时保存 复选框。这将使您免于调用此访问工具的 writeFile() 函数以将所有更改提交到 Excel 文件:这将在模型退出时自动完成。
操作 Excel 文件的 API
使用 ExcelFile 对象的 API 来操作 Excel 文件。以下是 API 中最有用的函数列表,在 API 部分。这些函数中的大多数具有几种不同的参数集和表示法。查找您需要的操作,然后展开适当的部分并找到最适合您需求的函数。
在执行任何 Excel 文件操作之前,调用 readFile() 函数。或者,在该对象的属性中选择 模型启动时加载 选项:在这种情况下,当模型启动时,工作簿将自动从文件加载。
从 Excel 文件中读取
读取 Excel 文件:readFile()
函数 | 描述 |
---|---|
void readFile() | 从文件加载工作簿。 在此函数调用后,工作簿中的所有未保存数据(如果有)将丢失。 |
获取指定单元格的类型:getCellType()
getCellType() 函数返回单元格的类型(数字、公式、字符串等)。
该函数有三种不同的参数集表示法。它们在指定单元格的方式上有所不同。
函数 | 描述 |
---|---|
getCellType(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格:工作表索引、行索引、列索引。 |
getCellType(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格,分别是行索引和列索引。 |
getCellType(String cellName) | 通过其名称指定单元格,格式如下:<sheet name>!<column name> <rownumber> ,例如:Sheet1!A3。 可以省略工作表名称,则将采用第一张工作表。 |
从单元格中读取布尔值
getCellBooleanValue() 函数将单元格的值作为布尔值返回。对于字符串、数字和错误,会抛出异常。对于空单元格,返回 false。
函数 | 描述 |
---|---|
boolean getCellBooleanValue(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格:工作表索引、行索引、列索引。 |
boolean getCellBooleanValue(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格,分别是行索引和列索引。 |
boolean getCellBooleanValue(String cellName) | 通过其名称指定单元格,格式同上。 |
从单元格中读取数值
getCellNumericValue() 函数将单元格的值作为数字返回。对于字符串,会抛出异常。对于空单元格,返回 0。
函数 | 描述 |
---|---|
double getCellNumericValue(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
double getCellNumericValue(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
double getCellNumericValue(String cellName) | 通过其名称指定单元格,格式同上。 |
从单元格中读取字符串值
getCellStringValue() 函数将单元格的值作为字符串返回。对于数字单元格,会抛出异常。对于空单元格,返回空字符串。对于不是字符串公式的公式单元格,返回空字符串。
函数 | 描述 |
---|---|
String getCellStringValue(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
String getCellStringValue(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
String getCellStringValue(String cellName) | 通过其名称指定单元格,格式同上。 |
从单元格中读取日期值
getCellDateValue() 函数将单元格的值作为日期返回。对于字符串,会抛出异常。对于空单元格,返回 null。
函数 | 描述 |
---|---|
Date getCellDateValue(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
Date getCellDateValue(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
Date getCellDateValue(String cellName) | 通过其名称指定单元格,格式同上。 |
获取指定单元格定义的公式
getCellFormula() 函数返回单元格的公式,例如:SUM(C4:E4)。
函数 | 描述 |
---|---|
String getCellFormula(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
String getCellFormula(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
String getCellFormula(String cellName) | 通过其名称指定单元格,格式同上。 |
获取指定单元格定义的公式类型
getCellFormulaType() 函数仅对公式单元格有效,返回公式单元格的类型。
函数 | 描述 |
---|---|
getCellFormulaType(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
getCellFormulaType(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
getCellFormulaType(String cellName) | 通过其名称指定单元格,格式同上。 |
读取单元格的错误代码值
getCellErrorValue() 函数将单元格的值作为错误代码返回。对于字符串会抛出异常。对于空单元格,返回 null。
函数 | 描述 |
---|---|
byte getCellErrorValue(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
byte getCellErrorValue(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
byte getCellErrorValue(String cellName) | 通过其名称指定单元格,格式同上。 |
将 Excel 文件中的数据读入 AnyLogic 表函数
readTableFunction() 函数将 Excel 文件中的数据读入指定的表函数。
如果工作表中的数据不足以填满长度,则表函数将获得较少的点。
该函数返回从工作表实际读取的表函数点数。
参数:
- tableFunction --- 要填充的表函数。
- length --- 要读取的表函数点数。
函数 | 描述 |
---|---|
int readTableFunction(TableFunction tableFunction, int sheetIndex, int rowIndex, int columnIndex, int length) | 从索引为 sheetIndex 的工作表开始,从索引为 rowIndex 的行读取表函数: - 参数从 columnIndex 列读取, - 值从 columnIndex 1 列读取。 |
int readTableFunction(TableFunction tableFunction, String sheetName, int rowIndex, int columnIndex, int length) | 从名称为 sheetName 的工作表开始,从索引为 rowIndex 的行读取表函数: - 参数从 columnIndex 列读取, - 值从 columnIndex 1 列读取。 |
int readTableFunction(TableFunction tableFunction, String cellName, int length) | 从给定单元格的行开始,读取表函数: - 参数从给定单元格的列读取, - 值从给定单元格旁边的列读取, 单元格通过名称指定,格式如下:<sheet name>!<column name> <row number> ,例如:Sheet1!A3。 可以省略工作表名称,则将采用第一张工作表。 |
将 Excel 文件中的数据读入 AnyLogic 超级数组
readHyperArray() 函数从给定单元格开始,读取一维或二维超级数组数据。
参数:
- array --- 要写入数据的超级数组,应具有 1 或 2 个维度。
- dim1AcrossRows --- 使用 true 来读取对应第一维度的数据,跨工作表行(即,在这种模式下,一维数组的数据从工作表列中加载)。
函数 | 描述 |
---|---|
void readHyperArray(HyperArray array, int sheetIndex, int rowIndex, int columnIndex, boolean dim1AcrossRows) | 使用三个数字(基于1的)指定单元格:工作表索引、行索引、列索引。 |
void readHyperArray(HyperArray array, String sheetName, int rowIndex, int columnIndex, boolean dim1AcrossRows) | 使用工作表名称和两个数字(基于1的)行索引和列索引来指定单元格。 |
void readHyperArray(HyperArray array, String cellName, boolean dim1AcrossRows) | 通过名称指定单元格,格式如下:<sheet name>!<column name><row number> ,例如,Sheet1!A3。 可以省略工作表名称,则假定为第一张工作表。 |
向 Excel 文件写入数据
调用 writeFile() 函数以将更改提交到 Excel 文件。或者,在 Excel 文件 对象的属性中选择 模型终止时保存 选项:在这种情况下,当模型退出时,更改将自动保存。
将更改保存到 Excel 文件
函数 | 描述 |
---|---|
void writeFile() | 将当前工作簿存储到文件中。工作簿应该已经加载。未保存的工作簿(带有未保存数据的工作簿)不会被保存。要保存到不同位置,请在 writeFile() 之前调用 setFileName(String) 函数。 |
创建具有指定索引的单元格
createCell() 函数在给定位置创建一个新单元格。
函数 | 描述 |
---|---|
void createCell(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格:工作表索引、行索引、列索引。 |
void createCell(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格,分别是行索引和列索引。 |
void createCell(String cellName) | 通过其名称指定单元格,格式如下:<sheet name>!<column name> <row number> ,例如:Sheet1!A3。 可以省略工作表名称,则将采用第一张工作表。 |
向单元格中写入值
setCellValue() 函数为指定单元格设置给定值。该函数可以接受所有最常见的类型值:布尔值、双精度浮点数、字符串、日期。
函数 | 描述 |
---|---|
void setCellValue(<typename> value, int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格:工作表索引、行索引、列索引。 |
void setCellValue(<typename> value, String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格,分别是行索引和列索引。 |
void setCellValue(<typename> value, String cellName) | 通过其名称指定单元格,格式同上。 |
为指定单元格设置公式
setCellFormula() 函数为指定单元格设置公式。公式通过函数参数 formula 传递,即 "SUM(C4:E4)"。如果此参数为 null,则删除当前公式。
此函数仅设置公式字符串,不计算公式值。要计算公式,请调用 evaluateFormulas() 函数。
函数 | 描述 |
---|---|
void setCellFormula(String formula, int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
void setCellFormula(String formula, String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
void setCellFormula(String formula, String cellName) | 通过其名称指定单元格,格式同上。 |
将 AnyLogic 数据集写入 Excel 文件
writeDataSet() 函数从给定单元格开始将给定数据集写入工作表。数据按行以两列的形式写入:用于 X 和 Y 组件。
函数 | 描述 |
---|---|
int writeDataSet(DataSet dataset, int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
int writeDataSet(DataSet dataset, String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
int writeDataSet(DataSet dataset, String cellName) | 通过其名称指定单元格,格式同上。 该函数返回数据集的大小。 |
验证和辅助操作
获取 Excel 文件中的工作表数量
getNumberOfSheets()
函数 | 描述 |
---|---|
int getNumberOfSheets() | 返回工作簿中电子表格的数量。 |
获取指定工作表的名称
getSheetName()
函数 | 描述 |
---|---|
String getSheetName(int sheetIndex) | 返回指定索引 sheetIndex 的工作表的名称。 |
检查指定单元格是否存在
cellExists()
cellExists() 函数返回 true 如果给定位置的单元格在工作簿中存在。
函数 | 描述 |
---|---|
boolean cellExists(int sheetIndex, int rowIndex, int columnIndex) | 通过三个数字(基于1的)指定单元格。 |
boolean cellExists(String sheetName, int rowIndex, int columnIndex) | 通过工作表名称和两个数字(基于1的)指定单元格。 |
boolean cellExists(String cellName) | 通过其名称指定单元格,格式同上。 |
获取工作表的第一行号
getFirstRowNum()
getFirstRowNum() 函数返回工作表的第一逻辑行号(使用基于1的索引)。
函数 | 描述 |
---|---|
int getFirstRowNum(int sheetIndex) | 通过其索引指定工作表。 |
int getFirstRowNum(String sheetName) | 通过其名称指定工作表。 |
获取工作表的最后一行号
getLastRowNum()
getLastRowNum() 函数返回工作表的最后一逻辑行号(使用基于1的索引)。
函数 | 描述 |
---|---|
int getLastRowNum(int sheetIndex) | 通过其索引指定工作表。 |
int getLastRowNum(String sheetName) | 通过其名称指定工作表。 |
获取行中的第一个单元格号
getFirstCellNum()
getFirstCellNum() 函数返回指定行中包含的第一个单元格的编号。具体来说,它返回包含行中第一个逻辑单元格的列的编号(使用基于1的索引),如果行不包含任何单元格,则返回 0。
函数 | 描述 |
---|---|
int getFirstCellNum(int sheetIndex, int rowIndex) | 通过索引指定工作表和行。 |
int getFirstCellNum(String sheetName, int rowIndex) | 通过名称指定工作表;行通过索引。 |
获取行中的最后一个单元格号
getLastCellNum()
getLastCellNum() 函数返回指定行中包含的最后一个单元格的编号。具体来说,它返回包含行中最后一个逻辑单元格的列的编号(使用基于1的索引),如果行不包含任何单元格,则返回 0。
函数 | 描述 |
---|---|
int getLastCellNum(int sheetIndex, int rowIndex) | 通过索引指定工作表和行。 |
int getLastCellNum(String sheetName, int rowIndex) | 通过名称指定工作表;行通过索引。 |
在 Excel 文件中评估公式
evaluateFormulas()
函数 | 描述 |
---|---|
void evaluateFormulas() | 评估工作簿中包含公式的所有单元格的公式,并保存结果。 单元格保留为公式单元格。请注意,您的单元格将同时包含公式和结果。如果您希望单元格替换为公式的结果,请使用以下函数: org.apache.poi.ss.usermodel.Cell.evaluateInCell(org.apache.poi.ss.usermodel.Cell) |