JXL方式解析Excel电子表格,金蝶EAS自带JXL相关Jar包

所解析的电子表格需为.xls格式(2003),解析表格之后,每行数据为List<String>结构。

多行数据为List<List<String>>结构,指定表头行数是为了去除表头数据。

此种方式解析电子表格,比金蝶EAS自带的引入引出功能更为灵活。


package com.kingdee.eas.custom.si.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

/**
 * Excel导入工具类
 * @author 作者
 *
 */
public class ExcelUtil {

	/**
	 * 解析Excel电子表格(默认只读取第一个Sheet)
	 * 返回值数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * @param filePath 文件路径
	 * @param heaCount 表头行数
	 * @param colCount 前几列数据
	 * @return 数据队列
	 * 
	 */
	public static List<List<?>> parseExcel(String filePath, int heaCount, int colCount) throws Exception {
		
		List<List<?>> dataList = null; //返回值
		Workbook workbook = Workbook.getWorkbook(new File(filePath)); //电子表格
		Sheet[] sheets = workbook.getSheets(); //得到所有Sheet
		
		if(sheets.length >= 1){
			Sheet sheet = workbook.getSheet(0); //只读取第一个Sheet
			dataList = parseSheet(sheet, heaCount, colCount); //解析指定Sheet的前几列数据
		} else {
			exception("解析Excel文件出错!");
		}

		return dataList;
		
	}
	
	/**
	 * 解析Excel电子表格(默认只读取第一个Sheet)
	 * 返回值数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * @param file 文件字节数组
	 * @param heaCount 表头行数
	 * @param colCount 前几列数据
	 * @return 数据队列
	 * 
	 */
	public static List<List<?>> parseExcel(byte[] file, int heaCount, int colCount) throws Exception {
		
		List<List<?>> dataList = null; //返回值
		Workbook workbook = Workbook.getWorkbook(new ByteArrayInputStream(file)); //电子表格
		Sheet[] sheets = workbook.getSheets(); //得到所有Sheet
		
		if(sheets.length >= 1){
			Sheet sheet = workbook.getSheet(0); //只读取第一个Sheet
			dataList = parseSheet(sheet, heaCount, colCount); //解析指定Sheet的前几列数据
		} else {
			exception("解析Excel文件出错!");
		}

		return dataList;
		
	}
	
	/**
	 * 解析Excel电子表格(指定工作表Sheet索引,从0开始)
	 * 返回值数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * @param filePath 文件路径
	 * @param shtIndex 工作表索引
	 * @param heaCount 表头行数
	 * @param colCount 前几列数据
	 * @return 数据队列
	 * 
	 */
	public static List<List<?>> parseExcel(String filePath, int shtIndex, int heaCount, int colCount) throws Exception {
		
		List<List<?>> dataList = null; //返回值
		Workbook workbook = Workbook.getWorkbook(new File(filePath)); //电子表格
		Sheet[] sheets = workbook.getSheets(); //得到所有Sheet
		
		if(sheets.length >= (shtIndex + 1)){
			Sheet sheet = workbook.getSheet(shtIndex); //读取指定Sheet
			dataList = parseSheet(sheet, heaCount, colCount); //解析指定Sheet的前几列数据
		} else {
			exception("解析Excel文件出错!");
		}

		return dataList;
		
	}
	
	/**
	 * 解析Excel电子表格(指定工作表Sheet索引,从0开始)
	 * 返回值数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * @param file 文件字节数组
	 * @param shtIndex 工作表索引
	 * @param heaCount 表头行数
	 * @param colCount 前几列数据
	 * @return 数据队列
	 * 
	 */
	public static List<List<?>> parseExcel(byte[] file, int shtIndex, int heaCount, int colCount) throws Exception {
		
		List<List<?>> dataList = null; //返回值
		Workbook workbook = Workbook.getWorkbook(new ByteArrayInputStream(file)); //电子表格
		Sheet[] sheets = workbook.getSheets(); //得到所有Sheet
		
		if(sheets.length >= (shtIndex + 1)){
			Sheet sheet = workbook.getSheet(shtIndex); //读取指定Sheet
			dataList = parseSheet(sheet, heaCount, colCount); //解析指定Sheet的前几列数据
		} else {
			exception("解析Excel文件出错!");
		}

		return dataList;
		
	}
	
	/**
	 * 根据列索引(从0开始),获取指定列数据
	 * 目标数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * 返回值队列中每一项为单元格中的值
	 * @param dataList 目标数据队列
	 * @param colIndex 列索引
	 * @return 返回值数据队列
	 * 
	 */
	public static List<?> getColData(List<List<?>> dataList, int colIndex){
		
		List<Object> colData = new ArrayList<Object>();
		for(int i = 0; i < dataList.size(); i++){
			List<?> rowData = (List<?>) dataList.get(i); //行数据队列
			colData.add(rowData.get(colIndex)); //获取每行指定列对应单元格的值
		}
		
		return colData;
		
	}
	
	/**
	 * 校验列数据,返回非空校验信息
	 * @param colData 需要验证的列数据
	 * @param heaCount 表头行数
	 * @param keyword 关键字
	 * @return 非空校验信息
	 * 
	 */
	public static String chkColData(List<?> colData, int heaCount, String keyword){
		
		StringBuffer msg = new StringBuffer();
		for(int i = 0; i < colData.size(); i++){
			
			String value = (String) colData.get(i); //单元格值
			if(value == null || value.trim().length() == 0){
				msg.append("导入模板中第").append(heaCount + i + 1);
				msg.append("行").append(keyword).append("为空!").append("\n");
			}
			
		}
		
		return msg.toString();
		
	}
	
	/**
	 * 解析指定Sheet的指定前几列数据
	 * 返回值数据队列中的每一项为子队列,子队列中包含表格中的一行数据
	 * @param sheet 指定表联
	 * @param heaCount 表头行数
	 * @param colCount 前几列
	 * @return 返回值数据队列
	 * 
	 */
	private static List<List<?>> parseSheet(Sheet sheet, int heaCount, int colCount) throws Exception {
		
		List<List<?>> sheetData = new ArrayList<List<?>>(); //返回值
		int rowCounts = sheet.getRows(); //行数
		int colCounts = sheet.getColumns(); //列数
		if(rowCounts > heaCount && colCounts >= colCount){

			for(int i = heaCount; i < rowCounts; ++i){
				
				List<Object> rowData = new ArrayList<Object>(); //行数据队列
				for (int j = 0; j < colCount; ++j){

					Cell cell = sheet.getCell(j, i); //参数为(列,行)
					String value = cell.getContents(); //得到单元格中的数据
					rowData.add(value.trim()); //每行有多列数据
					
				}
				boolean flag = isNull(rowData); //是否空行
				if(!flag){
					sheetData.add(rowData); //Sheet中含多行数据
				}
				
			}
			
		} else {
			exception("解析Excel文件出错!");
		}

		return sheetData;
		
	}

	/**
	 * 判断是否是空队列(空行)
	 * 解析电子表格时,有些空行会被读取到,需要剔除掉空行
	 */
	private static boolean isNull(List<?> rowList) {
		
		for(int i = 0; i < rowList.size(); i++){
			String value = (String) rowList.get(i); //单元格数据
			if(value != null && value.trim().length() > 0){
				return false;
			}
		}
		
		return true;
		
	}
	
	/**
	 * 抛出异常
	 */
	private static void exception(String message) throws Exception{
		System.out.println(message);
		throw new Exception(message);
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值