#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. У меня была ошибка, и как только я ее исправил, она сработала.