ClosedXml 能否使用隐式交集运算符编写未被 Excel 标记的范围公式?

Can ClosedXml write range formulas that don't get marked by Excel with the Implicit Intersection Operator?

我们正在尝试使用一个公式编写一个 .xlsx 文件,该公式将 return 使用 ClosedXml 的 double[]。 Excel 的新版本在公式中添加了隐式交集运算符 ('@'),并且不允许它溢出到相邻的单元格。

有没有办法让它不发生。 Microsoft 谈论设置 Range.Formula2 (https://docs.microsoft.com/en-us/office/vba/api/excel.range.formula2),但我不确定是否可以通过 ClosedXml 获得。

我不想尝试用 OpenXml 实现写入文件,因为那看起来很毛茸茸。

有办法吗?

样本:

using ClosedXML.Excel;

namespace ClosedXmlWriter
{
    class Program
    {
        static void Main(string[] args)
        {
            XLWorkbook workbook = new XLWorkbook(XLEventTracking.Disabled);
            IXLWorksheet sheet = workbook.Worksheets.Add("home");
            IXLCell cell = sheet.Cell(1, 1);
            cell.FormulaA1 = "=MyTestFunc()";
            workbook.SaveAs(@"d:\test.xlsx");
        }
    }
}

使用引用 ExcelDNA 的项目创建自定义 UDF:

using ExcelDna.Integration;

namespace TestPlugin
{
    public static class FunctionDefinitions
    {
        [ExcelFunction(Name = "MyTestFunc", Description = "Function description")]
        public static object MyTestFunc()
        {
            return new double[] { 1.0, 2.0, 3.0 };
        }
    }
}

运行 Excel 针对测试插件生成的 .xll 文件和 ClosedXml 生成的文件。

您必须将公式设置在输出大小的范围内,并将其放在{}:

之间
using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Sheet1");
    worksheet.Range("A3:C3").FormulaA1="{={1.0,2.0,3.0}}";
    workbook.SaveAs(myFile);
}

对于您的公式,它将是

using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Sample Sheet");
    worksheet.Range("A1:C1").FormulaA1="{=MyTestFunc()}";
    workbook.SaveAs(myFile);
}

产生: