所解析的电子表格需为.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);
}
}