[]
        
(Showing Draft Content)

从属与引用

有时,在包含大量公式的工作表中,很难确定在进行计算时考虑了哪些单元格值或范围,或者如何计算结果。此外,如果修改了单元格值,哪些单元格会受到影响。因此,需要优先的和依赖的单元格或范围。GcExcel库在IRange接口中提供了getPrecedentsgetDependents方法,这有助于在excel工作表中识别优先级和依赖的单元格或范围。

  • Precedents: 由其他单元格中的公式引用的单元格或区域
  • Dependents: 包含引用其他单元格的公式的单元格或区域

例如,单元格A1 =10, A2 = 20, B1 = Sum (A1+A2),则A1和A2是B1的引用单元格,用于计算B1的值。同样,B1是A1和A2的依赖单元格,其值是根据单元格A1和A2的值计算的。

Precedents

请参阅以下示例代码以获取工作表中的引用区域

private static void DirectPrecedents() {
    // Initialize workbook
    Workbook workbook = new Workbook();
    // Fetch default worksheet
    IWorksheet worksheet = workbook.getWorksheets().get(0);

    // Set Formula in Cell E2
    worksheet.getRange("E2").setFormula("=sum(A1:A2, B4,C1:C3)");
    // Set Value of Cells
    worksheet.getRange("A1").setValue(1);
    worksheet.getRange("A2").setValue(2);
    worksheet.getRange("B4").setValue(3);
    worksheet.getRange("C1").setValue(4);
    worksheet.getRange("C2").setValue(5);
    worksheet.getRange("C3").setValue(6);

    // Get Precedent cells of Range E2
    for (IRange item : worksheet.getRange("E2").getPrecedents()) {
        item.getInterior().setColor(Color.GetPink());
    }

    // Saving workbook to Xlsx
    workbook.save("36-Precedents.xlsx", SaveFileFormat.Xlsx);

下图展示了引用的单元格区域(粉色高亮显示)

Precedent ranges 

Dependents

请参阅以下示例代码以获取工作表中的引用其他单元格的公式区域。

private static void DirectDependents() {
    // Initialize workbook
    Workbook workbook = new Workbook();
    // Fetch default worksheet
    IWorksheet worksheet = workbook.getWorksheets().get(0);

    // Set Value of Cell A1
    worksheet.getRange("A1").setValue(100);
    // Set Formula in Cell C1
    worksheet.getRange("C1").setFormula("=$A$1");
    // Set Formula in Range E1:E5
    worksheet.getRange("E1:E5").setFormula("=$A$1");

    // Get Dependent cells of Range A1
    for (IRange item : worksheet.getRange("A1").getDependents()) {
        item.getInterior().setColor(Color.GetLightGreen());
    }

    // Saving workbook to Xlsx
    workbook.save("35-Dependents.xlsx", SaveFileFormat.Xlsx);

下图显示了引用单元格的公式区域(绿色高亮显示)。

Dependent ranges

All Precedents

通常使用多个引用的单元格区域来计算单元格公式。请参阅下面的示例代码,以获取工作表中的所有引用单元格区域。

private static void GetAllPrecedents() {
    // 初始化工作簿
    Workbook workbook = new Workbook();
    //获取默认工作表
    IWorksheet worksheet = workbook.getWorksheets().get(0);
    //在单元格E2设置公式
    worksheet.getRange("E2").setFormula("=sum(C1:C2)");
    // 在单元格C1设置公式
    worksheet.getRange("C1").setFormula("=B1");
    // S在单元格B1设置公式
    worksheet.getRange("B1").setFormula("=sum(A1:A2)");
    //设置单元格值
    worksheet.getRange("A1").setValue(1);
    worksheet.getRange("A2").setValue(2);
    worksheet.getRange("C2").setValue(3);

    //获取E2的引用单元格
    ArrayList list = new ArrayList();
    for (IRange item : worksheet.getRange("E2").getPrecedents(true)) {
        item.getInterior().setColor(Color.GetRed());
    }

    // 保存为xlsx文件
    workbook.save("DirectIndirectPrecedents.xlsx", SaveFileFormat.Xlsx);
    }

下图展示了E2单元格的所有引用信息

直接与间接从属

你可以使用getDependents方法获取单元格的直接和间接从属, 该方法提供了includeIndirect参数,该参数为true时,返回 目标单元格的直接和间接从属,为false时只返回直接从属。

参考以下示例代码以获取工作表中的所有从属

private static void DirectIndirectPrecedents() {
    // Initialize workbook
    Workbook workbook = new Workbook();
    // Fetch default worksheet
    IWorksheet worksheet = workbook.getWorksheets().get(0);
    // Set Formula in Cell E2
    worksheet.getRange("E2").setFormula("=sum(C1:C2)");
    // Set Formula in Cell C1
    worksheet.getRange("C1").setFormula("=B1");
    // Set Formula in Cell B1
    worksheet.getRange("B1").setFormula("=sum(A1:A2)");
    // Set Value of Cells
    worksheet.getRange("A1").setValue(1);
    worksheet.getRange("A2").setValue(2);
    worksheet.getRange("C2").setValue(3);

    // Get Precedent cells of Range E2
    ArrayList list = new ArrayList();
    for (IRange item : worksheet.getRange("E2").getPrecedents(true)) {
        item.getInterior().setColor(Color.GetRed());
    }

    // Saving workbook to Xlsx
    workbook.save("DirectIndirectPrecedents.xlsx", SaveFileFormat.Xlsx);
    }

获取关于单元格E2的所有引用的单元格区域(蓝色绿色高亮显示)

Direct and Indirect Dependents

您还可以使用重载的getDependents方法来标识直接依赖项和间接依赖项,该方法提供includeIndirect参数。此参数设置为true时返回所有直接依赖项和间接依赖项。但是,其默认值为false,仅返回直接依赖项。

请参阅以下示例代码以获取工作表中的所有相关依赖。

private static void DirectIndirectPrecedents() {
    // Initialize workbook
    Workbook workbook = new Workbook();
    // Fetch default worksheet
    IWorksheet worksheet = workbook.getWorksheets().get(0);
    // Set Formula in Cell E2
    worksheet.getRange("E2").setFormula("=sum(C1:C2)");
    // Set Formula in Cell C1
    worksheet.getRange("C1").setFormula("=B1");
    // Set Formula in Cell B1
    worksheet.getRange("B1").setFormula("=sum(A1:A2)");
    // Set Value of Cells
    worksheet.getRange("A1").setValue(1);
    worksheet.getRange("A2").setValue(2);
    worksheet.getRange("C2").setValue(3);

    // Get Precedent cells of Range E2
    ArrayList list = new ArrayList();
    for (IRange item : worksheet.getRange("E2").getPrecedents(true)) {
        item.getInterior().setColor(Color.GetRed());
    }

    // Saving workbook to Xlsx
    workbook.save("DirectIndirectPrecedents.xlsx", SaveFileFormat.Xlsx);
    }

下图显示了单元格A1的所有依赖。