使用 C# 在 OPEN XML sdk 中添加引用另一个工作簿中的单元格的公式

Add a formula which references a cell from another workbook in OPEN XML sdk using C#

我正在使用 C# 开发 Open XML sdk 2.0。

我有两本工作簿 Book1 和 Book2。 假设 Book1 在其单元格 D1 中的值为 10。那么 book2 的单元格 A1 中应该有 10。 Book1 已创建,我需要处理 book2。

我正在尝试创建工作簿 Book2,其中单元格 A1 引用 Book1(Sheet1) 中的单元格 D1。 每当用户更改 Book1 中的 D1 时,一旦完成,book2 中的值 A1 也应该更改。

目前我有这个代码

Row row2 = new Row()
        {
            RowIndex = 1U,
            Spans = new ListValue<StringValue>()
        };

// string formula= "Sum(B2,B5)"; // this one works 
String formula= "'C:\Workbooks\[Book2.xlsx]Sheet1'!$D"; // this does not

Cell cell3 = new Cell() { CellReference = "A1" };
CellFormula formula = new CellFormula(formula);
cell3.Append(formula);

CellValue value = new CellValue();
value.Text = "0";
cell3.Append(value);

row2.Append(cell3);

每当我将行添加到工作簿并保存它时,如果我使用下面的公式,它就会说 book2 已损坏

formula= "'C:\Workbooks\[Book2.xlsx]Sheet1'!$D"; // this does not

但是如果我使用如下所示的简单公式,它就可以工作了。

formula= "Sum(B2,B5)"; // this one works 

我不确定如何使用 C# 在 OPEN XML sdk 中添加引用另一个工作簿中的单元格的公式。

问题是 Excel 需要一个外部引用来通知它另一个 sheet 的存在。为此,您需要在 WorkBookPart:

上调用 AddExternalRelationship 方法
workbookpart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath", 
        new System.Uri(@"C:\Workbooks\Book2.xlsx", UriKind.Absolute), "rId1");

如果解压缩引用另一个工作簿的 Xlsx 文件并导航到 xl 文件夹,您将看到有一个 externalLinks 文件夹。这是您需要创建的部分。

这是我改编自 this MSDN documentation 的完整代码示例。

public static void CreateSpreadsheetWorkbook(string filepath)
{
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.
        Create(filepath, SpreadsheetDocumentType.Workbook);

    // Add a WorkbookPart to the document.
    WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
    workbookpart.Workbook = new Workbook();

    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();

    SheetData sheetData = new SheetData();
    worksheetPart.Worksheet = new Worksheet(sheetData);

    // Add Sheets to the Workbook.
    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
        AppendChild<Sheets>(new Sheets());

    // Append a new worksheet and associate it with the workbook.
    Sheet sheet = new Sheet()
    {
        Id = spreadsheetDocument.WorkbookPart.
            GetIdOfPart(worksheetPart),
        SheetId = 1,
        Name = "mySheet"
    };
    sheets.Append(sheet);

    Row row2 = new Row()
        {
            RowIndex = 1U
        };

    //add your formula as per your question
    String formula = @"'C:\Workbooks\[Book2.xlsx]Sheet1'!$D";

    Cell cell3 = new Cell() { CellReference = "A1" };
    CellFormula cellFormula = new CellFormula(formula);
    cell3.Append(cellFormula);

    row2.Append(cell3);

    //add a relationship that points to the correct file
    workbookpart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
        new System.Uri(@"C:\Workbooks\Book2.xlsx", UriKind.Absolute), "rId1");

    sheetData.Append(row2);

    workbookpart.Workbook.Save();

    // Close the document.
    spreadsheetDocument.Close();
}