| | |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| | | import org.apache.poi.openxml4j.exceptions.InvalidFormatException; |
| | | import org.apache.poi.ss.usermodel.*; |
| | | import org.apache.poi.xssf.usermodel.XSSFPicture; |
| | | import org.apache.poi.xssf.usermodel.XSSFPictureData; |
| | | import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.io.*; |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.Method; |
| | | import java.util.*; |
| | |
| | | } |
| | | public ExcelImporter(String fileName, InputStream in, int headerNum, int sheetIndex,CellType cellType) |
| | | throws InvalidFormatException, IOException { |
| | | ByteArrayOutputStream buffer = toByteArray(in); |
| | | if (StringUtils.isBlank(fileName)){ |
| | | throw new RuntimeException("导入文档为空!"); |
| | | }else if(fileName.toLowerCase().endsWith("xls")){ |
| | | this.wb = new HSSFWorkbook(in); |
| | | this.wb = new HSSFWorkbook(new ByteArrayInputStream(buffer.toByteArray())); |
| | | }else if(fileName.toLowerCase().endsWith("xlsx")){ |
| | | this.wb = new XSSFWorkbook(in); |
| | | this.wb = new XSSFWorkbook(new ByteArrayInputStream(buffer.toByteArray())); |
| | | }else{ |
| | | throw new RuntimeException("文档格式不正确!"); |
| | | } |
| | |
| | | this.sheet = this.wb.getSheetAt(sheetIndex); |
| | | this.headerNum = headerNum; |
| | | this.changeType = cellType; |
| | | this.pictureList = ExcelPictureUtil.getExcelPictures(in); |
| | | this.pictureList = ExcelPictureUtil.getExcelPictures(new ByteArrayInputStream(buffer.toByteArray())); |
| | | log.debug("Initialize success."); |
| | | } |
| | | |
| | | public static ByteArrayOutputStream toByteArray(InputStream inputStream) { |
| | | try { |
| | | // 缓存文件流 |
| | | ByteArrayOutputStream buffer = new ByteArrayOutputStream(); |
| | | byte[] data = new byte[1024]; |
| | | int nRead; |
| | | while ((nRead = inputStream.read(data, 0, data.length))!= -1) { |
| | | buffer.write(data, 0, nRead); |
| | | } |
| | | buffer.flush(); |
| | | |
| | | return buffer; |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (Object[] os : annotationList){ |
| | | Object val = this.getCellValue(row, column++); |
| | | if (val != null){ |
| | | ExcelColumn ef = (ExcelColumn)os[0]; |
| | | // Get param type and type cast |
| | | Class<?> valType = Class.class; |
| | | if (os[1] instanceof Field){ |
| | | valType = ((Field)os[1]).getType(); |
| | | }else if(os[1] instanceof Method){ |
| | | Method method = ((Method)os[1]); |
| | | if ("get".equals(method.getName().substring(0, 3))){ |
| | | valType = method.getReturnType(); |
| | | }else if("set".equals(method.getName().substring(0, 3))){ |
| | | valType = ((Method)os[1]).getParameterTypes()[0]; |
| | | } |
| | | int tcolumn = column++; |
| | | Object val = this.getCellValue(row, tcolumn);; |
| | | ExcelColumn ef = (ExcelColumn)os[0]; |
| | | // Get param type and type cast |
| | | Class<?> valType = Class.class; |
| | | if (os[1] instanceof Field){ |
| | | valType = ((Field)os[1]).getType(); |
| | | }else if(os[1] instanceof Method){ |
| | | Method method = ((Method)os[1]); |
| | | if ("get".equals(method.getName().substring(0, 3))){ |
| | | valType = method.getReturnType(); |
| | | }else if("set".equals(method.getName().substring(0, 3))){ |
| | | valType = ((Method)os[1]).getParameterTypes()[0]; |
| | | } |
| | | //log.debug("Import value type: ["+i+","+column+"] " + valType); |
| | | try { |
| | | if (valType == String.class){ |
| | | String s = String.valueOf(val.toString()); |
| | | if(StringUtils.endsWith(s, ".0")){ |
| | | val = StringUtils.substringBefore(s, ".0"); |
| | | }else{ |
| | | val = String.valueOf(val.toString()).trim(); |
| | | } |
| | | if(ef.fieldType()== XSSFPictureData.class){ |
| | | XSSFPictureData qrData = null; |
| | | if(val !=null){ |
| | | String tid = String.valueOf(val.toString()).trim(); |
| | | int start = tid.indexOf("(\"")+2; |
| | | int end = tid.indexOf("\","); |
| | | if(start>=0&& end>=1 && end>start){ |
| | | String picId = tid.substring(start,end); |
| | | XSSFPictureData data = this.pictureList.get(picId); |
| | | if(data!= null && data.getData() != null){ |
| | | qrData =data; |
| | | } |
| | | } |
| | | else if (valType == Integer.class){ |
| | | val = Double.valueOf(val.toString()).intValue(); |
| | | }else if (valType == Long.class){ |
| | | val = Double.valueOf(val.toString()).longValue(); |
| | | }else if (valType == Double.class){ |
| | | val = Double.valueOf(val.toString()); |
| | | }else if (valType == Float.class){ |
| | | val = Float.valueOf(val.toString()); |
| | | }else if (valType == Date.class){ |
| | | val = DateUtil.getJavaDate((Double)val); |
| | | }else{ |
| | | if (ef.fieldType() != Class.class){ |
| | | val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString()); |
| | | }else{ |
| | | val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), |
| | | "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString()); |
| | | } |
| | | val = null; |
| | | //悬浮图片 |
| | | List<XSSFPictureData> xfData = ExcelPictureUtil.getPicturesFromCell(this.sheet,row.getCell(tcolumn)); |
| | | List<XSSFPictureData> valList =new ArrayList<>(); |
| | | if(qrData!=null){ |
| | | valList.add(qrData); |
| | | } |
| | | if(xfData!=null){ |
| | | valList.addAll(xfData); |
| | | } |
| | | if (valType==List.class){ |
| | | val =valList; |
| | | } else if ( valType==XSSFPictureData.class){ |
| | | val = (valList!=null && valList.size()>0)?valList.get(0):null; |
| | | } |
| | | }else{ |
| | | if (val != null){ |
| | | try { |
| | | if (valType == String.class){ |
| | | String s = String.valueOf(val.toString()); |
| | | if(StringUtils.endsWith(s, ".0")){ |
| | | val = StringUtils.substringBefore(s, ".0"); |
| | | }else{ |
| | | val = String.valueOf(val.toString()).trim(); |
| | | } |
| | | } |
| | | else if (valType == Integer.class){ |
| | | val = Double.valueOf(val.toString()).intValue(); |
| | | }else if (valType == Long.class){ |
| | | val = Double.valueOf(val.toString()).longValue(); |
| | | }else if (valType == Double.class){ |
| | | val = Double.valueOf(val.toString()); |
| | | }else if (valType == Float.class){ |
| | | val = Float.valueOf(val.toString()); |
| | | }else if (valType == Date.class){ |
| | | val = DateUtil.getJavaDate((Double)val); |
| | | }else if (valType == XSSFPictureData.class){ |
| | | }else{ |
| | | if (ef.fieldType() != Class.class){ |
| | | val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString()); |
| | | }else{ |
| | | val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), |
| | | "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString()); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | | log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); |
| | | val = null; |
| | | } |
| | | } catch (Exception ex) { |
| | | log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); |
| | | val = null; |
| | | } |
| | | // set entity value |
| | | if (os[1] instanceof Field){ |
| | | Reflections.invokeSetter(e, ((Field)os[1]).getName(), val); |
| | | }else if (os[1] instanceof Method){ |
| | | String mthodName = ((Method)os[1]).getName(); |
| | | if ("get".equals(mthodName.substring(0, 3))){ |
| | | mthodName = "set"+StringUtils.substringAfter(mthodName, "get"); |
| | | } |
| | | Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val}); |
| | | } |
| | | } |
| | | if (val != null){ |
| | | try { |
| | | // set entity value |
| | | if (os[1] instanceof Field){ |
| | | Reflections.invokeSetter(e, ((Field)os[1]).getName(), val); |
| | | }else if (os[1] instanceof Method){ |
| | | String mthodName = ((Method)os[1]).getName(); |
| | | if ("get".equals(mthodName.substring(0, 3))){ |
| | | mthodName = "set"+StringUtils.substringAfter(mthodName, "get"); |
| | | } |
| | | Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val}); |
| | | } |
| | | }catch (Exception e1){ |
| | | val =null; |
| | | } |
| | | }else{ |
| | | } |
| | | sb.append(val+", "); |
| | | } |