excel数据转list
来源:互联网 发布:一直正在连接tor网络 编辑:程序博客网 时间:2024/06/05 21:34
工作中需要将一个产品excel数据转化为一种grammar规则文件,就需要获取到excel的数据进行处理,现在总结下思路;
这里注明:尽量使用Apache公司下的poi包
原因:
- apache公司继续在维护;
支持2007版本以后的excel;
- javabean
- excelImportexcel工具类
- 调用的接口
- excel
1.javabean
public class LoanUseBean implements Serializable{ private String enUse; private String chUse; public String getEnUse() { return enUse; } public void setEnUse(String enUse) { this.enUse = enUse; } public String getChUse() { return chUse; } public void setChUse(String chUse) { this.chUse = chUse; }}
2.excel工具类
public class ExcelImpotUtils { private static final Logger logger = LoggerFactory.getLogger(ExcelImpotUtils.class); static private Workbook wb; static private Sheet sheet; /** * @param in :承载着Excel的输入流 * @param sheetIndex :要导入的工作表序号 * @param skipRows 跳过读取的条数,默认为0 * @param entityClass :List中对象的类型(Excel中的每一行都要转化为该类型的对象) * @param fieldMap :Excel中的中文列头和类的英文属性的对应关系Map * @param fileName :文件名 * @return :List * @throws ServiceException * @MethodName : excelToList * @Description : 将Excel转化为List */ public static <T> List<T> excelToList(InputStream in, int sheetIndex, int skipRows, Class<T> entityClass, List<FieldDefine> fieldMap, String fileName) throws ServiceException { // 定义要返回的list List<T> resultList = new ArrayList<>(); try { // 根据Excel数据源创建WorkBook String postfix = fileName.substring(fileName.lastIndexOf("."), fileName.length()); if (postfix.equals(".xls")) { // 针对 2003 Excel 文件 wb = new HSSFWorkbook(in); //获取excel文件某个sheet sheet = wb.getSheetAt(sheetIndex); } else { // 针对2007 Excel 文件 wb = new XSSFWorkbook(in); sheet = wb.getSheetAt(sheetIndex); } // 获取工作表 Integer rowCount = sheet.getLastRowNum(); Row firstRow = sheet.getRow(skipRows); String[] excelFieldNames = new String[firstRow.getLastCellNum()]; // 获取Excel中的列名 for (int i = 0; i < firstRow.getLastCellNum(); i++) { Cell currentCell = firstRow.getCell(i); excelFieldNames[i] = currentCell.getStringCellValue(); } // 将列名和列号放入Map中,这样通过列名就可以拿到列号 HashMap<String, Integer> colMap = new HashMap<>(); for (int i = 0; i < excelFieldNames.length; i++) { colMap.put(excelFieldNames[i], firstRow.getCell(i).getColumnIndex()); } // 将sheet转换为list for (int i = 1; i <= rowCount; i++) { // 新建要转换的对象,每一行都可以理解为一个对象 T entity = entityClass.newInstance(); // 给对象中的字段赋值 for (FieldDefine field : fieldMap) { // 获取中文字段名 String cnName = field.title; // 获取英文字段名 String enName = field.fieldName; // 根据中文字段名获取列号 int col = colMap.get(enName); // 获取当前单元格中的内容 String content = getCellFormatValue(sheet.getRow(i).getCell(col)); // 给对象赋值 setFieldValueByName(enName, content, entity); } resultList.add(entity); } } catch (Exception e) { logger.error("异常:", e); throw new ServiceException("excel转list异常"); } return resultList; } public static <T> List<T> excelToList(InputStream in, Class<T> entityClass, List<FieldDefine> fieldMap, String fileName) throws ServiceException { return excelToList(in, 0, 0, entityClass, fieldMap, fileName); } /** * @param in * @param skipRows 跳过读取的条数,默认为0 */ public static <T> List<T> excelToList(InputStream in, int skipRows, Class<T> entityClass, List<FieldDefine> fieldMap, String fileName) throws ServiceException { return excelToList(in, 0, skipRows, entityClass, fieldMap, fileName); } /** * @param fieldName 字段名 * @param clazz 包含该字段的类 * @return 字段 * @MethodName : getFieldByName * @Description : 根据字段名获取字段 */ private static Field getFieldByName(String fieldName, Class<?> clazz) { // 拿到本类的所有字段 Field[] selfFields = clazz.getDeclaredFields(); // 如果本类中存在该字段,则返回 for (Field field : selfFields) { if (field.getName().equals(fieldName)) { return field; } } // 否则,查看父类中是否存在此字段,如果有则返回 Class<?> superClazz = clazz.getSuperclass(); if (superClazz != null && superClazz != Object.class) { return getFieldByName(fieldName, superClazz); } // 如果本类和父类都没有,则返回空 return null; } /** * 根据Cell类型设置数据 */ private static String getCellFormatValue(Cell cell) { String cellvalue; if (cell != null) { // 判断当前Cell的Type switch (cell.getCellType()) { // 如果当前Cell的Type为NUMERIC case Cell.CELL_TYPE_NUMERIC: case Cell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); cellvalue = sdf.format(date); } else { // 如果是纯数字取得当前Cell的数值 cellvalue = String.valueOf(cell.getNumericCellValue()); } break; } // 如果当前Cell的Type为STRIN case Cell.CELL_TYPE_STRING: // 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; default: // 默认的Cell值 cellvalue = " "; } } else { cellvalue = ""; } return cellvalue; } /** * @param fieldName 字段名 * @param fieldValue 字段值 * @param entity 对象 * @MethodName : setFieldValueByName * @Description : 根据字段名给对象的字段赋值 */ private static void setFieldValueByName(String fieldName, Object fieldValue, Object entity) throws Exception { //通过反射得到成员变量 Field field = getFieldByName(fieldName, entity.getClass()); if (field != null) { //暴力反射:获取本类private修饰的成员变量 field.setAccessible(true); // 获取成员变量类型 Class<?> fieldType = field.getType(); // 根据字段类型给字段赋值 if (String.class == fieldType) { field.set(entity, String.valueOf(fieldValue)); } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) { field.set(entity, NumberUtils.createNumber(fieldValue.toString()).intValue()); } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) { field.set(entity, NumberUtils.createNumber(fieldValue.toString()).longValue()); } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) { field.set(entity, NumberUtils.createNumber(fieldValue.toString()).floatValue()); } else if ((Short.TYPE == fieldType) || (Short.class == fieldType)) { field.set(entity, NumberUtils.createNumber(fieldValue.toString()).shortValue()); } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) { field.set(entity, NumberUtils.createNumber(fieldValue.toString()).doubleValue()); } else if (Character.TYPE == fieldType) { if ((fieldValue != null) && (fieldValue.toString().length() > 0)) { field.set(entity, Character.valueOf(fieldValue.toString().charAt(0))); } } else if (Date.class == fieldType) { field.set(entity, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(fieldValue.toString())); } else { field.set(entity, fieldValue); } } else { throw new ServiceException("获取excel数据异常,请检查excel数据是否异常"); } } public static class FieldDefine { private String title; private String fieldName; public FieldDefine(String title, String fieldName) { this.fieldName = fieldName; this.title = title; } }}
3.如何调用
public static List<LoanUseBean> getUseBean(String path) { //获取excel流 InputStream inputStream = getInputstream(path); //增加两个内部类对象,表示excel中文列名和javabean类的字段属性 List<ExcelImpotUtils.FieldDefine> fieldDefineList = new ArrayList<ExcelImpotUtils.FieldDefine>(); fieldDefineList.add(new ExcelImpotUtils.FieldDefine("中文", "chUse")); fieldDefineList.add(new ExcelImpotUtils.FieldDefine("英文", "enUse")); //调用工具类,获取第二个sheet的所有数据 List<LoanUseBean> LoanUseBean = ExcelImpotUtils.excelToList(inputStream, 1, 0, LoanUseBean.class, fieldDefineList, path); return LoanUseBean;}//调用方法的入口public static void main(String[] args){ List<LoanUseBean> list=getUseBean("/loan.xls");}
经测试可以获得excel数据
阅读全文
0 0
- excel数据转list
- List导出数据Excel
- List导出数据Excel
- 将List数据写到EXCEL
- SharePoint 2010 EXCEL数据导入到List
- 将List数据保存到Excel中
- java poi导出list数据到excel
- 如何从Excel中把数据导入到SharePoint List(Import Excel data to SharePoint List)
- 如何从Excel中把数据导入到SharePoint List(Import Excel data to SharePoint List)
- Import SpreedSheet 从Excel中导入数据生成SharePoint List
- jsp页面导出当前list数据列表 excel
- 使用NPOI导出List数据为Excel文件
- 【ITOO 1】将List数据导出Excel表
- C#将List中的数据导入Excel文件中
- java将List中的数据导入到excel表中
- 上传Excel表格转List处理
- java List集合转Excel表格文档
- JSON格式数据转List
- LA --- 2965 Jurassic Remains 数相同的大写字母 【思维 + 状态压缩枚举 + 中途相遇法(折半搜索)】
- RCNN,Fast RCNN,Faster RCNN 总结
- HTML5-bootstrap-js plugin
- delphi Format格式化函数
- Artificial Intelligence
- excel数据转list
- oracal的列操作
- BufferedInputStream
- 位数(digit)
- java后台DecimalFormat处理数字,3位加逗号分隔
- 经纬度测距工具
- poj 3616 简单dp
- PMM-Client的Client-Name如何修改
- 如何完善GAN?