- 浏览: 9943 次
- 性别:
- 来自: 杭州
最新评论
更新时间:2017年4月12日11:46:14
修改日志:
1.读取完毕,关闭流
2.修复传入指定行为空的时候,死循环的重大bug
/**
* Project Name:
* File Name:ExcelUtil.java
* Package Name:com.lkx.util
* Date:2016年12月9日下午6:13:43
* Copyright (c)
*
*/
package com.lkx.util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
/**
*
* ClassName: ExcelUtil Function: TODO ADD FUNCTION Reason: TODO ADD REASON(可选)
* date: 2016年12月9日 下午6:07:11
*
* 只需要两步即可完成以前复杂的Excel读取
* 用法步骤:
* 1.定义需要读取的表头字段和表头对应的属性字段 String keyValue = "手机名称:phoneName,颜色:color,售价:price";
* 2.读取数据 List<PhoneModel> list = ExcelUtil.readXls("C://test.xlsx", ExcelUtil.getMap(keyValue),"com.lkx.excel.PhoneModel");
*
* @author likaixuan
* @version
* @since JDK 1.7
*/
public class ExcelUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);
/**
* getMap:(将传进来的表头和表头对应的属性存进Map集合,表头字段为key,属性为value)
*
* @author likaixuan
* @param 把传进指定格式的字符串解析到Map中
* 形如: String keyValue = "手机名称:phoneName,颜色:color,售价:price";
* @return
* @since JDK 1.7
*/
public static Map<String, String> getMap(String keyValue) {
Map<String, String> map = new HashMap<String, String>();
if (keyValue != null) {
String[] str = keyValue.split(",");
for (String element : str) {
String[] str2 = element.split(":");
map.put(str2[0], str2[1]);
}
}
return map;
}
/**
* readXls:(根据传进来的map集合读取Excel) 传进来4个参数,
* 第一个Excel文件所在位置
* 第二个map集合,形如<String,String>类型,如ExcelUtil开头说明
* 第三个要转换类所在包
* 第四个为可变参数,如果传改参数,表示将从该行开始读取
* @author likaixuan
* @param filePath
* @param map
* @param classPath
* @return
* @throws Exception
* @since JDK 1.7
*/
public static <T> List<T> readXls(String filePath, Map map,
String classPath, int... rowNumIndex) throws Exception {
Set keySet = map.keySet();// 返回键的集合
/** 反射用 **/
Class<?> demo = null;
Object obj = null;
/** 反射用 **/
List<Object> list = new ArrayList<Object>();
demo = Class.forName(classPath);
String fileType = filePath.substring(filePath.lastIndexOf(".") + 1,
filePath.length());
InputStream is = new FileInputStream(filePath);
Workbook wb = null;
if (fileType.equals("xls")) {
wb = new HSSFWorkbook(is);
} else if (fileType.equals("xlsx")) {
wb = new XSSFWorkbook(is);
} else {
log.error("您输入的excel格式不正确");
throw new Exception("您输入的excel格式不正确");
}
for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {// 获取每个Sheet表
int rowNum_x = -1;// 记录第x行为表头
Map<String, Integer> cellmap = new HashMap<String, Integer>();// 存放每一个field字段对应所在的列的序号
Sheet hssfSheet = wb.getSheetAt(sheetNum);
// 循环行Row
for (int rowNum = 0; rowNum <= hssfSheet
.getLastRowNum(); rowNum++) {
if (rowNumIndex != null && rowNumIndex.length > 0
&& rowNum_x == -1) {//如果传值指定从第几行开始读,就不自动寻找
Row hssfRow = hssfSheet.getRow(rowNumIndex[0]);
if (hssfRow == null) {
throw new RuntimeException("指定的行为空,请检查");
}
rowNum = rowNumIndex[0] - 1;
}
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
boolean flag = false;
for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
if (hssfRow.getCell(i) != null && !("")
.equals(hssfRow.getCell(i).toString().trim())) {
flag = true;
}
}
if (!flag) {
continue;
}
if (rowNum_x == -1) {
// 循环列Cell
for (int cellNum = 0; cellNum <= hssfRow
.getLastCellNum(); cellNum++) {
Cell hssfCell = hssfRow.getCell(cellNum);
if (hssfCell == null) {
continue;
}
String tempCellValue = hssfSheet.getRow(rowNum)
.getCell(cellNum).getStringCellValue();
tempCellValue = StringUtils.remove(tempCellValue,
(char) 160);
tempCellValue = tempCellValue.trim();
Iterator it = keySet.iterator();
while (it.hasNext()) {
Object key = it.next();
if (StringUtils.isNotBlank(tempCellValue)
&& StringUtils.equals(tempCellValue,
key.toString())) {
rowNum_x = rowNum;
cellmap.put(map.get(key).toString(), cellNum);
}
}
if (rowNum_x == -1) {
log.error("没有找到对应的字段或者对应字段行上面含有不为空白的行字段");
throw new Exception("没有找到对应的字段或者对应字段行上面含有不为空白的行字段");
}
}
} else {
obj = demo.newInstance();
Iterator it = keySet.iterator();
while (it.hasNext()) {
Object key = it.next();
Integer cellNum_x = cellmap.get(map.get(key).toString());
if (cellNum_x == null || hssfRow.getCell(cellNum_x) == null) {
continue;
}
String attr = map.get(key).toString();// 得到属性
Class<?> attrType = BeanUtils.findPropertyType(attr,new Class[] { obj.getClass() });
Cell cell = hssfRow.getCell(cellNum_x);
getValue(cell, obj, attr, attrType, rowNum, cellNum_x,key);
}
list.add(obj);
}
}
}
is.close();
// wb.close();
return (List<T>) list;
}
/**
* setter:(反射的set方法给属性赋值)
*
* @author likaixuan
* @param obj
* 具体的类
* @param att
* 类的属性@注意首字母记得大写
* @param value
* 赋予属性的值
* @param type
* 属性是哪种类型 比如:String double boolean等类型
* @throws Exception
* @since JDK 1.7
*/
public static void setter(Object obj, String att, Object value,
Class<?> type, int row, int col, Object key) throws Exception {
try {
Method method = obj.getClass().getMethod(
"set" + StringUtil.toUpperCaseFirstOne(att), type);
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:" + key
+ " 赋值异常 " + e.getStackTrace());
throw new Exception("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:"
+ key + " 赋值异常 ");
}
}
/**
* getValue:(得到Excel列的值)
*
* @author likaixuan
* @param hssfCell
* @return
* @throws Exception
* @since JDK 1.7
*/
public static void getValue(Cell cell, Object obj, String attr,
Class attrType, int row, int col, Object key) throws Exception {
Object val = null;
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
val = cell.getBooleanCellValue();
} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
if (attrType == String.class) {
val = sdf.format(DateUtil
.getJavaDate(cell.getNumericCellValue()));
} else {
val = DateFormateUtil.dateConvertFormat(
sdf.format(DateUtil.getJavaDate(
cell.getNumericCellValue())));
}
} catch (ParseException e) {
LOGGER.error("日期格式转换错误");
throw new Exception("第" + (row + 1) + " 行 " + (col + 1)
+ "列 属性:" + key + " 日期格式转换错误 ");
}
} else {
if (attrType == String.class) {
cell.setCellType(Cell.CELL_TYPE_STRING);
val = cell.getStringCellValue();
} else if (attrType == BigDecimal.class) {
val = new BigDecimal(cell.getNumericCellValue());
} else if (attrType == long.class) {
val = (long) cell.getNumericCellValue();
} else if (attrType == Double.class) {
val = cell.getNumericCellValue();
} else if (attrType == Float.class) {
val = (float) cell.getNumericCellValue();
} else if (attrType == int.class || attrType == Integer.class) {
val = (int) cell.getNumericCellValue();
} else if(attrType == Short.class){
val = (short) cell.getNumericCellValue();
}else{
val = cell.getNumericCellValue();
}
}
} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
val = cell.getStringCellValue();
}
setter(obj, attr, val, attrType, row, col, key);
}
}
<!--引用类-->
/**
* Project Name:servicetemplate
* File Name:StringUtil.java
* Package Name:com.lkx.comm
* Date:2016年12月30日下午4:36:03
* Copyright (c)
*
*/
package com.lkx.util;
import java.util.ArrayList;
import java.util.List;
/**
* ClassName:StringUtil Function: TODO ADD FUNCTION. Reason: TODO ADD REASON.
* Date: 2016年12月30日 下午4:36:03
*
* @author lifahui
* @version V1.0
* @since JDK 1.7
* @see
*/
public class StringUtil {
/**
* 首字母转小写
*
* @param s
* @return
*/
public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0))) {
return s;
} else {
return (new StringBuilder())
.append(Character.toLowerCase(s.charAt(0)))
.append(s.substring(1)).toString();
}
}
/**
* 首字母转大写
*
* @param s
* @return
*/
public static String toUpperCaseFirstOne(String s) {
if (Character.isUpperCase(s.charAt(0))) {
return s;
} else {
return (new StringBuilder())
.append(Character.toUpperCase(s.charAt(0)))
.append(s.substring(1)).toString();
}
}
/**
* replace:(替换字符串函数)
*
* @param strSource
* 源字符串
* @param strFrom
* 要替换的子串
* @param strTo
* 替换为的字符串
* @return
* @since JDK 1.7
*/
public static String replace(String strSource, String strFrom,
String strTo) {
// 如果要替换的子串为空,则直接返回源串
if (strFrom == null || strFrom.equals(""))
return strSource;
String strDest = "";
// 要替换的子串长度
int intFromLen = strFrom.length();
int intPos;
// 循环替换字符串
while ((intPos = strSource.indexOf(strFrom)) != -1) {
// 获取匹配字符串的左边子串
strDest = strDest + strSource.substring(0, intPos);
// 加上替换后的子串
strDest = strDest + strTo;
// 修改源串为匹配子串后的子串
strSource = strSource.substring(intPos + intFromLen);
}
// 加上没有匹配的子串
strDest = strDest + strSource;
// 返回
return strDest;
}
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<String>();
for(int i=0;i<100;i++){
list.add("likaixuan"+i);
}
int oneNum = 99;
String ids = "";
for(int i=0;i<list.size();i++){
if((i+1)%oneNum == 0 || ((i+1)==list.size())){
ids+=list.get(i)+",";
System.out.println("============"+ids);
ids="";
}else{
ids+=list.get(i)+",";
}
}
}
}
<!-- pom引入 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
修改日志:
1.读取完毕,关闭流
2.修复传入指定行为空的时候,死循环的重大bug
/**
* Project Name:
* File Name:ExcelUtil.java
* Package Name:com.lkx.util
* Date:2016年12月9日下午6:13:43
* Copyright (c)
*
*/
package com.lkx.util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
/**
*
* ClassName: ExcelUtil Function: TODO ADD FUNCTION Reason: TODO ADD REASON(可选)
* date: 2016年12月9日 下午6:07:11
*
* 只需要两步即可完成以前复杂的Excel读取
* 用法步骤:
* 1.定义需要读取的表头字段和表头对应的属性字段 String keyValue = "手机名称:phoneName,颜色:color,售价:price";
* 2.读取数据 List<PhoneModel> list = ExcelUtil.readXls("C://test.xlsx", ExcelUtil.getMap(keyValue),"com.lkx.excel.PhoneModel");
*
* @author likaixuan
* @version
* @since JDK 1.7
*/
public class ExcelUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);
/**
* getMap:(将传进来的表头和表头对应的属性存进Map集合,表头字段为key,属性为value)
*
* @author likaixuan
* @param 把传进指定格式的字符串解析到Map中
* 形如: String keyValue = "手机名称:phoneName,颜色:color,售价:price";
* @return
* @since JDK 1.7
*/
public static Map<String, String> getMap(String keyValue) {
Map<String, String> map = new HashMap<String, String>();
if (keyValue != null) {
String[] str = keyValue.split(",");
for (String element : str) {
String[] str2 = element.split(":");
map.put(str2[0], str2[1]);
}
}
return map;
}
/**
* readXls:(根据传进来的map集合读取Excel) 传进来4个参数,
* 第一个Excel文件所在位置
* 第二个map集合,形如<String,String>类型,如ExcelUtil开头说明
* 第三个要转换类所在包
* 第四个为可变参数,如果传改参数,表示将从该行开始读取
* @author likaixuan
* @param filePath
* @param map
* @param classPath
* @return
* @throws Exception
* @since JDK 1.7
*/
public static <T> List<T> readXls(String filePath, Map map,
String classPath, int... rowNumIndex) throws Exception {
Set keySet = map.keySet();// 返回键的集合
/** 反射用 **/
Class<?> demo = null;
Object obj = null;
/** 反射用 **/
List<Object> list = new ArrayList<Object>();
demo = Class.forName(classPath);
String fileType = filePath.substring(filePath.lastIndexOf(".") + 1,
filePath.length());
InputStream is = new FileInputStream(filePath);
Workbook wb = null;
if (fileType.equals("xls")) {
wb = new HSSFWorkbook(is);
} else if (fileType.equals("xlsx")) {
wb = new XSSFWorkbook(is);
} else {
log.error("您输入的excel格式不正确");
throw new Exception("您输入的excel格式不正确");
}
for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {// 获取每个Sheet表
int rowNum_x = -1;// 记录第x行为表头
Map<String, Integer> cellmap = new HashMap<String, Integer>();// 存放每一个field字段对应所在的列的序号
Sheet hssfSheet = wb.getSheetAt(sheetNum);
// 循环行Row
for (int rowNum = 0; rowNum <= hssfSheet
.getLastRowNum(); rowNum++) {
if (rowNumIndex != null && rowNumIndex.length > 0
&& rowNum_x == -1) {//如果传值指定从第几行开始读,就不自动寻找
Row hssfRow = hssfSheet.getRow(rowNumIndex[0]);
if (hssfRow == null) {
throw new RuntimeException("指定的行为空,请检查");
}
rowNum = rowNumIndex[0] - 1;
}
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
boolean flag = false;
for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
if (hssfRow.getCell(i) != null && !("")
.equals(hssfRow.getCell(i).toString().trim())) {
flag = true;
}
}
if (!flag) {
continue;
}
if (rowNum_x == -1) {
// 循环列Cell
for (int cellNum = 0; cellNum <= hssfRow
.getLastCellNum(); cellNum++) {
Cell hssfCell = hssfRow.getCell(cellNum);
if (hssfCell == null) {
continue;
}
String tempCellValue = hssfSheet.getRow(rowNum)
.getCell(cellNum).getStringCellValue();
tempCellValue = StringUtils.remove(tempCellValue,
(char) 160);
tempCellValue = tempCellValue.trim();
Iterator it = keySet.iterator();
while (it.hasNext()) {
Object key = it.next();
if (StringUtils.isNotBlank(tempCellValue)
&& StringUtils.equals(tempCellValue,
key.toString())) {
rowNum_x = rowNum;
cellmap.put(map.get(key).toString(), cellNum);
}
}
if (rowNum_x == -1) {
log.error("没有找到对应的字段或者对应字段行上面含有不为空白的行字段");
throw new Exception("没有找到对应的字段或者对应字段行上面含有不为空白的行字段");
}
}
} else {
obj = demo.newInstance();
Iterator it = keySet.iterator();
while (it.hasNext()) {
Object key = it.next();
Integer cellNum_x = cellmap.get(map.get(key).toString());
if (cellNum_x == null || hssfRow.getCell(cellNum_x) == null) {
continue;
}
String attr = map.get(key).toString();// 得到属性
Class<?> attrType = BeanUtils.findPropertyType(attr,new Class[] { obj.getClass() });
Cell cell = hssfRow.getCell(cellNum_x);
getValue(cell, obj, attr, attrType, rowNum, cellNum_x,key);
}
list.add(obj);
}
}
}
is.close();
// wb.close();
return (List<T>) list;
}
/**
* setter:(反射的set方法给属性赋值)
*
* @author likaixuan
* @param obj
* 具体的类
* @param att
* 类的属性@注意首字母记得大写
* @param value
* 赋予属性的值
* @param type
* 属性是哪种类型 比如:String double boolean等类型
* @throws Exception
* @since JDK 1.7
*/
public static void setter(Object obj, String att, Object value,
Class<?> type, int row, int col, Object key) throws Exception {
try {
Method method = obj.getClass().getMethod(
"set" + StringUtil.toUpperCaseFirstOne(att), type);
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:" + key
+ " 赋值异常 " + e.getStackTrace());
throw new Exception("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:"
+ key + " 赋值异常 ");
}
}
/**
* getValue:(得到Excel列的值)
*
* @author likaixuan
* @param hssfCell
* @return
* @throws Exception
* @since JDK 1.7
*/
public static void getValue(Cell cell, Object obj, String attr,
Class attrType, int row, int col, Object key) throws Exception {
Object val = null;
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
val = cell.getBooleanCellValue();
} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
if (attrType == String.class) {
val = sdf.format(DateUtil
.getJavaDate(cell.getNumericCellValue()));
} else {
val = DateFormateUtil.dateConvertFormat(
sdf.format(DateUtil.getJavaDate(
cell.getNumericCellValue())));
}
} catch (ParseException e) {
LOGGER.error("日期格式转换错误");
throw new Exception("第" + (row + 1) + " 行 " + (col + 1)
+ "列 属性:" + key + " 日期格式转换错误 ");
}
} else {
if (attrType == String.class) {
cell.setCellType(Cell.CELL_TYPE_STRING);
val = cell.getStringCellValue();
} else if (attrType == BigDecimal.class) {
val = new BigDecimal(cell.getNumericCellValue());
} else if (attrType == long.class) {
val = (long) cell.getNumericCellValue();
} else if (attrType == Double.class) {
val = cell.getNumericCellValue();
} else if (attrType == Float.class) {
val = (float) cell.getNumericCellValue();
} else if (attrType == int.class || attrType == Integer.class) {
val = (int) cell.getNumericCellValue();
} else if(attrType == Short.class){
val = (short) cell.getNumericCellValue();
}else{
val = cell.getNumericCellValue();
}
}
} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
val = cell.getStringCellValue();
}
setter(obj, attr, val, attrType, row, col, key);
}
}
<!--引用类-->
/**
* Project Name:servicetemplate
* File Name:StringUtil.java
* Package Name:com.lkx.comm
* Date:2016年12月30日下午4:36:03
* Copyright (c)
*
*/
package com.lkx.util;
import java.util.ArrayList;
import java.util.List;
/**
* ClassName:StringUtil Function: TODO ADD FUNCTION. Reason: TODO ADD REASON.
* Date: 2016年12月30日 下午4:36:03
*
* @author lifahui
* @version V1.0
* @since JDK 1.7
* @see
*/
public class StringUtil {
/**
* 首字母转小写
*
* @param s
* @return
*/
public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0))) {
return s;
} else {
return (new StringBuilder())
.append(Character.toLowerCase(s.charAt(0)))
.append(s.substring(1)).toString();
}
}
/**
* 首字母转大写
*
* @param s
* @return
*/
public static String toUpperCaseFirstOne(String s) {
if (Character.isUpperCase(s.charAt(0))) {
return s;
} else {
return (new StringBuilder())
.append(Character.toUpperCase(s.charAt(0)))
.append(s.substring(1)).toString();
}
}
/**
* replace:(替换字符串函数)
*
* @param strSource
* 源字符串
* @param strFrom
* 要替换的子串
* @param strTo
* 替换为的字符串
* @return
* @since JDK 1.7
*/
public static String replace(String strSource, String strFrom,
String strTo) {
// 如果要替换的子串为空,则直接返回源串
if (strFrom == null || strFrom.equals(""))
return strSource;
String strDest = "";
// 要替换的子串长度
int intFromLen = strFrom.length();
int intPos;
// 循环替换字符串
while ((intPos = strSource.indexOf(strFrom)) != -1) {
// 获取匹配字符串的左边子串
strDest = strDest + strSource.substring(0, intPos);
// 加上替换后的子串
strDest = strDest + strTo;
// 修改源串为匹配子串后的子串
strSource = strSource.substring(intPos + intFromLen);
}
// 加上没有匹配的子串
strDest = strDest + strSource;
// 返回
return strDest;
}
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<String>();
for(int i=0;i<100;i++){
list.add("likaixuan"+i);
}
int oneNum = 99;
String ids = "";
for(int i=0;i<list.size();i++){
if((i+1)%oneNum == 0 || ((i+1)==list.size())){
ids+=list.get(i)+",";
System.out.println("============"+ids);
ids="";
}else{
ids+=list.get(i)+",";
}
}
}
}
<!-- pom引入 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
相关推荐
"ExcelUtil万能读取类兼容03/07"指的是一个Java编程中的类库,设计用于读取不同版本的Excel文件,包括Microsoft Excel 2003(.xls格式)和2007以后的版本(.xlsx格式)。这类工具对于开发人员来说至关重要,因为它们...
《ExcelUtil便捷读取工具 v3.1.6——高效处理Excel数据的利器》 ExcelUtil便捷读取工具是一款高效且易用的Java库,专为处理Excel数据而设计,适用于各种开发场景,如数据分析、报表生成、数据导入导出等。在v3.1.6...
《ExcelUtil便捷读取工具 v3.1.5 源码分析》 在IT行业中,数据处理是一项至关重要的任务,而Excel作为一种广泛使用的电子表格工具,其数据处理能力强大,但手动操作效率较低。因此,开发能够高效读取和处理Excel...
为您提供ExcelUtil便捷读取工具下载,ExcelUtil 借助反射和 POI 对 Excel 读取,省略了以往读取 Excel 的繁琐步骤,调用 ExcelUtil 只需要2步,对,你没有看错,2步足以读取到 Excel 的内容。自动赋值,传入对应...
本篇将详细讲解如何利用Java的开源库Apache POI,结合反射机制,通过ExcelUtil工具类简化Excel读取的过程。 Apache POI是一个强大的库,它允许Java程序员创建、修改和展示MS Office格式的文件,包括Excel。在传统的...
ExcelUtil 借助反射和 POI 对 Excel 读取,省略了以往读取 Excel 的繁琐步骤,调用 ExcelUtil 只需要2步,对,你没有看错,2步足以读取到 Excel 的内容。自动赋值,传入对应Model所在路径,即可自动赋值。自动匹配...
通过上述步骤,你可以使用"ExcelUtil.java"工具类方便地读取和处理2007版及之后的Excel文件。这个工具类可以进一步封装成通用方法,适应不同的读取需求,例如指定读取的列范围、处理特定类型的单元格等,从而提高...
1. **读取Excel数据**:ExcelUtil可以读取Excel文件中的数据,并将其转换为Java对象集合。这通常涉及识别工作表、行和单元格,以及处理各种数据类型(如字符串、数字、日期等)的转换。 2. **写入Excel数据**:同样...
对于包含多个工作表的Excel文件,ExcelUtil可能提供创建、读取和写入特定工作表的方法。这使得处理大型数据集更为灵活。 7. **性能优化** 由于Excel文件可能包含大量数据,因此ExcelUtil可能包含性能优化策略,如...
`ExcelUtil` 是一个在Java开发中常用的工具类,用于处理Microsoft Excel文件。这个类通常包含了一系列静态方法,便于开发者对Excel数据进行读取、写入、格式转换等操作,而无需深入理解底层的API细节。Excel文件在...
ExcelUtil.java
在压缩包中的"ExcelUtil"文件可能是包含此类优化读取方法的工具类。这个类可能包含了读取超大Excel文件的静态方法,如`readExcelByChunks()`,并提供参数以自定义内存阈值和读取策略。 总之,处理超大XLSL文件时,...
ExcelUtil通常是一个Java库,用于读取、写入或者操作Excel表格数据,它可能是开发者自定义的一个实用工具类,或者是某个开源项目的一部分,如Apache POI或JExcelApi等。描述中的链接指向了博主DavidHHS在ITEYE上的...
java读取Excel文件中多个sheet,生成xml格式的文件
ExcelUtil提供了简单的API,可以用于创建、读取和修改Excel文件。通过调用静态方法,开发者可以快速实现各种Excel操作,例如: - 创建新的Excel工作簿:`ExcelUtil.createWorkbook()` - 添加工作表:`ExcelUtil....
本文将详细讲解如何利用Java编程语言读取Excel中的值,并将其用于替换文件内容中的键值对(key-value pairs)。 首先,我们要了解如何在Java中操作Excel。Java提供了多种库来实现这一功能,如Apache POI和JExcelAPI...
封装了excel工具类,只需要几行代码就能实现导入导出功能,适用导出List和List的类型。项目来源于:https://github.com/SargerasWang/ExcelUtil
本压缩包"excelUtil.zip"提供了两个关键类:`ExcelUtils`和`ExcelData`,它们是针对Excel操作的工具类,方便我们进行Excel文件的导出。 首先,`ExcelData`类是用来存储待导出的Excel数据的结构体。它通常包含两个...