如何使用 OpenXml 或 ClosedXml 在 Excel 中进行自动填充?

问题描述 投票:0回答:1

在我们的组织中,人们使用包含表格数据和一些公式的 Excel 电子表格,我需要将其连接到 C# 中的数据提供程序。借助 OpenXML,甚至更好的 ClosedXml,我们可以使用 C# 代码创建或更新 Excel 文档。但是,我在 C# 中还无法实现一项功能,那就是通过自动更新单元格引用将公式复制到其他行。第 5 行单元格中的公式如下所示:

=IFS(P5=$B$24,$E$24,P5=$B$25,$E$25,P5=$B$26,$E$26

使用单元格 P5 中的值以及 B 列和 E 列以及第 24-26 行的固定单元格中的查找表来调用内置库函数 IFS。

在 Excel 中,很容易在第 5 行下方添加(插入)新行,并通过用鼠标拖动单元格的左下角将公式复制到该新行。公式会自动更改为引用 P6 而不是 P5,而带美元符号的单元格引用保持不变(绝对引用)。

对于在C#中复制公式,我还没有找到自动更新P5到P6的方法。

在Excel中,使用宏记录器,我发现以下命令:

function main(workbook: ExcelScript.Workbook) {
    let selectedSheet = workbook.getActiveWorksheet();
    // Auto fill range
    selectedSheet.getRange("C3").autoFill("C3:C5", ExcelScript.AutoFillType.fillDefault);
}

这是在另一个 Excel 工作表中。它基本上从 C3 获取内容,并使用命令

autoFill
将其复制到接下来的两行:C4 和 C5。它确实更新了如上所述的参考文献。

我在 ClosedXml 中没有找到

autoFill
功能,但 OpenXml 中有一个:

https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.spreadsheet.autofill?view=openxml-3.0.1

但问题是我不知道如何使用它。没有代码示例。谷歌也没有找到例子。

我确实编写了一些读取单元格值的 OpenXml 代码,但未能编写一个:

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

public void UpdateExcel(string FileNameXlsx)
{
    var isEditable = true;
    using (SpreadsheetDocument document = 
        SpreadsheetDocument.Open(FileNameXlsx, isEditable, new OpenSettings()))
    {
        WorkbookPart workbookPart = document.WorkbookPart;
        Workbook workbook = workbookPart.Workbook;
        Sheet sheet = workbook.Descendants<Sheet>().First();
        WorksheetPart wsPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
        Worksheet ws = wsPart.Worksheet;
        Cell cell_L5 = ws.Descendants<Cell>().First(c => c.CellReference == "L5");
        Cell cell_L6 = ws.Descendants<Cell>().First(c => c.CellReference == "L6");
        cell_L6.CellFormula = cell_L5.CellFormula;
        document.Save();
    }
}
    

小问题是如何以更简单的方式编写此代码,以及如何将值写入单元格。

主要问题是如何在这段代码中获得

autoFill
功能。

尝试让自动填充工作的原因是我们想要分离关注点:“用户”负责第一个数据行中的实际公式,而我作为开发人员负责使用来自某个数据行的数据创建更多行。数据库,并使用恰好出现在第一个数据行中的公式。从某种意义上说,我使用输入 Excel 作为模板。当然,如果上面的公式稳定,我可以在所有行中编写正确的公式,但是,可以预见用户实际上可能会更改公式,并且我的系统应该适用于第一个数据行中的任何公式。诚然,这有点奇怪且技术含量低,但是,目前情况就是这样,如果可能的话,我可以让人们对自动填充功能感到非常满意。

c# excel openxml autofill closedxml
1个回答
0
投票

您在 OpenXML 中链接到的自动填充与我们在单元格之间重复数据或公式的自动填充不同。这是关于细胞的颜色和样式。

此元素指定对象的填充属性由应用程序自动提供,并且不会被特定的填充颜色或样式覆盖。

您将无法使用 OpenXML 或 ClosedXml 自动填充数据或公式。原因是自动填充不是工作表包含的内容。这是 Excel 应用程序响应用户要求其自动填充而执行的操作。 OpenXML 和 ClosedXml 都不能充当宏并执行此类用户交互。这有点像告诉 OpenXML 您要从用户剪贴板粘贴数据。您可以在应用程序中执行此操作。当您绕过应用程序并直接与底层 XML 文件交互时,您无法做到这一点。

您可以编写代码来填充单元格,但与 Excel 的自动填充功能(计算出每个单元格中应输入的内容)不同,您的代码必须准确决定在每个单元格中输入的内容。所以它不会自动填充。它只是编写代码将数据或公式放入单元格中。

© www.soinside.com 2019 - 2024. All rights reserved.