【问题标题】:EPPlus - Unable to get values of NPV and IRR functions from excelEPPlus - 无法从 excel 中获取 NPV 和 IRR 函数的值
【发布时间】:2019-06-17 11:20:01
【问题描述】:

我在 excel 中有一个模型,并尝试通过 ASP.NET 将输入提供给 excel,并通过前端的网格返回模型结果。我在 ASP.NET 中使用 EPPlus 包,因为它不需要安装 MS Office。

我无法获取使用 NPV [净现值] 和 IRR [内部收益率] 函数的单元格的值。它总是返回#VALUE#NAME。作为一种解决方法,我能够手动计算 NPV,但我在 IRR 方面遇到了困难。

EPPlus 中有没有办法将所有单元格作为值粘贴到工作表中? 还是有其他选择?

请提前帮助和感谢

更新:我有 EPPlus 4.5.3.1 和 Visual Studio 2013。

string strfilepath = Server.MapPath(destPath);
FileInfo fileInfo = new FileInfo(strfilepath);
ExcelPackage p = new ExcelPackage(fileInfo);
ExcelWorksheet myWorksheet = p.Workbook.Worksheets["Financial"];
GridView1.Rows[0].Cells[2].Text = float.Parse(myWorksheet1.Cells["f57"].Value.ToString()).ToString("N2");

【问题讨论】:

  • 对我来说似乎工作正常。您使用的是什么版本的 EPPlus?发布一些代码,以便其他人可以尝试。
  • 您还没有发布创建 Excell 工作表的代码,更不用说使用 NPVIRR 的公式了。您在哪里加载数据以及在哪里使用 NPVIRR ?如果您尝试加载已经存在的 Excel 工作表,则会返回 #VALUE,因为 original 公式包含错误。 Epplus 无法修复错误的公式。或者您是否期望 Epplus 会重新计算这些值?
  • 您好@PanagiotisKanavos,感谢您的回复。它是一个已经存在的 Excel,工作表使用 IRR() 内置函数从不同工作表中的单元格计算 IRR。我可以在 excel 中看到计算出的值,这不是一个糟糕的公式。只有当我尝试将结果从 excel 获取到网格时,我才会得到结果 #VALUE。
  • @Chendur 这意味着 #VALUE 一开始就存储在该 Excel 工作表中。 Epplus 不会重新计算公式,除非您使用.Workbook.Calculate() 要求它。即使那样,它也可能会失败,因为它没有尝试 100% 模拟 Excel 计算引擎。那不是它的工作
  • 我有行 {p.Workbook.Calculate();} 以便计算整个工作簿中的每个公式。我错过了什么吗?

标签: asp.net .net excel epplus epplus-4


【解决方案1】:

我在 EPPlus 中尝试了所有可能的方法,但我无法计算 IRR。我在 SQL 中提出了一个解决方案,它给出的结果接近 excel 的 IRR 函数。

CREATE FUNCTION [dbo].[Ufn_irr1] (@strIDs1 VARCHAR(10), 
                                  @strIDs2 VARCHAR(10), 
                                  @guess   DECIMAL(30, 10)) 
returns DECIMAL(30, 10) 
AS 
  BEGIN 
      DECLARE @t_IDs TABLE 
        ( a
           id    INT IDENTITY(0, 1), 
           value DECIMAL(30, 10) 
        ) 
      DECLARE @strIDs VARCHAR(max) 

      SET @strIDs = @strIDs1 + ',' + @strIDs2 

      DECLARE @strID  VARCHAR(12), 
              @sepPos INT, 
              @NPV    DECIMAL(30, 10) 

      SET @strIDs = COALESCE(@strIDs + ',', '') 
      SET @sepPos = Charindex(',', @strIDs) 

      WHILE @sepPos > 0 
        BEGIN 
            SET @strID = LEFT(@strIDs, @sepPos - 1) 

            INSERT INTO @t_IDs 
                        (value) 
            SELECT ( Cast(@strID AS DECIMAL(20, 10)) ) 
            WHERE  Isnumeric(@strID) = 1 

            SET @strIDs = RIGHT(@strIDs, Datalength(@strIDs) - @sepPos) 
            SET @sepPos = Charindex(',', @strIDs) 
        END 

      SET @guess = CASE 
                     WHEN Isnull(@guess, 0) <= 0 THEN 0.00001 
                     ELSE @guess 
                   END 

      SELECT @NPV = Sum(value / Power(1 + @guess, id)) 
      FROM   @t_IDs 

      WHILE @NPV > 0 
        BEGIN 
            SET @guess = @guess + 0.00001 

            SELECT @NPV = Sum(value / Power(1 + @guess, id)) 
            FROM   @t_IDs 
        END 

      RETURN @guess 
  END 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多