java实现excel动态表头导入

问题的提出

使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007)
首先获取workbook:

/**
	 * 描述:根据文件后缀,自适应上传文件的版本
	 * 
	 * @param inStr    将file.getInputStream()获取的输入流
	 * @param fileName file.getOriginalFilename()获取的原文件名
	 */
	public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
		Workbook wb = null;
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		if (excel2003L.equals(fileType)) {
			wb = new HSSFWorkbook(inStr); // 2003-
		} else if (excel2007U.equals(fileType)) {
			wb = new XSSFWorkbook(inStr); // 2007+
		} else {
			throw new Exception("解析的文件格式有误!");
		}
		return wb;
	}

使用List<List>类型存储读取到的数据

/**
 * 
 * 读取指定sheet 页指定行数据
 * 
 * @param sheetIx  指定 sheet 页,从 0 开始
 * @param startRow 指定开始行,从 0 开始
 * @param endRow   指定结束行,从 0 开始 start=end=0 就是第一行
 * @param startCol 指定开始列
 * @param startCol 指定结束列
 * @return
 * @throws Exception
 */
public List<List<String>> read(int sheetIx, int startRow, int endRow, int startCol, int endCols) throws Exception {
	Sheet sheet = workbook.getSheetAt(sheetIx);
	List<List<String>> list = new ArrayList<List<String>>();

	if (endRow > getRowCount(sheetIx)) {
		endRow = getRowCount(sheetIx);
	}

	for (int i = startRow; i <= endRow; i++) {
		List<String> rowList = new ArrayList<String>();
		Row row = sheet.getRow(i);
		for (int j = startCol; j < endCols; j++) {
			if (row == null) {
				rowList.add(null);
				continue;
			}
			//rowList.add(getCellValue(row.getCell(j)));
			//取excel表中公式数据 ,表格中row.getCell(j).getCellTypeEnum() 可能会发生空指针错误,用try...catch处理
			try {
		        if (row.getCell(j).getCellTypeEnum() == CellType.FORMULA) {
		        	row.getCell(j).setCellType(CellType.STRING);
		            rowList.add(row.getCell(j).getStringCellValue());
		        }else {
		        	rowList.add(getCellValueToString(row.getCell(j)));
		        }
			}catch(Exception e) {
				rowList.add(getCellValueToString(row.getCell(j)));
			}
		}
		list.add(rowList);
	}
	return list;
}

这样是一般的处理过程,这样处理有个不好的地方就是拓展性不强,在后续调用List<List>数据时需知道在第几列,最致命的是表格添加字段或删除字段后,所有序号都得修改,所以需要解决这一问题。

问题的解决

本文新建工具类,采用反射技术动态的提取类方法

public class ArUtils<T> {
	
	private String[] ldcode = {"Id","Name", "A","B","C","D","E","F",
	                           "AtpDeviceNo2","AtpDeviceNo16","Tpproperty1","Tpproperty2",
	                           "Tpproperty3","Tpproperty4","Tpproperty5","Tpproperty6","Tpproperty7",
	                           "Remarks"};
	
	private String id;
	
	private String name;
	
	private String a;
	
	private String b;

配置各私有属性的get,set方法。

/**
 * 
 * 读取指定sheet 页指定行<T>数据
 * 
 * @param sheetIx 指定 sheet 页,从 0 开始
 * @param start   指定开始行,从 0 开始
 * @param end     指定结束行,从 0 开始
 * @return
 * @throws Exception
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<List<T>> readGeneric(int sheetIx, int start, int end, T t) throws Exception {
	Sheet sheet = workbook.getSheetAt(sheetIx);
	List<List<T>> list = new ArrayList<List<T>>();

	if (end > getRowCount(sheetIx)) {
		end = getRowCount(sheetIx);
	}

	for (int i = start; i <= end; i++) {
		List<T> rowList = new ArrayList<T>();
		Row row = sheet.getRow(i);
		List rowdata = getRowdata(row);
		Class clazz = t.getClass();
		Object fa= clazz.newInstance();
		Method method = t.getClass().getMethod("getLdcode", new Class[]{});
		Object[] ldcode = (String[])method.invoke(fa, new Object[]{});
		
		for(int j = 0; j < rowdata.size(); j++) {
			method = t.getClass().getMethod("set"+ldcode[j], String.class);
			method.invoke(fa, rowdata.get(j));
		}
		rowList.add((T) fa);
		list.add(rowList);
	}

	return list;
}

首先反射获取string[]数组,数组中存储着各个私有属性,再调用个各属性的set方法,将一行数据存储进工具类的实例,这样就完成了键值对存储,之后调用时直接使用工具类的get方法就好了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中,可以通过使用POI库来实现Excel表头数据的导入和匹配。下面是一个简单的示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; public class ExcelHeaderMatch { public static void main(String[] args) { try { // 读取Excel文件 FileInputStream fis = new FileInputStream("path/to/excel/file.xlsx"); Workbook workbook = new XSSFWorkbook(fis); Sheet sheet = workbook.getSheetAt(0); // 获取表头行 Row headerRow = sheet.getRow(0); // 遍历表头单元格 for (Cell cell : headerRow) { String headerValue = cell.getStringCellValue(); // 根据表头数据进行匹配操作 if (headerValue.equals("姓名")) { // 匹配到姓名列的操作 System.out.println("找到姓名列"); } else if (headerValue.equals("年龄")) { // 匹配到年龄列的操作 System.out.println("找到年龄列"); } else if (headerValue.equals("性别")) { // 匹配到性别列的操作 System.out.println("找到性别列"); } // 继续添加其他表头匹配逻辑... } workbook.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码通过使用POI库读取Excel文件,并获取第一行的表头数据。然后根据表头数据进行匹配操作,可以使用if-else语句进行不同的处理。根据代码示例,当匹配到"姓名"时,在console中会输出"找到姓名列"。同样的,你可以继续添加其他表头的匹配逻辑来进行相应的操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值