Может ли ClosedXML записывать формулы диапазона, которые не помечаются Excel с помощью неявного оператора пересечения?

#c# #excel-formula #openxml #export-to-excel #closedxml

Вопрос:

Мы пытаемся написать файл .xlsx, используя формулу, которая возвращала бы двойной [], используя ClosedXML. Новые версии Excel добавляют в формулу неявный оператор пересечения ( » @ » ) и не позволяют ему распространяться на соседние ячейки.

Есть ли способ сделать так, чтобы этого не случилось? Microsoft рассказывает о настройке диапазона.Формула 2 (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.

Комментарии:

1. Добавлен пример.

Ответ №1:

Вы должны задать формулу в диапазоне выходного размера и поместить ее между {} :

 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);
}
 

Который производит:

введите описание изображения здесь

Комментарии:

1. Сначала я закодировал ошибку, но, похоже, это работает.

2. @WalterWilliams Это сработало для меня, проверьте мою правку

3. @WalterWilliams также убедитесь, что вы используете Range вместо Cells

4. У меня была ошибка, и как только я ее исправил, она сработала.