具体实现
以学生信息为例,将Excel模板信息配置在XML文件中,通过POI实现对excel文件读取操作,然后将读取的数据插入数据库中。具体思路是将模板信息配置在xml中,在项目启动时,通过spring初始化,将xml的配置信息读入缓存以备后面使用。导入通过springmvc跳转路由后,读取文件流。对excel文件进行循环遍历,拿到数据后和模板规范匹配,匹配成功后调用插入服务,将数据插入数据库中,最后将日志返回给前台

环境:spring+springMVC
  1. Excel模板配置
    对存入的学生信息的excel模板配置在XML文件中,并且将文件的配置在项目初始化的时候加载

(1) XML配置 excel-config.xml

<?xml version="1.0" encoding="GBK"?>
<root><!--   学生信息导入模板   --><excel id="studentinfo" service="StudentService" mehtod="addUser" headRow = "0" dataStartRow="1" desc="学生信息导入"><col index="0" field="stucode" dataType="string" format="" defVal="" validate="false" notNull="true" length="0"  text="学生代码"  /><col index="1" field="stuname" dataType="string" format="" defVal="" validate="false" notNull="true" length="0"  text="学生姓名"  /></excel>
</root>

(2) 根据自定义的XML文件,编写对应的pojo对象,表配置和列配置(ExcelConfig.java 和ColumnConfig.java )

public class ExcelConfig {private String id;//执行的业务private String service;//执行的方法private String mehtod;//表头所在行号private int headRow;//数据开始行号private int dataStartRow;//描述private String desc;//列信息private Map<String, ColumnConfig> columns = new HashMap<String, ColumnConfig>();private boolean validFlag;private String validMsg;public ExcelConfig(boolean validFlag, String validMsg) {this.validFlag = validFlag;this.validMsg = validMsg;}public String getId() {return id;}public void setId(String id) {this.id=id;}public String getService() {return service;}public void setService(String service) {this.service=service;}public String getMehtod() {return mehtod;}public void setMehtod(String mehtod) {this.mehtod=mehtod;}public int getHeadRow() {return headRow;}public void setHeadRow(int headRow) {this.headRow=headRow;}public int getDataStartRow() {return dataStartRow;}public void setDataStartRow(int dataStartRow) {this.dataStartRow=dataStartRow;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc=desc;}public Map<String, ColumnConfig> getColumns() {return columns;}public void setColumns(Map<String, ColumnConfig> columns) {this.columns=columns;}public boolean isValidFlag() {return validFlag;}public void setValidFlag(boolean validFlag) {this.validFlag=validFlag;}public String getValidMsg() {return validMsg;}public void setValidMsg(String validMsg) {this.validMsg=validMsg;}
}
public class ColumnConfig {private String index;private String field;private String dataType;private String format;private String defVal;private boolean validate;private boolean notNull;private int length;private String text;public String getIndex() {return index;}public void setIndex(String index) {this.index=index;}public String getField() {return field;}public void setField(String field) {this.field=field;}public String getDataType() {return dataType;}public void setDataType(String dataType) {this.dataType=dataType;}public String getFormat() {return format;}public void setFormat(String format) {this.format=format;}public String getDefVal() {return defVal;}public void setDefVal(String defVal) {this.defVal=defVal;}public boolean isValidate() {return validate;}public void setValidate(boolean validate) {this.validate=validate;}public boolean isNotNull() {return notNull;}public void setNotNull(boolean notNull) {this.notNull=notNull;}public int getLength() {return length;}public void setLength(int length) {this.length=length;}public String getText() {return text;}public void setText(String text) {this.text=text;}
}

(3) spring文件初始化配置

     <bean name="excelConfigDefaultInit" class="com.provider.ExcelConfigDefaultInit" ><property name="resource" value="WEB-INF/config/spring/excel/excel-config.xml" /></bean><bean id="contextInit" class="com.provider.ContextInit"init-method="init"><property name="loadList"><list><ref bean="excelConfigDefaultInit"/></list></property></bean>

(4) ExcelConfigDefaultInit类 ,通过dom4j来读取配置文件,将信息读入缓存中

项目初始化时加载excel配置文件public class ExcelConfigDefaultInit implements CacheLoadDefault{private Logger log =LoggerFactory.getLogger(getClass());private Resource resource;public Resource getResource() {return resource;}public void setResource(Resource resource) {this.resource=resource;}/*** 读取excel-config.xml配置文件,通过dom4j来读取*/@Overridepublic void readConfig() {//读取配置文件的流InputStream is = null;Document document = null;SAXReader saxReader = new SAXReader();try {is=resource.getInputStream();document = saxReader.read(is);//拿到根目录 rootElement rootelement = document.getRootElement();//拿到excel节点listList excellist = rootelement.elements("excel");//遍历excellist节点for(Object excelnode : excellist){//遍历excel节点,将配置的参数放进ExcelConfig中去ExcelConfig excelConfig = new ExcelConfig(true, "初始化配置");Element excelElm = (Element) excelnode;//idString excelId = excelElm.attributeValue("id");if (StringUtils.isEmpty(excelId)) {excelConfig.setValidFlag(false);excelConfig.setValidMsg("导入ID未配置!");} else {excelConfig.setId(excelId);}//处理类String beanName = excel.getAttribute("service");if (StringUtils.isEmpty(service)) {excelConfig.setValidFlag(false);excelConfig.setValidMsg("导入类未配置!");}excelConfig.setService(service);//导入方法String methodName = excel.getAttribute("mehtod");if (StringUtils.isEmpty(mehtod)) {excelConfig.setValidFlag(false);excelConfig.setValidMsg("导入方法未配置!");}excelConfig.setMehtod(mehtod);//headRow 表头所在行号String excelHeadRow = excelElm.attributeValue("headRow");if (StringUtils.isEmpty(excelHeadRow)) {excelConfig.setValidFlag(false);excelConfig.setValidMsg("表头所在行号未配置!");} else {excelConfig.setHeadRow(Integer.parseInt(excelHeadRow));}//dataStartRow 数据开始行String excelDataStartRow = excelElm.attributeValue("dataStartRow");if (StringUtils.isEmpty(excelDataStartRow)) {excelConfig.setValidFlag(false);excelConfig.setValidMsg("数据开始行号未配置!");} else {excelConfig.setDataStartRow(Integer.parseInt(excelDataStartRow));}//desc 任务名称 可为空String excelDesc = excelElm.attributeValue("desc");excelConfig.setDesc(excelDesc);//对列进行遍历 将配置的数据读入columnconfig//主要参数:index,field,datatype,format,defVal,validate,notnull,length,textIterator itcol = excelElm.selectNodes("col").iterator();while (itcol.hasNext()){ColumnConfig columnConfig = new ColumnConfig();Element colElm =(Element) itcol.next();String index = colElm.attributeValue("index");String field = colElm.attributeValue("field");String dataType = colElm.attributeValue("dataType");String dataFormat = colElm.attributeValue("format");String defVal = colElm.attributeValue("defVal");String validate = colElm.attributeValue("validate");String notNull = colElm.attributeValue("notnull");String length = colElm.attributeValue("length");String columnText = colElm.attributeValue("text");columnConfig.setIndex(index);columnConfig.setField(field);columnConfig.setDataType(StringUtils.isEmpty(dataType) ? "string" : dataType);columnConfig.setFormat(StringUtils.isEmpty(dataFormat) ? "" : dataFormat);columnConfig.setDefVal(StringUtils.isEmpty(defVal) ? "" : defVal);columnConfig.setValidate("true".equals(validate));columnConfig.setNotNull("true".equals(notNull));columnConfig.setLength(StringUtils.isEmpty(length) ? 0 : Integer.parseInt(length));columnConfig.setText(columnText);excelConfig.getColumns().put(index,columnConfig);}PmsCache.setImportConfig(excelId,excelConfig);}log.info("解析Excel导入配置完成");} catch (Exception e) {e.printStackTrace();throw new RuntimeException("解析Excel导入配置失败");}}

(5) 缓存类

public class PmsCache {private static Map<String, ExcelConfig> importConfig = new HashMap<String, ExcelConfig>();public static ExcelConfig getImportConfig(String excelId){return importConfig.get(excelId);}public static void setImportConfig(String excelId, ExcelConfig excelConfig){importConfig.put(excelId,excelConfig);}public static Map<String, ExcelConfig> getImportConfig() {return importConfig;}public static void setImportConfig(Map<String, ExcelConfig> importConfig) {PmsCache.importConfig = importConfig;}public static void clearImportConfig(String excelId){importConfig.clear();}
}

(6) 初始化加载类 ContextInit

public class ContextInit {private Logger log =LoggerFactory.getLogger(getClass());private List<CacheLoadDefault> loadList;public List<CacheLoadDefault> getLoadList() {return loadList;}public void setLoadList(List<CacheLoadDefault> loadList) {this.loadList=loadList;}public void init(){if(null != loadList){log.info("开始加载系统配置。。");for (CacheLoadDefault conf : loadList){conf.readConfig();}log.info("系统加载参数完毕!");}}
}public interface CacheLoadDefault {void readConfig();
}
  1. controller
@Controller
public class ImportFileController {@ResourceExcelImportService excelImportService;@RequestMapping({"/Import.do"})public void excelImport(HttpServletRequest request, HttpServletResponse response){try {Map<String,Object> params = getParams(request);//获取配置的上传地址String uploadPath = PropertyPlaceholder.getCtxProperties().get("ExcelImportPath").toString();File dir = new File(uploadPath);if(!dir.exists()){dir.mkdir();}MultipartHttpServletRequest multipartHttpServletRequest =(MultipartHttpServletRequest) request;CommonsMultipartFile cmf =(CommonsMultipartFile) multipartHttpServletRequest.getFile("file");String ofn = cmf.getOriginalFilename();//获取文件名称,包含扩展名String fileName =FilenameUtils.getName(ofn);//扩展名String fileExtName =FilenameUtils.getExtension(fileName);File file = new File(dir,fileName);cmf.getFileItem().write(file);if ("xls".equals(fileExtName) || "xlsx".equals(fileExtName)) {excelImportService.importExcel(params, file, request, response);} else {Map<String, Object> result = new HashMap<String, Object>();result.put("code", "2");result.put("msg", "上传文件出错:文件格式错误!");result.put("percent", "0");LogUtil.sendMsg(result, response);}} catch (Exception e) {e.printStackTrace();Map<String, Object> result = new HashMap<String, Object>();result.put("code", "2");result.put("msg", "上传文件出错:" + e.getMessage());result.put("percent", "100");LogUtil.sendMsg(result, response);}}/*** 解析请求中的参数,将参数放入Map中返回* @param request* @return*/public Map<String,Object> getParams(HttpServletRequest request){Map<String,Object> params = new HashMap<String, Object>();Enumeration parameterNames = request.getParameterNames();while (parameterNames.hasMoreElements()){String paramname =(String) parameterNames.nextElement();String paramValue = request.getParameter(paramname);params.put(paramname,paramValue);}return params;}}
  1. service层服务
@Service
public class ExcelImportServiceImpl implements ExcelImportService{private static String LOG_INFO = "0";private static String LOG_WARN = "1";private static String LOG_ERROR = "2";private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");// 格式化 number String 字符private static DecimalFormat df = new DecimalFormat("0");// 格式化数字private static DecimalFormat nf = new DecimalFormat("0");@Overridepublic void importExcel(Map<String, Object> params, File file, HttpServletRequest request, HttpServletResponse response) throws IOException {Map<String,Object> result = new HashMap<String, Object>();result.put("code",LOG_INFO);result.put("msg","开始解析文件...");result.put("percent","0");LogUtil.sendMsg(result, response);boolean succFlag = true;//从缓存中获取excel配置ExcelConfig excelConfig = PmsCache.getImportConfig((String) params.get("excelid"));//如果未读取配置以及validFlag为false 不处理if (excelConfig ==null){result.put("code", LOG_ERROR);result.put("msg", "模板转换参数未配置");result.put("percent", "0");LogUtil.sendMsg(result, response);succFlag = false;}else if(!excelConfig.isValidFlag()){result.put("code", LOG_ERROR);result.put("msg", excelConfig.getValidMsg());result.put("percent", "0");LogUtil.sendMsg(result, response);succFlag = false;}//对excel进行处理if (succFlag){succFlag = parseExcel(params,file,response,excelConfig);//处理完成后将导入的文件删除if(file.exists()) file.delete();}//返回结果处理if (succFlag){result.put("code", LOG_INFO);result.put("msg", "文件导入完成");}else{result.put("code", LOG_WARN);result.put("msg", "文件导入完成,处理失败,请检查!");}LogUtil.sendMsg(result, response);}/*** 解析Excel并且进行业务处理* @return*/private boolean parseExcel(Map<String,Object> params, File file, HttpServletResponse response, ExcelConfig excelConfig) {boolean succFlag = true;Map<String, Object> result = new HashMap<String, Object>();FileInputStream in = null;//先拿到headRow表头所在行号和startRow数据开始行int headRow = excelConfig.getHeadRow();int startRow = excelConfig.getDataStartRow();try {//读取文件流in = new FileInputStream(file);//工厂同过不同的流返回不同的Workbook,// 2003版本excel是.xls结尾,所以返回的是HSSFWorkbook//2007版本后的是.xlsx结尾,所以返回的是XSSFWorkbookWorkbook workbook =WorkbookFactory.create(in);//拿到第一个表Sheet sheet = workbook.getSheetAt(0);int count = 1;Iterator<Row> rows = sheet.rowIterator();int totalNum = sheet.getLastRowNum();//循环遍历rowwhile (rows.hasNext()){Row row = rows.next();//当前行是表头,进行和excelconfig中的配置进行校验,看表头行是否和规定的一致if(row.getRowNum() == headRow){ExcelUtils.validateExcelHeadRow(excelConfig.getColumns(),row);}//当前行不是数据开始行,就跳出循环下一行if (row.getRowNum() < startRow){continue;}//rowMap来记都出来的数据Map<String, Object> rowMap = convertRow(excelConfig, row);if (rowMap.containsKey("error")){result.put("code", LOG_ERROR);result.put("msg", rowMap.get("error"));LogUtil.sendMsg(result, response);succFlag = false;}else if(isEmptyRow(rowMap)){//空行result.put("code", LOG_INFO);result.put("msg", "第"+count+"行数据为空,跳过处理");double precent = 100*(count/(totalNum - startRow +1));result.put("percent", ""+(int) (100 * count / (totalNum - startRow + 1)) + "");}else{Object bean = ContextUtil.getBean(excelConfig.getBeanName());Method method = ReflectionUtils.findMethod(bean.getClass(),excelConfig.getMethodName(), Map.class);//校验字段,判空和长度的校验ExcelUtil.validateField(excelConfig.getId(), rowMap);params.putAll(rowMap);ResultData resultData = (ResultData) ReflectionUtrils.invokeMethod(method, bean, params);if (succFlag) {result.put("code", LOG_INFO);result.put("msg", "正在处理第[" + count + "]条数据");result.put("percent", (int) (100 * count / (totalNum - startRow + 1)) + "");LogUtil.sendMsg(result, response);succFlag = true;} else {result.put("code", LOG_ERROR);result.put("msg", "处理第[" + count + "]条数据失败:" + resultData .getRetMsg());result.put("percent", "0");LogUtil.sendMsg(result, response);succFlag = false;}}count++;}if (succFlag) {result.put("code", LOG_INFO);result.put("msg", "处理完成");result.put("percent", "100");LogUtil.sendMsg(result, response);}} catch (Exception e) {result.put("code", LOG_ERROR);result.put("msg", "解析模板出错,错误信息:" + e.getMessage());result.put("percent", "0");LogUtil.sendMsg(result, response);succFlag = false;} finally{try {if (in != null)in.close();} catch (IOException e) {e.printStackTrace();}}return succFlag;}/*** 判断一行是否为空行* @param rowMap* @return*/private boolean isEmptyRow(Map<String, Object> rowMap) {StringBuilder sb = new StringBuilder();for (String key : rowMap.keySet()){//error和rownum略过if("error".equals(key) || "rownum".equals(key)){continue;}sb.append(rowMap.get(key));}return StringUtils.isEmpty(sb.toString());}/*** 读一行数据,将数据存入rowMap* 将列配置中的filed作为rowMap的key,单元格cell上的value作为rowMap的Value* @param excelConfig* @param row* @return*/private Map<String, Object> convertRow(ExcelConfig excelConfig, Row row) {Map<String, Object> rowMap = new HashMap<String, Object>();Map<String, ColumnConfig> columnConfigs = excelConfig.getColumns();//遍历一行数据row,将该cell对应的field作为rowMap的key,cell中的值作为rowMap的valuefor (String index : columnConfigs.keySet()){Cell cell = row.getCell(Integer.parseInt(index));ColumnConfig columnConfig = columnConfigs.get(index);//获取cell上的value,并切经行校验处理if (cell!=null) {// todo 根据需求 可能对col中的字段进行校验  后面可能需要写一个校验方法和配置做对比String cellValue=(String) getCellValue(cell);rowMap.put(columnConfig.getField(), cellValue);}else{rowMap.put(columnConfig.getField(),"");}}//rownum也放进rowMaprowMap.put("rownum",row.getRowNum());return rowMap;}/*** 获取单元格cell上的数据* 数值   0 / CELL_TYPE_NUMERIC   cell.getNumericCellValue()* 日期  0 / CELL_TYPE_NUMERIC   cell.getDateCellValue()* 文本 1 / CELL_TYPE_STRING    cell.getStringCellValue()* 公式   2 / CELL_TYPE_FORMULA   cell.getNumericCellValue()* 布尔  4 / CELL_TYPE_BOOLEAN   cell.getBooleanCellValue()* 异常  5 / CELL_TYPE_ERROR     cell.getErrorCellValue()** @param cell* @return*/private Object getCellValue(Cell cell) {Object value = null;//拿到单元格的数据类型int cellType = cell.getCellType();switch(cellType){case Cell.CELL_TYPE_NUMERIC://日期类型或者是科学计数法if ("@".equals(cell.getCellStyle().getDataFormatString())){value = df.format(cell.getNumericCellValue());break;}else if("General".equals(cell.getCellStyle().getDataFormatString())){value = nf.format(cell.getNumericCellValue());break;}else{if (DateUtil.isCellDateFormatted(cell)){value = dateFormat.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));break;}else{value = cell.getNumericCellValue();break;}}case Cell.CELL_TYPE_STRING:value = cell.getStringCellValue();break;case Cell.CELL_TYPE_FORMULA:value = cell.getCellFormula();break;case Cell.CELL_TYPE_BOOLEAN:value = cell.getBooleanCellValue();break;default:value = "";}return String.valueOf(value);}
  1. 工具类 excel校验类和log类
/*** @Date: 2019/11/6 9:57* @Description: Excel校验工具类*/
public class ExcelUtils {/*** 传进来的表头进行和excelconfig中的配置的表头进行校验* @param columnConfigMap* @param row*/public static void validateExcelHeadRow(Map<String, ColumnConfig> columnConfigMap, Row row) throws ValidateException {//拿到每一列Iterator<Cell> cellIterator = row.cellIterator();while(cellIterator.hasNext()){Cell cell = cellIterator.next();int index = cell.getColumnIndex();String cellValue = cell.getStringCellValue();//在配置中找对应的列ColumnConfig columnConfig = columnConfigMap.get(index+"");//对比列,如果为空则说明与摸板不一致if (columnConfig == null){throw new ValidateException("选择的文件与模板配置的列数不匹配");}//判断列是否校验if(!columnConfig.isValidate()){continue;}String text = columnConfig.getText();//判断是否和模板匹配if(!cellValue.equals(text)){throw new ValidateException("选择的文件与模板配置不匹配<br/>文件中第["+(index+1)+"]个字段["+cellValue+"]与配置字段["+text+"]不匹配");}}}/*** 对字段进行判空和大小校验* @param excelid* @param params*/public static void validateField(String excelid, Map<String, Object> params) throws ValidateException {ExcelConfig excelConfig =PmsCache.getImportConfig(excelid);Map<String,ColumnConfig> columnConfigMap = excelConfig.getColumns();for (String index: columnConfigMap.keySet()){ColumnConfig columnConfig = columnConfigMap.get(index);String field = columnConfig.getField();//默认值if(StringUtils.isNotEmpty(columnConfig.getDefVal())){if (StringUtils.isEmpty(params.get(field))){params.put(field,columnConfig.getDefVal());}}//是否需要校验if (columnConfig.isValidate()){//非空校验,看字段是否为空if (columnConfig.isNotNull()){if(StringUtils.isEmpty(params.get(field))){String message = "字段" + columnConfig.getText() + "字段不允许为空";throw new ValidateException(message);}}//大小校验if (columnConfig.getLength()>0 && StringUtils.isEmpty(params.get(field))){int len = String.valueOf(params.get(field)).getBytes().length;if (len>columnConfig.getLength()){String Message = "字段" + columnConfig.getText() + "长度[" + len + "]超过了允许的长度[" + columnConfig.getLength() + "]";throw new ValidateException(Message);}}}}}
}public class LogUtil {public static void sendMsg(Map<String, Object> result, HttpServletResponse response) {String jsonResult = object2Json(result);synchronized (response) {try{response.getWriter().println(htmlEscape(jsonResult));response.getWriter().flush();}catch (Exception e){e.printStackTrace();}}}public static void sendMsg(String code, String msg, HttpServletResponse response) {Map<String, Object> result = new HashMap<String, Object>();result.put("code",code);result.put("msg",msg);LogUtil.sendMsg(result, response);}public static void sendMsgAndPercent(String code, String msg, float percent, HttpServletResponse response) {Map<String, Object> result = new HashMap<String, Object>();result.put("code",code);result.put("msg",msg);result.put("percent",percent);LogUtil.sendMsg(result, response);}public static String object2Json(Object object) {String json = "";try {ObjectMapper mapper2 = new ObjectMapper();StringWriter sw = new StringWriter();JsonGenerator gen = new JsonFactory().createGenerator(sw);mapper2.writeValue(gen, object);gen.close();json = sw.toString();} catch (IOException e) {e.printStackTrace();}return json;}private static String htmlEscape(String message) {return "<script type='text/javascript'>window.parent.reciveResult("+ message.replaceAll("\\n\\r", "<br/>").replaceAll("\\r\\n", "<br/>").replaceAll("\\n", "").replaceAll("\\r", "")+ ");</script>";}
}

java实现excel文件批量导入数据相关推荐

  1. java 导出文件上传模板,上传Excel文件批量导入数据

    后端代码 controller层 @RequestMapping(value = "/importExcel", method = {RequestMethod.POST, Req ...

  2. 微信小程序 -- 数据库数据excel文件批量导入

    一.excel文件批量导入数据到数据库 1.创建node.js函数upload,点击upload右键外部终端中安装类库 npm install node-xlsx 2.云函数代码 const clou ...

  3. 多个excel文件批量导入到数据库

    多个excel文件批量导入到数据库 摘要:我们可以用navicate等数据库编辑器的excel导入功能将一个excel导入到数据库,但是我们有多个excel甚至成百上千怎么办?这个时候用navicat ...

  4. vue表单中批量导入功能_spring boot mybatis+ vue 使用POI实现从Excel中批量导入数据

    一.前端vue+element 1.前端使用element的upload组件来实现文件的上传 style="display: inline-flex;margin-right: 8px&qu ...

  5. Java实现Excel文件的导入功能

    近期在工作上,遇到了实现Excel文件的导入功能,在此和小伙伴们分享一下过程. 实现Excel文件的导入呢,首先我们需要先上传文件,然后在后端进行解析文件中的内容.这里我们需要用到 poi 的这样一个 ...

  6. Java POI实现Excel文件批量导入(兼容xls,xlsx)

    1.POI使用详解 1.1.什么是Apache POI? POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Micros ...

  7. Java:实现文件批量导入导出实践(兼容xls,xlsx)

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:小卖铺的老爷爷 cnblogs.com/laoyeye/p/6938889.html ...

  8. 通过Excel表格批量导入数据

    业务场景 批量导入用户数据 依赖 导入操作Excel表格相关依赖 <dependency><groupId>org.apache.poi</groupId>< ...

  9. java做 excel文件的 导入导出 (SSM+layer)

    做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...

最新文章

  1. 服务器磁盘阵列做win7系统,Raid0可以安装winxp-x86,但不能安装win7-x64,是怎么回事呢?!...
  2. 关于XDC约束文件,你需要知道的几点
  3. 在 PHP 中实现带 WSDL 的 SOAP
  4. 阿里安全开源隐私计算新技术:计算速度快20倍,通信成本低2倍,已登安全顶会...
  5. 0218 图片的添加
  6. 基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)
  7. spring核心功能包中已经包含了cglib功能
  8. leecode_二叉树中序遍历
  9. 简单 python 小说爬虫 ultimate
  10. 记录 Kindle Fire HDX 7 安装 Google Play 服务过程
  11. 《Java并发编程实践》笔记1——并发编程基础
  12. 普中开发板白屏_普中开发板送的12864为什么程序写进去,屏幕不显示?
  13. MATLAB遗传算法工具箱的函数及实例
  14. 终极算法【3】——符号学派
  15. 【保姆级手写理解——灰色预测理论以及python实现】
  16. [转] 串、并行加法器
  17. 电力猫服务器的网页,电力猫方案完美解决家庭网络布局
  18. 自考-计算机程序设计-1-概论
  19. Windows软件清单
  20. Backtrader系列教程⑦:可视化篇(重构)

热门文章

  1. 解决wsappx占cpu和内存过大问题
  2. MMDVM小盒子更新屏幕固件
  3. STM32学习笔记-USART串口通信+与野火STM32F407板载ESP8266进行通信
  4. 高清壁纸搜索,宝可梦极大化壁纸●超清
  5. ASCH HTTP API文档
  6. 学生使用计算机网络应当遵循国家和学校,大学生安全知识试题答案
  7. 银行可以用服务器群集代替大型机吗?
  8. 怎样恢复出厂设置并还原Apple Silicon M1 Mac?
  9. 数据处理-拉伸中的strain-stress曲线
  10. Java Web——基于Servlet、JSP(无框架版)电影网站项目总结 (二,完结版)