C#EPPlus不计算公式和(A3:B3)
我刚刚开始与ePlus合作。我有一个数据表,里面有一些数字数据和公式。当我通过EPPlus加载数据表并保存到excel时,当我打开同一excel文件时发现公式未计算。公式以字符串形式存在于excel单元格中SUM(A3:B3) 为了评估公式,我尝试了许多EPPLUS选项,下面列出了这些选项C#EPPlus不计算公式和(A3:B3),c#,excel,epplus,C#,Excel,Epplus,我刚刚开始与ePlus合作。我有一个数据表,里面有一些数字数据和公式。当我通过EPPlus加载数据表并保存到excel时,当我打开同一excel文件时发现公式未计算。公式以字符串形式存在于excel单元格中SUM(A3:B3) 为了评估公式,我尝试了许多EPPLUS选项,下面列出了这些选项 pack.Workbook.Worksheets["Test"].Calculate(); pack.Workbook.Worksheets["Test"].Cells["A3"].Calculate();
pack.Workbook.Worksheets["Test"].Calculate();
pack.Workbook.Worksheets["Test"].Cells["A3"].Calculate();
pack.Workbook.Worksheets["Test"].Cells["B3"].Calculate();
ws.Calculate();
这里我指的是我的完整示例代码,其中公式不起作用。请看一看,告诉我需要在代码中添加什么来计算公式
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = GetDataTable();
string path = @"d:\EPPLUS_DT_Excel.xlsx";
Stream stream = File.Create(path);
using (ExcelPackage pack = new ExcelPackage())
{
ExcelWorksheet ws = pack.Workbook.Worksheets.Add("Test");
ws.Cells["A1"].LoadFromDataTable(dt, false);
//pack.Workbook.Worksheets["Test"].Calculate();
//pack.Workbook.Worksheets["Test"].Cells["A3"].Calculate();
//pack.Workbook.Worksheets["Test"].Cells["B3"].Calculate();
ws.Calculate();
pack.SaveAs(stream);
stream.Close();
MessageBox.Show("Done");
}
}
public DataTable GetDataTable()
{
string strSum = "", strColName, strImmediateOneUp = "", strImmediateTwoUp = "";
int startsum = 0;
int currow = 0;
bool firstTimeSum = true;
int NumRows = 3;
int NumColumns = 2;
DataTable dt = new DataTable();
for (int col = 0; col < NumColumns; col++)
{
strColName = GenerateColumnText(col);
DataColumn datacol = new DataColumn(strColName, typeof(object));
dt.Columns.Add(datacol);
}
for (int row = 0; row < NumRows; row++)
{
dt.Rows.Add();
for (int col = 0; col < NumColumns; col++)
{
if (row < 2)
{
dt.Rows[row][col] = Convert.ToInt32(new Random().Next(1, NumRows));
}
else
{
if (firstTimeSum)
{
if (row - currow == 2)
{
currow = row;
startsum = 0;
firstTimeSum = false;
}
else
{
startsum = 1;
}
}
else
{
if (row - currow == 3)
{
currow = row;
startsum = 0;
}
}
if (startsum == 0)
{
strColName = GenerateColumnText(col);
strImmediateOneUp = strColName + ((row + 1) - 1).ToString();
strImmediateTwoUp = strColName + ((row + 1) - 2).ToString();
strSum = string.Format("+SUM({0}:{1})", strImmediateTwoUp, strImmediateOneUp);
dt.Rows[row][col] = strSum;
}
else
{
dt.Rows[row][col] = Convert.ToInt32(new Random().Next(1, NumRows));
}
}
}
startsum = 1;
}
return dt;
}
private string GenerateColumnText(int num)
{
string str = "";
char achar;
int mod;
while (true)
{
mod = (num % 26) + 65;
num = (int)(num / 26);
achar = (char)mod;
str = achar + str;
if (num > 0) num--;
else if (num == 0) break;
}
return str;
}
private void按钮1\u单击(对象发送者,事件参数e)
{
DataTable dt=GetDataTable();
字符串路径=@“d:\EPPLUS\u DT\u Excel.xlsx”;
Stream=File.Create(路径);
使用(ExcelPackage pack=new ExcelPackage())
{
Excel工作表ws=pack.Workbook.Worksheets.Add(“测试”);
ws.Cells[“A1”].LoadFromDataTable(dt,false);
//pack.Workbook.Worksheets[“Test”].Calculate();
//pack.Workbook.Worksheets[“Test”]。Cells[“A3”]。Calculate();
//pack.Workbook.Worksheets[“Test”]。Cells[“B3”]。Calculate();
ws.Calculate();
pack.SaveAs(流);
stream.Close();
MessageBox.Show(“完成”);
}
}
公共数据表GetDataTable()
{
字符串strSum=“”,strColName,strimmediatenoeup=“”,strImmediateTwoUp=“”;
int startsum=0;
int currow=0;
bool firstTimeSum=true;
int NumRows=3;
int NumColumns=2;
DataTable dt=新的DataTable();
for(int col=0;col0)num--;
如果(num==0)中断,则为else;
}
返回str;
}
将公式添加到单元格时,使用公式
属性。当您使用LoadFromDataTable
从DataTable
加载范围时,无法知道某些值将被解释为公式
您可以使用
LoadDataTable
填充公式将在其上运行的单元格,但对于公式,您需要设置Formula
属性。将公式添加到单元格时,使用Formula
属性。当您使用LoadFromDataTable
从DataTable
加载范围时,无法知道某些值将被解释为公式
您可以使用
LoadDataTable
填充公式将在其上运行的单元格,但对于公式,您需要设置Formula
属性。如果在单元格中看到“SUM(A3:B3)”,则可能缺少“=”符号,或者单元格格式为文本。检查单元格格式。我们不应提供=符号,这是EPPlus的公式惯例。这就是我从sum中删除=符号的原因。请参见基本操作页面。因此,不要使用“+SUM()”,只使用“SUM”。如果在单元格中看到“SUM(A3:B3)”,则可能缺少“=”符号,或者单元格格式为文本。检查单元格格式。我们不应提供=符号,这是EPPlus的公式惯例。这就是我从sum中删除=符号的原因。请参见基本操作页面。所以不要使用“+SUM()”,只使用“SUM”。