使用OpenXml插入Excel STOCKHISTORY动态数组函数时自动添加@符号导致失效,如何解决?
使用OpenXml插入Excel STOCKHISTORY动态数组函数时自动添加@符号导致失效,如何解决?
我完全懂你碰到的这个麻烦——用OpenXml给Excel插入STOCKHISTORY这种动态数组函数时,单元格里莫名多了个@符号,直接导致函数没法像预期那样展开成动态数组;但换成NOW()这种普通函数就完全正常,根本不会出现@。这其实是Excel的隐式交集运算符在搞鬼,下面给你说清楚原因和解决办法:
问题根源
Excel里的@是隐式交集运算符,当它检测到某个动态数组函数被放在「普通单元格上下文」(而非数组上下文)时,会自动加上这个符号,强制函数只返回单个值,以此兼容旧版Excel的非数组行为。而你用OpenXml默认创建的CellFormula是普通公式类型,Excel识别不到这是一个需要展开的动态数组公式,所以自动加上@限制它的返回结果。
解决办法
要让Excel把这个公式当作动态数组公式处理,你需要在创建CellFormula时,明确添加DynamicArrayProperties标记,告诉Excel:「这是个动态数组公式,要展开成数组结果」。
修改后的完整代码
把你原来创建公式单元格的部分替换成下面的代码,整体调整后如下:
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; string filePath = "temp.xlsx"; // 1. Create Excel file using (SpreadsheetDocument document = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); SheetData sheetData = new SheetData(); // A1: Insert formula Row headerRow = new Row(); var formula = "STOCKHISTORY(\"AMZN\", \"6/1/2006\", \"6/22/2025\", 0, 1, 0, 1, 2, 3,4, 5)"; // If I use this next line the NOW() does not get an @ added in front //formula = "NOW()"; // 关键修改:给CellFormula添加DynamicArrayProperties,标记为动态数组公式 Cell formulaCell = new Cell { CellReference = "A1", CellFormula = new CellFormula(formula) { // 标记为动态数组公式,避免Excel添加@ DynamicArrayProperties = new DynamicArrayProperties( new DynamicArrayFormula() ) }, DataType = CellValues.Number }; headerRow.Append(formulaCell); sheetData.Append(headerRow); worksheetPart.Worksheet = new Worksheet(sheetData); // Add Sheets to Workbook Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet); workbookPart.Workbook.Save(); }
原理说明
通过给CellFormula添加DynamicArrayProperties元素,我们明确告诉Excel这个公式是动态数组公式,需要在数组上下文执行,这样Excel就不会自动添加@符号,STOCKHISTORY函数就能正常展开成动态数组,自动填充到下方的单元格中了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

