POI 不支持函数XNPV

这篇博客探讨了Excel中的XNPV函数与POI库的不兼容问题,指出官方公式可能存在错误,强调了计算过程中括号内应该是减号而非乘积。文章提供了三个修复此问题的Java类,并附带了一个测试类供读者直接使用。
摘要由CSDN通过智能技术生成

这篇XNPV其实和上篇的XIRR有相似之处 就是计算方式不同  office和百度提供的XNPV函数公式好像是错误的

这里边括号里的(di d1)中间应该是减号  如果是乘积的话 计算器都计算不出结果的

这里的也同样是需要三个类   粘贴到下面 可以直接复制使用 最后我补上test测试类

第一个

package com.p1.excel.XNPV;
 
 
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @{# DateUtil.java Create on 2013-4-9
 * 
 *     class desc:
 * 
 *     <p>
 *     Copyright: Copyright(c) 2013
 *     </p>
 *     <p>
 *     Company: morelap
 *     </p>
 * @Version 1.0
 * @Author <a href="mailto:morelap@morelap.com">Morelap</a>
 * 
 * 
 */
public class DateUtil {
   public static final long Minute_MilliSecond = 60 * 1000;
   public static final long Hour_MilliSecond = Minute_MilliSecond * 60;
   /**
    * milliseconds of a day
    */
   public static final long Day_MilliSecond = Hour_MilliSecond * 24;
   /**
    * milliseconds of a week
    */
   public static final long Week_MilliSecond = Day_MilliSecond * 7;
   /**
    * milliseconds of a month
    */
   public static final long Month_MilliSecond = Week_MilliSecond * 30;
   /**
    * yyyyMMdd
    */
   public static final String Date_Default_Formate = "yyyyMMdd";
   /**
    * yyyy-MM-dd HH:mm:ss 2010-05-11 17:22:26
    */
   public static final String Date_Formate_All = "yyyy-MM-dd HH:mm:ss";
   /**
    * dd/MM/yyyy, hh:mm
    */
   public static final String DATE_FORMATE_TRANSACTION = "dd/MM/yyyy, hh:mm";
   /**
    * MM/dd HH:mm
    */
   public static final String DATE_FORMATE_DAY_HOUR_MINUTE = "MM/dd HH:mm";
   /**
    * HH:mm
    */
   public static final String DATE_FORMATE_HOUR_MINUTE = "HH:mm";
   public static final String DATE_FORMATE_HOUR_MINUTE_SECOND = "HH:mm:ss";
 
   public static SimpleDateFormat dateFormate = new SimpleDateFormat();
 
   /**
    * 获取当前的字符串日期
    * 
    * @param splite
    *            格式的分割线如 - 则获取的日期时间格式如下:
    * @return 返回2013-07-19
    */
   public static String getNowStringDate(String splite) {
      StringBuffer format = new StringBuffer();
      if (splite == null) {
         format.append(Date_Default_Formate);
      } else {
         format.append("yyyy").append(splite).append("MM").append(splite)
               .append("dd");
      }
      return (new SimpleDateFormat(format.toString())).format(new Date());
   }
 
   /**
    * 获取当前的字符串日期时间
    * 
    * @param splite
    *            格式的分割线如 - 则获取的日期时间格式如下:
    * @return 返回2013-07-19 09:08:22
    */
   public static String getNowStringDateTime(String splite) {
      StringBuffer format = new StringBuffer();
      if (splite == null) {
         format.append(Date_Default_Formate);
      } else {
         format.append("yyyy").append(splite).append("MM").append(splite)
               .append("dd").append(" HH:mm:ss");
      }
      return (new SimpleDateFormat(format.toString())).format(new Date());
   }
 
   /**
    * 获取当前的字符串期时间
    * 
    * @param splite
    *            格式的分割线如 - 则获取的日期时间格式如下:
    * @return 返回09:08:22
    */
   public static String getNowStringTime() {
      StringBuffer format = new StringBuffer(DATE_FORMATE_HOUR_MINUTE_SECOND);
      return (new SimpleDateFormat(format.toString())).format(new Date());
 
   }
 
   /**
    * 获取昨天的日期
    * 
    * @return Date
    */
   public static Date getYesterdayDate() {
      Calendar calendar = Calendar.getInstance();
      calendar.add(Calendar.DATE, -1);
      return calendar.getTime();
   }
 
   /**
    * 获取指定日期的后面的一天 即日期+1
    * 
    * @param stringDate
    *            格式为:2012-02-02
    * @return Date
    */
   public static Date getForwardDate(String stringDate) {
      int year = Integer.parseInt(stringDate.substring(0, 4));
      int month = Integer.parseInt(stringDate.substring(5, 7));
      int day = Integer.parseInt(stringDate.substring(8, 10));
      Calendar c = Calendar.getInstance();
      c.set(Calendar.YEAR, year);
      c.set(Calendar.MONTH, month - 1);
      c.set(Calendar.DAY_OF_MONTH, day);
 
      c.add(Calendar.DATE, 1);// 在此日期的基础上+1
      return c.getTime();
   }
 
   /**
    * 获取指定日期的后面的一天 即日期+1
    * 
    * @param stringDate
    *            格式为:2012-02-02
    * @return Date
    */
   public static String getForwardStringDate(String stringDate, String splite) {
      int year = Integer.parseInt(stringDate.substring(0, 4));
      int month = Integer.parseInt(stringDate.substring(5, 7));
      int day = Integer.parseInt(stringDate.substring(8, 10));
      Calendar c = Calendar.getInstance();
      c.set(Calendar.YEAR, year);
      c.set(Calendar.MONTH, month - 1);
      c.set(Calendar.DAY_OF_MONTH, day);
      c.add(Calendar.DATE, 1);// 在此日期的基础上+1
      return getStringDateByDate(c.getTime(), splite);
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值