SpringBoot实现Excel读取的实例教程

前言

这是本人写的一个SpringBoot对Excel读取的方法,实测能用,待提升的地方有很多,有不足之处请多多指点。

Excel2003版(后缀为.xls)最大行数是65536行,最大列数是256列。

Excel2007以上的版本(后缀为.xlsx)最大行数是1048576行,最大列数是16384列。

提供2种方法读取:

1.根据指定的开始和结束行数读取返回结果,结果格式为List<Map<String, Object>>

2.根据指定的开始和结束行数读取返回结果,结果格式为List<POJO(传入的实体类)>

请根据实际内存堆可用大小进行读取,太多可进行分段读取(类似分页的原理)

读取Excel所需要的几个类

1.在pom.xml加上依赖

</dependencies>
 <dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.0.1</version>
 </dependency>
 <dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.0.1</version>
 </dependency>
</dependencies>

2.ExcelPOJO实体类

package com.cly.utils.Excel;

/**
 * @author : CLy
 * @ClassName : ExcelPOJO
 * @date : 2020/7/9 17:13
 * 实体类所有成员变量都需要有GET,SET方法
 * 所有成员变量都要加上注解@excelRescoure(value = "?"),?为Excel真实列名,必须一一对应
 * @excelRescoure(value = "?"),?可为空,需要用到才赋值
 * 成员变量目前只允许String,Double,Interge,Float
 **/

public class ExcelPOJO {
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getPasswork() {
 return passwork;
 }
 public void setPasswork(String passwork) {
 this.passwork = passwork;
 }
 public String getLook() {
 return look;
 }
 public void setLook(String look) {
 this.look = look;
 }

 @excelRescoure(value = "XM")
 private String name;
 @excelRescoure(value = "SFZH")
 private String passwork;
 @excelRescoure()
 private String look;

 @Override
 public String toString(){
 return "name:"+this.getName()+",passwork:"+this.getPasswork()+",look:"+this.getLook();
 }
 public ExcelPOJO() {}
}

3.@interface自定义注解(用于实体类读取)

package com.cly.utils.Excel;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author : CLy
 * @ClassName : myRescoure
 * @date : 2020/7/10 9:31
 **/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface excelRescoure {
 String value() default "";//默认为空
}

4.excelRead类(读取Excel数据类)有很多冗余的代码,可抽离出来

package com.cly.utils.Excel;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.bcel.internal.generic.NEW;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Cell;
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 javax.xml.transform.Source;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.*;
import java.text.DecimalFormat;
import java.util.*;

/**
 * @author : CLy
 * @ClassName : excelRead
 * @date : 2020/7/9 11:08
 **/
public class excelRead {
 //日志输出
 private static Logger logger = LoggerFactory.getLogger(excelRead.class);
 //定义excel类型
 private static final String XLS = "xls";
 private static final String XLSX = "xlsx";

 /**
 * 根据文件后缀名类型获取对应的工作簿对象
 * @param inputStream 读取文件的输入流
 * @param fileType 文件后缀名类型(xls或xlsx)
 * @return 包含文件数据的工作簿对象
 */
 private static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
 //用自带的方法新建工作薄
 Workbook workbook = WorkbookFactory.create(inputStream);
 //后缀判断有版本转换问题
 //Workbook workbook = null;
 //if (fileType.equalsIgnoreCase(XLS)) {
 // workbook = new HSSFWorkbook(inputStream);
 //} else if (fileType.equalsIgnoreCase(XLSX)) {
 // workbook = new XSSFWorkbook(inputStream);
 //}
 return workbook;
 }

 /**
 * 将单元格内容转换为字符串
 * @param cell
 * @return
 */
 private static String convertCellValueToString(Cell cell) {
 if (cell == null) {
  return null;
 }
 String returnValue = null;
 switch (cell.getCellType()) {
  case NUMERIC: //数字
  Double doubleValue = cell.getNumericCellValue();
  // 格式化科学计数法,取一位整数,如取小数,值如0.0,取小数点后几位就写几个0
  DecimalFormat df = new DecimalFormat("0");
  returnValue = df.format(doubleValue);
  break;
  case STRING: //字符串
  returnValue = cell.getStringCellValue();
  break;
  case BOOLEAN: //布尔
  Boolean booleanValue = cell.getBooleanCellValue();
  returnValue = booleanValue.toString();
  break;
  case BLANK: // 空值
  break;
  case FORMULA: // 公式
  returnValue = cell.getCellFormula();
  break;
  case ERROR: // 故障
  break;
  default:
  break;
 }
 return returnValue;
 }

 /**
 * 处理Excel内容转为List<Map<String,Object>>输出
 * workbook:已连接的工作薄
 * StatrRow:读取的开始行数(默认填0,0开始,传过来是EXcel的行数值默认从1开始,这里已处理减1)
 * EndRow:读取的结束行数(填-1为全部)
 * ExistTop:是否存在头部(如存在则读取数据时会把头部拼接到对应数据,若无则为当前列数)
 */
 private static List<Map<String, Object>> HandleData(Workbook workbook, int StatrRow, int EndRow, boolean ExistTop) {
 //声明返回结果集result
 List<Map<String, Object>> result = new ArrayList<>();
 //声明一个Excel头部函数
 ArrayList<String> top = new ArrayList<>();
 //解析sheet(sheet是Excel脚页)
 /**
 *此处会读取所有脚页的行数据,若只想读取指定页,不要for循环,直接给sheetNum赋值,脚页从0开始(通常情况Excel都只有一页,所以此处未进行进一步处理)
 */
 for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
  Sheet sheet = workbook.getSheetAt(sheetNum);
  // 校验sheet是否合法
  if (sheet == null) {
  continue;
  }
  //如存在头部,处理头部数据
  if (ExistTop) {
  int firstRowNum = sheet.getFirstRowNum();
  Row firstRow = sheet.getRow(firstRowNum);
  if (null == firstRow) {
   logger.warn("解析Excel失败,在第一行没有读取到任何数据!");
  }
  for (int i = 0; i < firstRow.getLastCellNum(); i++) {
   top.add(convertCellValueToString(firstRow.getCell(i)));
  }
  }
  //处理Excel数据内容
  int endRowNum;
  //获取结束行数
  if (EndRow == -1) {
  endRowNum = sheet.getPhysicalNumberOfRows();
  } else {
  endRowNum = EndRow <= sheet.getPhysicalNumberOfRows() ? EndRow : sheet.getPhysicalNumberOfRows();
  }
  //遍历行数
  for (int i = StatrRow - 1; i < endRowNum; i++) {
  Row row = sheet.getRow(i);
  if (null == row) {
   continue;
  }
  Map<String, Object> map = new HashMap<>();
  //获取所有列数据
  for (int y = 0; y < row.getLastCellNum(); y++) {
   if (top.size() > 0) {
   if (top.size() >= y) {
    map.put(top.get(y), convertCellValueToString(row.getCell(y)));
   } else {
    map.put(String.valueOf(y + 1), convertCellValueToString(row.getCell(y)));
   }
   } else {
   map.put(String.valueOf(y + 1), convertCellValueToString(row.getCell(y)));
   }
  }
  result.add(map);
  }
 }
 return result;
 }

 /**
 * 方法一
 * 根据行数和列数读取Excel
 * fileName:Excel文件路径
 * StatrRow:读取的开始行数(默认填0)
 * EndRow:读取的结束行数(填-1为全部)
 * ExistTop:是否存在头部(如存在则读取数据时会把头部拼接到对应数据,若无则为当前列数)
 * 返回一个List<Map<String,Object>>
 */
 public static List<Map<String, Object>> ReadExcelByRC(String fileName, int StatrRow, int EndRow, boolean ExistTop) {
 //判断输入的开始值是否少于等于结束值
 if (StatrRow > EndRow && EndRow != -1) {
  logger.warn("输入的开始行值比结束行值大,请重新输入正确的行数");
  List<Map<String, Object>> error = null;
  return error;
 }
 //声明返回的结果集
 List<Map<String, Object>> result = new ArrayList<>();
 //声明一个工作薄
 Workbook workbook = null;
 //声明一个文件输入流
 FileInputStream inputStream = null;
 try {
  // 获取Excel后缀名,判断文件类型
  String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
  // 获取Excel文件
  File excelFile = new File(fileName);
  if (!excelFile.exists()) {
  logger.warn("指定的Excel文件不存在!");
  return null;
  }
  // 获取Excel工作簿
  inputStream = new FileInputStream(excelFile);
  workbook = getWorkbook(inputStream, fileType);
  //处理Excel内容
  result = HandleData(workbook, StatrRow, EndRow, ExistTop);
 } catch (Exception e) {
  logger.warn("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
 } finally {
  try {
  if (null != workbook) {
   workbook.close();
  }
  if (null != inputStream) {
   inputStream.close();
  }
  } catch (Exception e) {
  logger.warn("关闭数据流出错!错误信息:" + e.getMessage());
  return null;
  }
 }
 return result;
 }

/**==============================================================================================================================**/

 /**
 * 方法二
 * 根据给定的实体类中赋值的注解值读取Excel
 * fileName:Excel文件路径
 * StatrRow:读取的开始行数(默认填0)
 * EndRow:读取的结束行数(填-1为全部)
 * Class<T>:传过来的实体类类型
 * 返回一个List<T>:T为实体类
 */
 public static List<Object> ReadExcelByPOJO(String fileName, int StatrRow, int EndRow, Class t) throws InvocationTargetException, IntrospectionException, InstantiationException, IllegalAccessException, NoSuchFieldException {
 //判断输入的开始值是否少于等于结束值
 if (StatrRow > EndRow && EndRow != -1) {
  logger.warn("输入的开始行值比结束行值大,请重新输入正确的行数");
  List<Object> error = null;
  return error;
 }
 //声明返回的结果集
 List<Object> result = new ArrayList<>();
 //声明一个工作薄
 Workbook workbook = null;
 //声明一个文件输入流
 FileInputStream inputStream = null;
 try {
  // 获取Excel后缀名,判断文件类型
  String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
  // 获取Excel文件
  File excelFile = new File(fileName);
  if (!excelFile.exists()) {
  logger.warn("指定的Excel文件不存在!");
  return null;
  }
  // 获取Excel工作簿
  inputStream = new FileInputStream(excelFile);
  workbook = getWorkbook(inputStream, fileType);
  //处理Excel内容
  result = HandleDataPOJO(workbook, StatrRow, EndRow, t);
 } catch (Exception e) {
  logger.warn("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
 } finally {
  try {
  if (null != workbook) {
   workbook.close();
  }
  if (null != inputStream) {
   inputStream.close();
  }
  } catch (Exception e) {
  logger.warn("关闭数据流出错!错误信息:" + e.getMessage());
  return null;
  }
 }
 return result;
 }

 /**
 * 处理Excel内容转为List<T>输出
 * workbook:已连接的工作薄
 * StatrRow:读取的开始行数(默认填0,0开始,传过来是EXcel的行数值默认从1开始,这里已处理减1)
 * EndRow:读取的结束行数(填-1为全部)
 * Class<T>:所映射的实体类
 */
 private static <t> List<Object> HandleDataPOJO(Workbook workbook, int StatrRow, int EndRow, Class<?> t) throws IntrospectionException, NoSuchFieldException, IllegalAccessException, InstantiationException, InvocationTargetException, ClassNotFoundException {
 //声明返回的结果集
 List<Object> result = new ArrayList<Object>();
 //解析sheet(sheet是Excel脚页)
 for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
  Sheet sheet = workbook.getSheetAt(sheetNum);
  // 校验sheet是否合法
  if (sheet == null) {
  continue;
  }
  //获取头部数据
  //声明头部数据数列对象
  ArrayList<String> top = new ArrayList<>();
  //获取Excel第一行数据
  int firstRowNum = sheet.getFirstRowNum();
  Row firstRow = sheet.getRow(firstRowNum);
  if (null == firstRow) {
  logger.warn("解析Excel失败,在第一行没有读取到任何数据!");
  return null;
  }
  for (int i = 0; i < firstRow.getLastCellNum(); i++) {
  top.add(convertCellValueToString(firstRow.getCell(i)));
  }
  //获取实体类的成原变量
  Map<String, Object> POJOfields = getPOJOFieldAndValue(t);
  //判断所需要的数据列
  Map<String, Object> exceltoPOJO = new HashMap<>();
  for (int i = 0; i < top.size(); i++) {
  if (POJOfields.get(top.get(i)) != null && !"".equals(POJOfields.get(top.get(i)))) {
   exceltoPOJO.put(String.valueOf(i), POJOfields.get(top.get(i)));
  }
  }
  /*处理Excel数据内容*/
  int endRowNum;
  //获取结束行数
  if (EndRow == -1) {
  endRowNum = sheet.getPhysicalNumberOfRows();
  } else {
  endRowNum = EndRow <= sheet.getPhysicalNumberOfRows() ? EndRow : sheet.getPhysicalNumberOfRows();
  }
  List<Map<String, Object>> mapList = new ArrayList<>();
  //遍历行数
  for (int i = StatrRow - 1; i < endRowNum; i++) {
  Row row = sheet.getRow(i);
  if (null == row) {
   continue;
  }
  //获取需要的列数据
  t texcel = (t) t.newInstance();
  for (Map.Entry<String, Object> map : exceltoPOJO.entrySet()) {
   //获取Exceld对应列的数据
   String celldata = convertCellValueToString(row.getCell(Integer.parseInt(map.getKey())));
   //使用发射
   //获取实体类T中指定成员变量的对象
   PropertyDescriptor pd = new PropertyDescriptor((String) map.getValue(), texcel.getClass());
   //获取成员变量的set方法
   Method method = pd.getWriteMethod();
   //判断成员变量的类型
   Field field = texcel.getClass().getDeclaredField((String) map.getValue());
   String object = field.getGenericType().getTypeName();
   if (object.endsWith("String")) {
   //执行set方法
   method.invoke(texcel, celldata);
   }
   if (object.endsWith("Double")) {
   Double middata = Double.valueOf(celldata);
   //执行set方法
   method.invoke(texcel, middata);
   }
   if (object.endsWith("Float")) {
   Float middata = Float.valueOf(celldata);
   //执行set方法
   method.invoke(texcel, middata);
   }
   if (object.endsWith("Integer")) {
   Integer middata = Integer.parseInt(celldata);
   //执行set方法
   method.invoke(texcel, middata);
   }
  }
  result.add(texcel);
  }
 }
 return result;
 }

 /**
 * 获取对应的实体类成员
 * */
 private static Map<String, Object> getPOJOFieldAndValue(Class T) {
 //声明返回结果集
 Map<String, Object> result = new HashMap<>();
 Field[] fields = T.getDeclaredFields();//获取属性名
 if (fields != null) {
  for (Field field : fields) {
  excelRescoure Rescoure = field.getAnnotation(excelRescoure.class);
  if (Rescoure.value() != null && !"".equals(Rescoure.value())) {
   result.put(Rescoure.value(), field.getName());
  }
  }
 } else {
  logger.warn("实体类:" + T + "不存在成员变量");
  return null;
 }
 return result;
 }
}

5.测试类

package com.cly.utils.Excel;

import java.util.*;

/**
 * @author : CLy
 * @ClassName : Readtest
 * @date : 2020/7/9 16:31
 **/
public class Readtest {
public static void main(String[] args) throws Exception {
 /** 方法一
 * fileName:Excel文件路径
 * StatrRow:读取的开始行数(默认填0)
 * EndRow:读取的结束行数(填-1为全部)
 * ExistTop:是否存在头部(如存在则读取数据时会把头部拼接到对应数据作为KEY,若无则KEY为当前列数)
 */
 List<Map<String,Object>> result =excelRead.ReadExcelByRC("D:.xls",2,10,false);
 System.out.println(result.size());
 System.out.println(result);

 /**
 * 方法二
 * ReadExcelByPOJO(String fileName, int StatrRow, int EndRow, Class t)
 * fileName:Excel文件路径
 * StatrRow:读取的开始行数(默认填0)
 * EndRow:读取的结束行数(填-1为全部)
 * Class<T>:传过来的实体类类型
 */
 List<Object> result2 = excelRead.ReadExcelByPOJO("D:.xls",2,10,ExcelPOJO.class);
 System.out.println(result2.size());
 System.out.println(result2);
 }
}

6.运行结果和说明

exce表格数据

方法一的运行结果

1.ture:key为列名

2.false:key为第几列列数

方法二的运行结果

实体类的所有成员变量一定要加上自定义注释@excelRescoure,不然会报错


还有很多不足的地方,请多多指点,希望能给你带来帮助。

SpringBoot实现内存数据导出成Excel在另一篇文章 文章地址:https://www.jb51.net/article/202767.htm

总结

到此这篇关于SpringBoot实现Excel读取的文章就介绍到这了,更多相关SpringBoot实现Excel读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot实现上传并解析Excel过程解析

    添加pom依赖 <!-- excel解析包 --> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <!--处理2003 excel--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16<

  • 使用Vue+Spring Boot实现Excel上传功能

    1.使用Vue-Cli创建前端项目 运用vue-cli工具可以很轻松地构建前端项目,当然,使用WebStorm来构建会更加简洁(如图).本文推荐使用WebStorm,因为在后续开发中,IDE会使我们的开发更加简洁.部分配置如图: 2.Navbar编写 作为一个WebApp,Navbar作为应用的导航栏是必不可少的.在本项目中,笔者引入了bootstrap对Navbar进行了轻松地构建.在vue中我们需要在components文件夹中将我们的组件加进去,对于本工程来说,Navbar是我们要加入的第

  • SpringBoot实现Excel文件批量上传导入数据库

    Spring boot + Spring data jpa + Thymeleaf 批量插入 + POI读取 + 文件上传 pom.xml: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <versi

  • 解决springboot 多线程使用MultipartFile读取excel文件内容报错问题

    springboot项目开启多线程 启动类加注解开启 @EnableAsync,实现类方法加注解 @Async 前端页面 报错信息 java.io.FileNotFoundException: C:\Users\dongao\AppData\Local\Temp\tomcat.1255209411477782290.8051\work\Tomcat\localhost\ROOT\upload_7d7b99e5_38da_4a03_93e0_bff20cb48022_00000000.tmp (系

  • Spring Boot Excel文件导出下载实现代码

    Spring Boot Excel 文件导出 目标: 实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出. 实现: 1.抽象类 BaseExcelView 继承 webmvc 的  AbstractXlsxStreamingView 抽象类, AbstractXlsxStreamingView 是webmvc继承了最顶层View接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 SXSSFWorkbook 解决了内存问题,

  • SpringBoot读取excel表格的示例代码

    SpringBoot读取excel表格 共同探讨,向各位大佬学习 走向CEO,迎娶白富美 pom.xml依赖 <!--springboot核心依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</vers

  • spring boot读取Excel操作示例

    本文实例讲述了spring boot读取Excel操作.分享给大家供大家参考,具体如下: 首先引入相关依赖 <!--解析office相关文件--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependenc

  • SpringBoot实现Excel读取的实例教程

    前言 这是本人写的一个SpringBoot对Excel读取的方法,实测能用,待提升的地方有很多,有不足之处请多多指点. Excel2003版(后缀为.xls)最大行数是65536行,最大列数是256列. Excel2007以上的版本(后缀为.xlsx)最大行数是1048576行,最大列数是16384列. 提供2种方法读取: 1.根据指定的开始和结束行数读取返回结果,结果格式为List<Map<String, Object>> 2.根据指定的开始和结束行数读取返回结果,结果格式为Li

  • SpringBoot各种参数校验的实例教程

    目录 简单使用 引入依赖 requestBody参数校验 requestParam/PathVariable参数校验 统一异常处理 进阶使用 分组校验 嵌套校验 集合校验 自定义校验 编程式校验 快速失败(Fail Fast) @Valid和@Validated区别 实现原理 requestBody参数校验实现原理 方法级别的参数校验实现原理 总结 简单使用 Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现.hibernate valida

  • python 读取txt中每行数据,并且保存到excel中的实例

    使用xlwt读取txt文件内容,并且写入到excel中,代码如下,已经加了注释. 代码简单,具体代码如下: # coding=utf-8 ''' main function:主要实现把txt中的每行数据写入到excel中 ''' ################# #第一次执行的代码 import xlwt #写入文件 import xlrd #打开excel文件 fopen=open("e:\\a\\bb\\a.txt",'r') lines=fopen.readlines() #新

  • 使用python批量读取word文档并整理关键信息到excel表格的实例

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下所示) 方便后面建立电子数据库 从而使得其他人可以迅速地搜索到相关记录 据说"人生苦短,我用python" 所以决定用python从docx文档中提取文件头的信息 然后把信息更新到一个xls电子表格中,像下面这样(直接po结果好了) 而且点击文件路径可以直接打开对应的文件(含超链接) 代码

  • python利用Excel读取和存储测试数据完成接口自动化教程

    http_request2.py用于发起http请求 #读取多条测试用例 #1.导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数 COOKIE=None def http_request2(met

  • Python实现命令行通讯录实例教程

    1.实现目标 编写一个命令行通讯录程序,可以添加.查询.删除通讯录好友及电话 2.实现方法 创建一个类来表示一个人的信息.使用字典存储每个人的对象,名字作为键. 使用pickle模块永久地把这些对象存储下来. 使用字典内建的方法添加.删除修改人员信息. 3.思维导图 4.编写伪代码 # 1.创建字典用来存储通讯录信息 # 2.创建人员类,包含姓名.关系.电话三个属性 # 3.创建操作类,包含增加.查询.删除人员,退出,保存并退出五个方法 # 4.程序运行 # 5.判断通讯录文件是否存在 # 6.

  • POI通过模板导出EXCEL文件的实例

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容.样式.2.自己需要新增的内容.样式.),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下. 分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容. File fi = new File("F:/usr/user.

  • IntelliJ Idea SpringBoot 数据库增删改查实例详解

    SpringBoot 是 SpringMVC 的升级,对于编码.配置.部署和监控,更加简单 微服务 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务.一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议. Spring 为 微服务提供了一整套的组件-SpringClound , SpirngBoot 就是该基础. 第一个SpringBoot程序 这里使用的开发软件是IntelliJ Idea,和Eclipse

  • Spring Boot创建非可执行jar包的实例教程

    我们经常会有这种场景,只需要把Spring Boot打成普通的jar包,不包含配置文件,供其他程序应用 本文介绍如何使用Maven将Spring Boot应用打成普通的非可执行jar包. 配置maven-jar-plugin <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugi

  • python实战之实现excel读取、统计、写入的示例讲解

    背景 图像领域内的一个国内会议快要召开了,要发各种邀请邮件,之后要录入.统计邮件回复(参会还是不参会等).如此重要的任务,老师就托付给我了.ps: 统计回复邮件的时候,能知道谁参会或谁不参会. 而我主要的任务,除了录入邮件回复,就是统计理事和普通会员的参会情况了(参会的.不参会的.没回复的).录入邮件回复信息没办法只能人工操作,但如果统计也要人工的话,那工作量就太大了(比如在上百人的列表中搜索另外上百人在不在此列表中!!),于是就想到了用python来帮忙,花两天时间不断修改,写了6个版本...

随机推荐