2020-05-21 09:21发布
Java POI Excel导入导出Excel文件
一、导入pom文件(版本号一定要相同,不然会报错)
org.apache.poi
poi
3.17
poi-ooxml
二、实现导出功能
@RequestMapping("/outPutExcel")
public void outPutExcel(HttpServletResponse response) throws Exception {
// 每次写100行数据,就刷新数据出缓存
SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
Sheet sh = wb.createSheet();
// 这个是业务数据
List tmps = classService.getAllClass();
String[] titles = { "编号", "标题" };
Row row = sh.createRow(0);
// 第一行设置标题
for (int i = 0; i < titles>
String title = titles[i];
Cell cell1 = row.createCell(i);
cell1.setCellValue(title);
}
// 导出数据
for (int rowNum = 0; rowNum < tmps>
Row rowData = sh.createRow(rowNum + 1);
// TbClass 这个是我的业务类,这个是根据业务来进行填写数据
TbClass tmp = tmps.get(rowNum);
// 第一列
Cell cellDataA = rowData.createCell(0);
cellDataA.setCellValue(tmp.getcId());
// 第二列
Cell cellDataB = rowData.createCell(1);
cellDataB.setCellValue(tmp.getcName());
String fileName = "文件名称.xlsx";
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
wb.write(response.getOutputStream());
wb.close();
导出结果
导出时间类型
数据库使用时间类型,直接导出会出现以下这种情况。这个时候我们就需要处理一下时间类型。
用2种方法来解决时间转换字符串的方法
1、使用注解的方式
在属性类中添加注解属性类型就会转换成功啦,不过类型要改成String类型。(org.springframework.format.annotation 这个注解包是使用SpringMVC的类)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String createTime;
2、使用时间转换类,就不复制代码啦。createTime 是时间类的一个属性。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (null != tmp.getCreateTime())
cellDataC.setCellValue(df.format(tmp.getCreateTime()));
实体类(想了一下,还是把实体类放上来吧)
public class TbClass {
private Integer cId;
private String cName;
private String stuName;
private Timestamp createTime;
// 省略SetGet方法
二、实现导入功能
先画个图吧,这样我们按照图来走吧,让代码更加简单。
公共的代码是和技术框架无关的,大家可以参考一下的,使用的是Spring+SpringMVC+Mybatis的技术框架。
Excel测试文件:
jsp页面:
配置是有2种方式
xml文件中的配置:
在原始类中的配置:
@Bean
public CommonsMultipartResolver multipartResolver(DataSource dataSource) throws PropertyVetoException {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
multipartResolver.setMaxUploadSize(10485760000L);
multipartResolver.setMaxInMemorySize(40960);
return multipartResolver;
Controller类(这里接收文件)
@ResponseBody
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST, produces="text/html;charset=UTF-8")
public String fileUpload2(@RequestParam("test") CommonsMultipartFile test) throws Exception {
String path="E:/"+new Date().getTime()+test.getOriginalFilename();
File newFile=new File(path);
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
test.transferTo(newFile);
POIUtil.readExcel(path);
return "/success";
POIUtil工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.pojo.TbClass;
public class POIUtil {
public static void readExcel(String fileName) throws Exception {
InputStream is = new FileInputStream(new File(fileName));
Workbook hssfWorkbook = null;
if (fileName.endsWith("xlsx")) {
hssfWorkbook = new XSSFWorkbook(is);// Excel 2007
} else if (fileName.endsWith("xls")) {
hssfWorkbook = new HSSFWorkbook(is);// Excel 2003
// HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
TbClass tbClass = null;
List list = new ArrayList();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook>
// HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow != null) {
tbClass = new TbClass();
Cell cId = hssfRow.getCell(0);
Cell cName = hssfRow.getCell(1);
// 处理具体的业务数据,把业务数据装到List中
tbClass.setcId(Integer.parseInt(getStringValueFromCell(cId)));
tbClass.setcName(cName.toString());
list.add(tbClass);
// List中的数据就是在Excel中读取的内容
for (TbClass tbClass2 : list) {
// 在这里可以进行业务操作
System.out.println(tbClass2.getcId());
System.out.println(tbClass2.getcName());
public static String getStringValueFromCell(Cell cell) {
SimpleDateFormat sFormat = new SimpleDateFormat("MM/dd/yyyy");
DecimalFormat decimalFormat = new DecimalFormat("#.#");
String cellValue = "";
if(cell == null) {
return cellValue;
else if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
cellValue = cell.getStringCellValue();
else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
if(HSSFDateUtil.isCellDateFormatted(cell)) {
double d = cell.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(d);
cellValue = sFormat.format(date);
else {
cellValue = decimalFormat.format((cell.getNumericCellValue()));
else if(cell.getCellType() == Cell.CELL_TYPE_BLANK) {
cellValue = "";
else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
cellValue = String.valueOf(cell.getBooleanCellValue());
else if(cell.getCellType() == Cell.CELL_TYPE_ERROR) {
else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
cellValue = cell.getCellFormula().toString();
运行结果:
————————————————
原文链接:https://blog.csdn.net/qq_31984879/java/article/details/91611713
里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一...
心里有个预期,然后看看是以什么目的进这家企业工作,要是赚钱的话,那就多要点,要是学习的话,可以根据情况要一个能养活自己的价格。
Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...
现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...
1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...
学vue应该要先学习javascript 的基础知识和用法。
1、lambda是jdk8的新特性2、使用lambda的前提,必须是一个接口,接口只能有一个抽象方法3、Lambda 表达式的简单例子:// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数...
你没有把jdk配置到eclipse里,步骤如下:打开eclipse,菜单栏找到window -> preference -> java -> install jres -> add -> standard vm -> 设置好相应的jre home就可以了。
使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。...
1. 区别:堆和栈区别堆:主要用于储存实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。栈:主要用于储存局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。2. 堆内存和栈内...
至少h5、CSS、JS,包括数据库连接技术,ajax都要会哦
对于一个秒杀系统来说,瞬时的大量请求会对后台服务造成冲击,需要保证服务的可用性以及业务的正确性。设计了一个高并发高可用的系统简要流程架构如下图:1.将商品(或券)的信息等静态数据放到cdn节点,实现动静分离2.业务请求和业务处理之间使用MQ对请求进行削...
为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事...
封装就是把抽象出来的JAVA类的变量和方法集成为一个集体,就像集成电路元件成为一个独立的芯片一样,它只留出对外的接口,使用者可以直接使用它,但看不到其内部是怎样实现的,JAVA类的封装就是对外而言能直接使用它来定义的对象去调用相关变量和方法。...
1. java.awt:提供了绘图和图像类,主要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类。2. java.lang:java的语言包,是核心包,默认导入到用户程序,包中有object类,数据类型包装类,数学类,字符串类,系统和运行时类,操作类,线程类,错...
最多设置5个标签!
Java POI Excel导入导出Excel文件
一、导入pom文件(版本号一定要相同,不然会报错)
二、实现导出功能
@RequestMapping("/outPutExcel")
public void outPutExcel(HttpServletResponse response) throws Exception {
// 每次写100行数据,就刷新数据出缓存
SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
Sheet sh = wb.createSheet();
// 这个是业务数据
List tmps = classService.getAllClass();
String[] titles = { "编号", "标题" };
Row row = sh.createRow(0);
// 第一行设置标题
for (int i = 0; i < titles>
String title = titles[i];
Cell cell1 = row.createCell(i);
cell1.setCellValue(title);
}
// 导出数据
for (int rowNum = 0; rowNum < tmps>
Row rowData = sh.createRow(rowNum + 1);
// TbClass 这个是我的业务类,这个是根据业务来进行填写数据
TbClass tmp = tmps.get(rowNum);
// 第一列
Cell cellDataA = rowData.createCell(0);
cellDataA.setCellValue(tmp.getcId());
// 第二列
Cell cellDataB = rowData.createCell(1);
cellDataB.setCellValue(tmp.getcName());
}
String fileName = "文件名称.xlsx";
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
wb.write(response.getOutputStream());
wb.close();
}
导出结果
导出时间类型
数据库使用时间类型,直接导出会出现以下这种情况。这个时候我们就需要处理一下时间类型。
用2种方法来解决时间转换字符串的方法
1、使用注解的方式
在属性类中添加注解属性类型就会转换成功啦,不过类型要改成String类型。(org.springframework.format.annotation 这个注解包是使用SpringMVC的类)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String createTime;
2、使用时间转换类,就不复制代码啦。createTime 是时间类的一个属性。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (null != tmp.getCreateTime())
cellDataC.setCellValue(df.format(tmp.getCreateTime()));
实体类(想了一下,还是把实体类放上来吧)
public class TbClass {
private Integer cId;
private String cName;
private String stuName;
private Timestamp createTime;
// 省略SetGet方法
}
二、实现导入功能
先画个图吧,这样我们按照图来走吧,让代码更加简单。
公共的代码是和技术框架无关的,大家可以参考一下的,使用的是Spring+SpringMVC+Mybatis的技术框架。
Excel测试文件:
jsp页面:
配置是有2种方式
xml文件中的配置:
在原始类中的配置:
@Bean
public CommonsMultipartResolver multipartResolver(DataSource dataSource) throws PropertyVetoException {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
multipartResolver.setMaxUploadSize(10485760000L);
multipartResolver.setMaxInMemorySize(40960);
return multipartResolver;
}
Controller类(这里接收文件)
@ResponseBody
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST, produces="text/html;charset=UTF-8")
public String fileUpload2(@RequestParam("test") CommonsMultipartFile test) throws Exception {
String path="E:/"+new Date().getTime()+test.getOriginalFilename();
File newFile=new File(path);
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
test.transferTo(newFile);
POIUtil.readExcel(path);
return "/success";
}
POIUtil工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.pojo.TbClass;
public class POIUtil {
public static void readExcel(String fileName) throws Exception {
InputStream is = new FileInputStream(new File(fileName));
Workbook hssfWorkbook = null;
if (fileName.endsWith("xlsx")) {
hssfWorkbook = new XSSFWorkbook(is);// Excel 2007
} else if (fileName.endsWith("xls")) {
hssfWorkbook = new HSSFWorkbook(is);// Excel 2003
}
// HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
TbClass tbClass = null;
List list = new ArrayList();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook>
// HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow != null) {
tbClass = new TbClass();
Cell cId = hssfRow.getCell(0);
Cell cName = hssfRow.getCell(1);
// 处理具体的业务数据,把业务数据装到List中
tbClass.setcId(Integer.parseInt(getStringValueFromCell(cId)));
tbClass.setcName(cName.toString());
list.add(tbClass);
}
}
}
// List中的数据就是在Excel中读取的内容
for (TbClass tbClass2 : list) {
// 在这里可以进行业务操作
System.out.println(tbClass2.getcId());
System.out.println(tbClass2.getcName());
}
}
public static String getStringValueFromCell(Cell cell) {
SimpleDateFormat sFormat = new SimpleDateFormat("MM/dd/yyyy");
DecimalFormat decimalFormat = new DecimalFormat("#.#");
String cellValue = "";
if(cell == null) {
return cellValue;
}
else if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
cellValue = cell.getStringCellValue();
}
else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
if(HSSFDateUtil.isCellDateFormatted(cell)) {
double d = cell.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(d);
cellValue = sFormat.format(date);
}
else {
cellValue = decimalFormat.format((cell.getNumericCellValue()));
}
}
else if(cell.getCellType() == Cell.CELL_TYPE_BLANK) {
cellValue = "";
}
else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
cellValue = String.valueOf(cell.getBooleanCellValue());
}
else if(cell.getCellType() == Cell.CELL_TYPE_ERROR) {
cellValue = "";
}
else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
cellValue = cell.getCellFormula().toString();
}
return cellValue;
}
}
运行结果:
————————————————
原文链接:https://blog.csdn.net/qq_31984879/java/article/details/91611713
相关问题推荐
里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一...
心里有个预期,然后看看是以什么目的进这家企业工作,要是赚钱的话,那就多要点,要是学习的话,可以根据情况要一个能养活自己的价格。
Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...
现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...
1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...
学vue应该要先学习javascript 的基础知识和用法。
1、lambda是jdk8的新特性2、使用lambda的前提,必须是一个接口,接口只能有一个抽象方法3、Lambda 表达式的简单例子:// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数...
你没有把jdk配置到eclipse里,步骤如下:打开eclipse,菜单栏找到window -> preference -> java -> install jres -> add -> standard vm -> 设置好相应的jre home就可以了。
使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。...
1. 区别:堆和栈区别堆:主要用于储存实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。栈:主要用于储存局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。2. 堆内存和栈内...
至少h5、CSS、JS,包括数据库连接技术,ajax都要会哦
对于一个秒杀系统来说,瞬时的大量请求会对后台服务造成冲击,需要保证服务的可用性以及业务的正确性。设计了一个高并发高可用的系统简要流程架构如下图:1.将商品(或券)的信息等静态数据放到cdn节点,实现动静分离2.业务请求和业务处理之间使用MQ对请求进行削...
为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事...
封装就是把抽象出来的JAVA类的变量和方法集成为一个集体,就像集成电路元件成为一个独立的芯片一样,它只留出对外的接口,使用者可以直接使用它,但看不到其内部是怎样实现的,JAVA类的封装就是对外而言能直接使用它来定义的对象去调用相关变量和方法。...
1. java.awt:提供了绘图和图像类,主要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类。2. java.lang:java的语言包,是核心包,默认导入到用户程序,包中有object类,数据类型包装类,数学类,字符串类,系统和运行时类,操作类,线程类,错...