JAVA实现EXCEL公式专题(六)——查找引用函数

查找引用函数主要有match、lookup、vlookup、hlookup这4种,这几个常用的方法也就不解释啦,直接上干货:

/**
 *  项目名称:
 *  文件说明:
 *  主要特点: EXCEL公式类型:查找公式
 *  版本号:1.0
 *  制作人:刘晨曦
 *  创建时间:2013-12-3
 **/
package EXCEL;

import java.util.Calendar;
import java.util.Date;

/**
 * @author lcx
 *
 */
public class SearchFunctions {

	/**
	 * 返回指定数值在指定数组区域中的位置
	 * @param lookupvalue 需要在数据表(lookup_array)中查找的值。
	 * @param array :可能包含有所要查找数值的连续的单元格区域
	 * @param type 表示查询的指定方式,用数字-1、0或者1表示。
	 * @param type 为1时,查找小于或等于lookup_value的最大数值在lookup_array中的位置,lookup_array必须按升序排列:
	 * 为0时,查找等于lookup_value的第一个数值,lookup_array按任意顺序排列:
	 * 为-1时,查找大于或等于lookup_value的最小数值在lookup_array中的位置,
	 * lookup_array必须按降序排列。利用MATCH函数查找功能时,
	 * 当查找条件存在时,MATCH函数结果为具体位置(数值),
	 * 否则显示#N/A错误。
	 *  @return
	 */
	public static int match(int lookupvalue,int[] array,int type)
	{
		int res=0;
		if(array==null||array.length==0)
			throw new IllegalArgumentException("数组为空");
		//精确匹配
		if(type==0)
		{
			for(int i=0;i<array.length;i++)
			{
				if(array[i]==lookupvalue)
					return i+1;
			}
			throw new IllegalArgumentException("#N/A");
		}

		//顺序匹配_正序匹配:在查找index的同时必须满足整个数组按照正序排列
		if(type>0)
		{
			if(lookupvalue<array[0])
				throw new IllegalArgumentException("#N/A");
			for(int i=0;i<array.length-1;i++)
			{
				if(array[i]>array[i+1])
					throw new IllegalArgumentException("#N/A");
				if(lookupvalue<array[i])
					res=res>0?res:i;//已经找到了res 接下来就不用赋值了
			}
			if(lookupvalue>array[array.length-1])
				res=array.length;
		}

		//顺序匹配_正序匹配:在查找index的同时必须满足整个数组按照逆序排列
		if(type<0)
		{
			if(lookupvalue>array[0])
				throw new IllegalArgumentException("#N/A");
			for(int i=0;i<array.length-1;i++)
			{
				if(array[i]<array[i+1])
					throw new IllegalArgumentException("#N/A");
				if(lookupvalue>array[i])
					res=res>0?res:i;
			}
			if(lookupvalue<array[array.length-1])
				res=array.length;
		}
		return res;
	}

	public static int vlookup(int target,int[][] scan,int col)
	{
		if(scan.length==0||scan[0].length==0)
			return -Integer.MAX_VALUE;
		if(col>scan[0].length)
			return -Integer.MAX_VALUE;

		for(int i=0;i<scan.length;i++)
		{
			if(target==scan[i][0])
				return scan[i][col-1];
		}
		return -Integer.MAX_VALUE;
	}

	public static int hlookup(int target,int[][] scan,int row)
	{
		if(scan.length==0||scan[0].length==0)
			return -Integer.MAX_VALUE;
		if(row>scan.length)
			return -Integer.MAX_VALUE;

		for(int i=0;i<scan[0].length;i++)
		{
			if(target==scan[0][i])
				return scan[row-1][i];
		}
		return -Integer.MAX_VALUE;
	}

	public static int lookup(int target,int[] array1,int[] array2)
	{
		if(array1==null||array2==null)
			throw new IllegalArgumentException("#N/A:数组为空");
		if(array1.length!=array2.length)
			throw new IllegalArgumentException("#N/A:数组长度不匹配");
		int index=-1;
		for(int i=0;i<array1.length;i++)
		{
			if(target==array1[i])
			{
				index=i;
			}
		}
		if(index<0)
			throw new IllegalArgumentException("#N/A:没有匹配项");
		return array2[index];
	}

	public static void main(String[] args) {
		/*******************测试查找引用函数*****************************/
		int[] a={25,35,45,55,65};
		int[] b={65,55,45,35,25};
		System.out.println(match(70,a,1));
		System.out.println(match(45,a,0));
		System.out.println(match(60,b,-1));
		System.out.println(match(55,b,-1));

		int[][] scan=new int[][]{{7,17,117,1117},{8,18,118,1118},{9,19,119,1119}};
		System.out.println(vlookup(7,scan,3));
		System.out.println(hlookup(7,scan,3));
		System.out.println(lookup(35,a,b));
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 05:42:09

JAVA实现EXCEL公式专题(六)——查找引用函数的相关文章

JAVA实现EXCEL公式专题(四)——字符串函数

直接上代码: /** * 项目名称: * 文件说明: ExCEL公式类型:字符串公式 * 主要特点: * 版本:1.0 * 制作人:刘晨曦 * 创建时间:2013-12-3 **/ package EXCEL; /** * @author lcx * */ public class StringFunctions { public static String right(String str,int len) { if(len>str.length()) throw new IllegalArg

JAVA实现EXCEL公式专题(一)——EXCEL公式分类与解析步骤

1)EXCEL公式分类 a. 数值: 从极端情况来说,数值也是一种最简单的公式如 A1=1; b. 简单函数:简单函数指的是参数只能是数值的函数,如公式A3(简单函数)=sum(A1:A2),,A1=1,A2=3; c. 复杂函数:复杂函数指的是参数中也存在函数的,如A4(复杂函数)=avg(A3,A1): d. 表达式:指的是四则运算表达式,如A5=(A4+A1)/A3; 在鄙人现有知识范围内,EXCEL公式函数不外乎以上四种情况. 2)EXCEL公式解析--递归 那上面最复杂的d类中的四则运

JAVA实现EXCEL公式专题(七)——统计函数

统计函数主要实现的是较为复杂的统计函数如countif.sumif.frequency,也是,直接上代码 /** * 项目名称: * 文件说明: * 主要特点:文件说明:EXCEL函数类型:统计函数 * 简单的函数如sum,average等等就不实现了 * 版本号:1.0 * 制作人:刘晨曦 * 创建时间:2013-12-3 **/ package EXCEL; import games.MathTools; import javax.script.ScriptEngine; import ja

Excel查找引用函数之offset函数

在Excel中,offset函数是一个引用函数,表示引用某一个单元格或者区域.其也是我们日常做一些组合函数中的一种,需要熟练掌握. 1.offset函数的含义 以指定的(单元格或相连单元格区域的引用)为参照系,通过给定偏移量得到新的引用. 返回的引用可以是一个单元格也可以是一个区域(可以指定行列数). 注意事项 第一,如果行数和列数偏移量超出工作表边缘,函数 OFFSET 返回错误值 #REF!. 第二,如果省略 height 或 width,则假设其高度或宽度与 reference 相同. 第

Excel教程(11) - 查找和引用函数

ADDRESS 用途:以文字形式返回对工作簿中某一单元格的引用.    语法: sheADDRESS(row_num,column_num,abs_num,a1,et_text) 参数:Row_num 是单元格引用中使用的行号:Column_num 是单元格引用中使用的列标:Abs_num 指明返回的引用类型(1 或省略为绝对引用,2 绝对行号.相对列标,3 相对行号.绝 对列标,4 是相对引用):A1 是一个逻辑值,它用来指明是以 A1 或 R1C1 返回引用样式.如果 A1 为 TRUE 或

Excel 公式集

1.  Excel 公式集 1.查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,"重复",""). 2.用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,"2009/8/30",FALSE))/360,0). 3.从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2)).

转:java 解析excel,带合并单元的excel

收集了一些对博主有帮助的博文,如下 >>>>>>>>>>>第一部分: 首先,mavn导入jar包 <!-- 解析excel需要导入的 jar包    begin -->          <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactI

java处理excel的一点实践积累

作者:佟亮    日期:2008-11-06 1   文档说明 目的:编写本文档主要的目的是与大家分享下如何用java处理excel,文档中的代码一部分来自<企业项目管理系统V2.0>的源码,一部分copy网上的. 背景:使用Windows操作系统的同事对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈. 2   需求 本部分与技术无关,没兴趣的同事可以跳过直接看下一章.

java生成excel表格和pdf并实现下载弹出框

今天在pdf和excel中都实现了在浏览器弹出下载框 将之前在网上查找的生成excel表格代码稍微修改下: public class CreateSimpleExcelToDisk { /** * @功能:手工构建一个简单格式的Excel */ private static List<News> getNews() throws Exception { List<News> data = new ArrayList<News>(); NewsDao dao = new