EPPlus-无法从Excel获取NPV和IRR函数的值

时间:2019-06-17 11:20:01

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

我在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");

1 个答案:

答案 0 :(得分:0)

我在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