有这么一个方法,用jxl包解析读取excel中值
public List getDataFromXLS(InputStream inputStream, boolean closeAFRead, String fileName, String dataClass, DictionaryBean dictBean) throws Exception {
List list;
Workbook workbook = null;
try {
IIntfConfigDAO intfConfigDAO = (IIntfConfigDAO) DAOFactory.getInstance().getDAO(IIntfConfigDAO.class);
colMap = intfConfigDAO.getXLSConfig(fileName);
workbook = Workbook.getWorkbook(inputStream);
Sheet sheet = workbook.getSheet(0);
int iCol = sheet.getColumns();
int i = 0;
allWidth = 400;
//得到所有列的名称及对应关系
for (i = 0; i < iCol; i++) {
Cell cell = sheet.getCell(i, 0);
if (cell == null)
continue;
String s = getCell(cell, "");
XLSConfig config = (XLSConfig) colMap.get(s);
if (config == null)
continue;
config.setColNum(i);
//config.setWidth(sheet.getColumnView(i).getSize()/256*10);
allWidth += config.getWidth();
}
//得到数据
i = 1;
list = new ArrayList();
int iRow = sheet.getRows(); //修改
while (true) {
if (i >= iRow) { //修改
break;
}
Cell cell1 = sheet.getCell(0, i);
Cell cell2 = sheet.getCell(1, i);
Cell cell3 = sheet.getCell(2, i);
if (cell1 == null && cell2 == null && cell3 == null)
break;
if (StringUtils.isNULLString(getCell(cell1, "")) && StringUtils.isNULLString(getCell(cell2, ""))
&& StringUtils.isNULLString(getCell(cell3, ""))) {
break;
}
Object obj = Class.forName(dataClass).newInstance();
XLSCommObj xlsCommObj = (XLSCommObj) obj;
for (Iterator iter = colMap.values().iterator(); iter.hasNext();) {
XLSConfig config = (XLSConfig) iter.next();
String xlsValue = null;
if (config.getColNum() >= 0) {
Cell cell = sheet.getCell(config.getColNum(), i);
xlsValue = StringUtils.trim(getCell(cell, config.getMask()));
BeanUtils.setProperty(obj, config.getFieldName(), xlsValue);
}
//取Key
String key = xlsValue;
String value = null;
if(config.getColNum() == -1){
xlsCommObj.addErrorMsg(config.getFieldName(), config.getColName() + " 列不存在");
continue;
}
validateObj(xlsCommObj, config, key);
if (StringUtils.isNULLString(xlsValue))
continue;
if ("1".equals(config.getFillWithCode())) {
if (xlsValue.indexOf(BizConstants.XLS_FILED_SELECT_COMMA) < 0) {
xlsCommObj.addinvalidErrorMsg(config.getFieldName(), config.getColName());
}
String[] keyValue = StringUtils.split(xlsValue, BizConstants.XLS_FILED_SELECT_COMMA);
key = keyValue[0];
value = keyValue[1];
}
if ("3".equals(config.getColType())) { //选择项自填
boolean isFindKey = false;
String[] dicKeyValue = StringUtils.split(config.getValueBound(), ";");
if (!StringUtils.isNULLStringArray(dicKeyValue)) {
for (int j = 0; j < dicKeyValue.length; j++) {
String[] keyValue = StringUtils.split(dicKeyValue[j], BizConstants.XLS_FILED_SELECT_COMMA);
if (StringUtils.equals(key, keyValue[0])) {
isFindKey = true;
value = keyValue[1];
break;
}
}
}
if (!isFindKey) {
xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
}
} else if ("4".equals(config.getColType())) { //选择项来自Dictionary
value = dictBean.getLemmaValue(config.getValueBound(), key);
if (StringUtils.isNULLString(value)) {
xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
}
} else if ("5".equals(config.getColType())) { //选择项来自定义SQL语句
value = intfConfigDAO.getCommSQLValue(config.getValueBound(), key);
if (StringUtils.isNULLString(value)) {
xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
}
}
if (!StringUtils.isNULLString(config.getCodeField())) {
BeanUtils.setProperty(obj, config.getCodeField(), key);
}
if (!StringUtils.isNULLString(config.getCospField())) {
BeanUtils.setProperty(obj, config.getCospField(), value);
}
}
validateObjOther(xlsCommObj);
list.add(obj);
i++;
}
return list;
} catch (Exception e) {
throw e;
} finally {
if (workbook != null) workbook.close();
if (closeAFRead) StreamUtils.closeInputStream(inputStream);
}
}
注释“//修改”是后来补充上去的值。如果没有这些判断,在读取excel对与某些模板会报错。
报错的模板统一特征就是没有限定记录数。也就是说,模板中定义了一些列,可能还为每列定义了格式,但是行数默认是65535(单个sheet最大记录数)。
对于jxl来说,对于不限定列数的情况下,它会自动筛选掉空的记录。也就是比如有一个上述的模板,含标题一共60行,则sheet.getRows()为40。当你getCell时,jxl会判断你的行列值是否在【sheet.getRows(), sheet.getColumns()】范围内,若大于它,则抛出数组下标越界异常。
所以在调用getCell(x,y)时,一定要注意取值范围。
分享到:
相关推荐
"jxl.biff.drawing.dg"和"jxl.biff.drawingdg"则涉及到Excel文件内部的结构,BIFF(Binary Interchange File Format)是Excel的二进制文件格式,其中"drawing"部分与Excel的图形元素相关,"dg"可能是Drawing Group的...
《使用jxl.jar包在Java中操作Excel文件的详尽指南》 在Java开发中,与Excel文件交互是一项常见的任务,比如数据导入、导出、分析等。jxl.jar库提供了一个强大的解决方案,使得开发者无需依赖Windows环境即可处理...
今天调试了一下,发现在jxl.write.biff.WritableSheetCopier.shallowCopyCells方法中有如下代码 Java代码 if (c.getCellFeatures() != null & c.getCellFeatures().hasDataValidation()) { validatedCells....
它包含了一个名为`jxl.jar`的可执行Java档案,这个档案集成了JExcelAPI的所有类和方法,使得开发人员可以方便地在Java应用程序中读写Excel文件。描述进一步提到,还有`jxl.api`文档,这是JExcelAPI的API参考,提供了...
安装jxl.jar非常简单,只需将其添加到项目的类路径中。在Java代码中,我们可以使用以下方式引入: ```java import jxl.*; ``` 创建Excel文件的第一步是创建`Workbook`对象,可以使用`Workbook.createWorkbook()`...
首先,需要将jxl.jar添加到项目类路径中,然后就可以通过其提供的API来实现各种功能。例如,可以创建一个新的工作簿,添加工作表,设置单元格的值,甚至可以处理公式和图表。对于读取操作,jxl.jar同样提供了方便的...
2. **读取Excel文件**:`jxl.read.biff.Biff8Reader`是读取Excel文件的核心类。以下是一个简单的例子,展示如何读取Excel工作簿中的第一个工作表: ```java import jxl.Sheet; import jxl.Workbook; public class ...
这里我们将深入探讨如何使用jxl.jar库在Android环境中操作Excel表格,特别是处理隐藏表的情况。 首先,jxl是一个Java库,它允许我们以编程方式读取和写入Microsoft Excel文件。由于Android系统基于Java,因此可以...
源码中,这些功能主要集中在`jxl.read.biff`和`jxl.write.biff`两个包中。BIFF(Binary Interchange File Format)是Excel早期版本的数据存储格式,而OpenXML是微软从2007版开始引入的新格式。 在读取Excel文件时,...
jxl导出excel必须的Jar包 import jxl.Workbook; import jxl.format.Alignment; import jxl.format.VerticalAlignment; import jxl.write.Label; import jxl.write....import jxl.write.biff.RowsExceededException;
jxl.jar 通过java操作excel表格的工具类库 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体、数字、日期操作 能够修饰单元格属性 支持图像和图表 应该说以上功能已经能够大致满足我们的需要。...
标题中的"jxl.jar和例子"表明了这个压缩包包含了一个名为"jxl.jar"的文件和相关的示例。这提示我们,这是一个关于使用Java处理Excel文件的资源包。jxl.jar是Java Excel API(JExcelApi)的一个版本,它是一个开源库...
import jxl.read.biff.BiffException; import jxl.Workbook; import jxl.Sheet; import jxl.Cell; Workbook workbook = Workbook.getWorkbook(new File("input.xls")); Sheet sheet = workbook.getSheet(0); Cell ...
import jxl.read.biff.BiffException; try { Workbook workbook = Workbook.getWorkbook(new File("yourfile.xls")); // ... } catch (BiffException | IOException e) { e.printStackTrace(); } ``` 2. 获取...
import jxl.read.biff.BiffException; FileInputStream fis = new FileInputStream("path_to_your_file.xls"); Workbook workbook = Workbook.getWorkbook(fis); Sheet sheet = workbook.getSheet(0); // 获取第一...
在Java项目中使用JXL.jar,首先需要将其添加到项目的类路径中。这可以通过将jar文件复制到项目的lib目录,或者在Maven或Gradle构建系统中声明依赖来实现。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml ...
jxl.jar是通过java操作excel表格的工具类库,开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的。
java实现数据的导入与导出依赖包 jxl.jar
jmeter在beanshell中创建Excel所需jar包-jxl.jar,有需要的伙伴欢迎可以下载,附脚本示例路径https://blog.csdn.net/m0_49009652/article/details/107690802