Excel table 由 EPPlus 创建不会将公式传播到新行
Excel table created by EPPlus doesn't propagate formula to new rows
我正在使用 EPPlus 4.5.3.1 创建一个 Excel 工作簿。它包含一个工作表,其中一个 Excel table 包含数据。
要求用户能够向 table 添加新行(在 Excel 中,可以通过右键单击一行并选择“插入”>“新行”来完成,或者在 table).
的右下单元格中点击 Tab 键
我似乎无法让我的 EPPlus 生成的工作簿将我在列中得到的公式传播到 Excel 中的 table 中生成的新行。如果我手动创建一个相同的工作簿,公式将被传播。
我已尝试按照以下示例以多种方式将公式分配给列的范围。
这是一个最小的示例(控制台应用程序)。这将创建工作簿。在 Excel 中打开时,当用户在 table.
中创建新行时,最右侧列中的公式不会传播到新行
我的问题是,这是 EPPlus 的限制,还是我错过了一些会表现出 table 列中的公式传播到在 table 中创建的新行的行为的东西=32=]?
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using OfficeOpenXml.Table;
namespace EPPlusTests
{
class Program
{
static void Main(string[] args)
{
List<ExampleData> exampleDatas = new List<ExampleData>();
exampleDatas.Add(new ExampleData() { PersonName = "Tom", PersonAge = 44 });
exampleDatas.Add(new ExampleData() { PersonName = "Richard", PersonAge = 37 });
exampleDatas.Add(new ExampleData() { PersonName = "Harry", PersonAge = 41 });
ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Testing");
worksheet.Cells.LoadFromCollection(exampleDatas, true, TableStyles.Dark1);
var col = worksheet.Cells.First(x => x.Value.ToString() == "TheFormula").Start.Column;
//worksheet.Cells[2, col, worksheet.Dimension.End.Row, col].FormulaR1C1 = "2*RC[-1]"; // nope
worksheet.Cells["C2:C4"].FormulaR1C1 = "2*RC[-1]"; // nope
package.SaveAs(new FileInfo("C:\Temp\EPPlusTestFormula.xlsx"));
}
}
class ExampleData
{
public string PersonName { get; set; }
public int PersonAge { get; set; }
public string TheFormula { get; set; }
public ExampleData() { }
}
}
好的,事实证明这很容易。该解决方案不是寻址一系列单元格,而是寻址 table 中的列对象,并使用 .CalculatedColumnFormula
分配公式。我不知道你是否可以为此使用 R1C1,你可能需要使用 table-特定的公式语法。
以上示例的工作原理如下:
ExcelTable table = worksheet.Tables[0];
table.Columns[2].CalculatedColumnFormula = "2*Table1[[#This Row],[PersonAge]]";
最初可能一些更一致的谷歌搜索会让我到达那里。我在代码here.
中找到了答案
我正在使用 EPPlus 4.5.3.1 创建一个 Excel 工作簿。它包含一个工作表,其中一个 Excel table 包含数据。
要求用户能够向 table 添加新行(在 Excel 中,可以通过右键单击一行并选择“插入”>“新行”来完成,或者在 table).
的右下单元格中点击 Tab 键我似乎无法让我的 EPPlus 生成的工作簿将我在列中得到的公式传播到 Excel 中的 table 中生成的新行。如果我手动创建一个相同的工作簿,公式将被传播。
我已尝试按照以下示例以多种方式将公式分配给列的范围。
这是一个最小的示例(控制台应用程序)。这将创建工作簿。在 Excel 中打开时,当用户在 table.
中创建新行时,最右侧列中的公式不会传播到新行我的问题是,这是 EPPlus 的限制,还是我错过了一些会表现出 table 列中的公式传播到在 table 中创建的新行的行为的东西=32=]?
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using OfficeOpenXml.Table;
namespace EPPlusTests
{
class Program
{
static void Main(string[] args)
{
List<ExampleData> exampleDatas = new List<ExampleData>();
exampleDatas.Add(new ExampleData() { PersonName = "Tom", PersonAge = 44 });
exampleDatas.Add(new ExampleData() { PersonName = "Richard", PersonAge = 37 });
exampleDatas.Add(new ExampleData() { PersonName = "Harry", PersonAge = 41 });
ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Testing");
worksheet.Cells.LoadFromCollection(exampleDatas, true, TableStyles.Dark1);
var col = worksheet.Cells.First(x => x.Value.ToString() == "TheFormula").Start.Column;
//worksheet.Cells[2, col, worksheet.Dimension.End.Row, col].FormulaR1C1 = "2*RC[-1]"; // nope
worksheet.Cells["C2:C4"].FormulaR1C1 = "2*RC[-1]"; // nope
package.SaveAs(new FileInfo("C:\Temp\EPPlusTestFormula.xlsx"));
}
}
class ExampleData
{
public string PersonName { get; set; }
public int PersonAge { get; set; }
public string TheFormula { get; set; }
public ExampleData() { }
}
}
好的,事实证明这很容易。该解决方案不是寻址一系列单元格,而是寻址 table 中的列对象,并使用 .CalculatedColumnFormula
分配公式。我不知道你是否可以为此使用 R1C1,你可能需要使用 table-特定的公式语法。
以上示例的工作原理如下:
ExcelTable table = worksheet.Tables[0];
table.Columns[2].CalculatedColumnFormula = "2*Table1[[#This Row],[PersonAge]]";
最初可能一些更一致的谷歌搜索会让我到达那里。我在代码here.
中找到了答案