公式不识别单元格值

时间:2018-02-09 09:11:04

标签: c# excel epplus

我正在使用ASP.Net MVC应用程序中的以下代码生成excel

 var fileName =  DateTime.Now.ToString("yyyy-MM-dd--hh-mm-ss") + ".xlsx";
                var outputDir = ConfigurationManager.AppSettings["ExcelUploadPath"];

                //  var fileName = "ExcellData.xlsx";
                var file = new FileInfo(outputDir + fileName);

                var fDate = JsonConvert.DeserializeObject<DateTime>(fromDate);
            var tDate = JsonConvert.DeserializeObject<DateTime>(toDate);
                using (var package = new OfficeOpenXml.ExcelPackage(file))
                {
                    // add a new worksheet to the empty workbook
                    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Plan " + DateTime.Now.ToShortDateString());

                    // --------- Data and styling goes here -------------- //

                    DataTable dt = planService.GetFlow(fDate, tDate, customerId, ordertypeId, suppliers, items);
                    if (dt != null)
                    {
                        int iCol = 1;
                        // Add column headings...
                        for (int i = 9; i < dt.Columns.Count; i++)
                        {
                            dt.Columns[i].ColumnName = dt.Columns[i].ColumnName.MultiInsert("/", 1, 3);
                        }




                        foreach (DataColumn c in dt.Columns)
                        {
                            worksheet.Cells[1, iCol].Value = c.ColumnName;
                            worksheet.Cells[1, iCol].Style.Fill.PatternType = ExcelFillStyle.Solid;
                            worksheet.Cells[1, iCol].Style.Font.Bold = true;
                            worksheet.Cells[1, iCol].Style.Fill.BackgroundColor.SetColor(Color.LightGray);
                            iCol++;
                        }




                        for (int j = 0; j < dt.Rows.Count; j++)
                        {
                            for (int k = 0; k < dt.Columns.Count; k++)
                            {

                                worksheet.Cells[j + 2, k + 1].Value = dt.Rows[j].ItemArray[k].ToString();



                                if (int.Parse(dt.Rows[j].ItemArray[7].ToString()) == 6)
                                {
                                    worksheet.Cells[j + 2, k + 1].Style.Locked = false;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.PatternType = ExcelFillStyle.Solid;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.BackgroundColor.SetColor(Color.Cyan);
                                }
                                if (int.Parse(dt.Rows[j].ItemArray[7].ToString()) == 7)
                                {
                                    worksheet.Cells[j + 2, k + 1].Style.Locked = false;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.PatternType = ExcelFillStyle.Solid;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.BackgroundColor.SetColor(Color.Magenta);
                                     //worksheet.Cells[j + 2, k + 1].Formula = 

                                    if((k+1) > 10){

                                        var addressList = new List<string>();
                                        for (int i = 11; i <= k+1; i++)
                                        {
                                            addressList.Add(worksheet.Cells[((j + 2) -1) , i].Address);
                                        }
                                        var lstAdress = String.Join(",", addressList);
                                        worksheet.Cells[j + 2, k + 1].Formula = "SUM(" + lstAdress + ")";
                                    }

                                }
                                if (int.Parse(dt.Rows[j].ItemArray[7].ToString()) == 8)
                                {
                                    //worksheet.Cells[j + 2, k + 1].Style.Locked = false;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.PatternType = ExcelFillStyle.Solid;
                                    worksheet.Cells[j + 2, k + 1].Style.Fill.BackgroundColor.SetColor(Color.Gray);
                                }
                            }

                            var colCount = dt.Columns.Count;
                            // worksheet.Cells[j+2, 8, j+2, colCount- 1].Style.Numberformat.Format = "0.000";
                            var range = worksheet.Cells[j + 2, 9, j + 2, colCount - 1];
                            var r = range.ToString();
                            var decimalValidation = worksheet.DataValidations.AddDecimalValidation(range.ToString());
                            decimalValidation.ShowErrorMessage = true;
                            decimalValidation.ErrorStyle = ExcelDataValidationWarningStyle.stop;
                            decimalValidation.ErrorTitle = "The value you entered is not valid";
                            decimalValidation.Error = "This cell must be a valid positive number.";
                            decimalValidation.Operator = ExcelDataValidationOperator.greaterThanOrEqual;
                            decimalValidation.Formula.Value = 0D;

                        }


                        worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
                        worksheet.Column(1).Hidden = true;
                        worksheet.Column(2).Hidden = true;
                        worksheet.Column(3).Hidden = true;
                        worksheet.Column(4).Hidden = true;
                        worksheet.Column(5).Hidden = true;
                        worksheet.Column(8).Hidden = true;
                        worksheet.Column(9).Hidden = true;
                        worksheet.Column(10).Hidden = true;
                        worksheet.Protection.IsProtected = true;
                        // save our new workbook and we are done!


                        worksheet.Calculate();
                        package.Save();
                        return Json(fileName, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        return Json("NoData", JsonRequestBehavior.AllowGet);
                    }
                }
                return Json("", JsonRequestBehavior.AllowGet);

这里我用逗号分隔的单元格名称设置我的公式,例如:

  

SUM(A1,A2,A3 ......等)

excel文件正确生成。但问题是我打开excel文件时不会发生公式计算。

enter image description here

当我手动更改列类型同意流程中的单元格值时,该公式有效。

它只能识别手动编辑的单元格的值。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

公式重新计算既是Excel又是工作簿设置。

您可以使用

在工作簿级别设置它
workbook.CalcMode = ExcelCalcMode.Automatic;

如果用户已将其设置为手动,则不会重新计算公式。

如果您想确保保存的值正确,可以通过调用

强制进行计算
worksheet.Calculate();

您还可以在工作簿或范围级别计算公式,例如:

worksheet.Cells[j + 2, k + 1].Calculate();

package.Workbook.Calculate();

the documentation中对此进行了解释。请记住,EPPlus不包含Excel的公式引擎。它使用自己的引擎来解析和计算公式。有些东西不受支持

答案 1 :(得分:0)

当我改变我的公式时它起作用如下..

    var addressList = new List<string>();
  for (int i = 11; i <= k+1; i++)
  {
      addressList.Add(worksheet.Cells[((j + 2) -1) , i].Address);
  }
  var lstAdress = String.Join("+", addressList);
   worksheet.Cells[j + 2, k + 1].Formula = "(" + lstAdress + ")";

我认为当我使用 SUM 函数时,我的Excel工作表中存在问题所以我在不使用它的情况下编写公式。然后它工作

  

(A1 + B1 + C1 + D1 + .....等)

相关问题