关于java的Excel导入导出之easypoi
导入easypoi相关jar包,这里的easypoi-base的包也可以不倒入,因为easypoi-web中有依赖easypoi-base会自动导入的
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-base -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-annotation -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-web -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.2.0</version>
</dependency>
编写导出使用的Javabean,根据具体的需求来定。
//导出实体类的唯一标识
@ExcelTarget("EcCommodityManagementExport")
//提供get、set
@Data
//实现序列化
public class EcCommodityManagementExportVo implements Serializable {
private static final long serialVersionUID = 42L; /**
* 图片 ,此处做的第一列与第二列的列名合并(只是列名合并),因为合并之后是第一列的值作为新值填充所以与第二列 * 的name一样
* name 导出时的列名名称
* type 导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
* imageType 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
* numFormat 数字格式化,参数是Pattern,使用的对象是DecimalFormat
* replace 值得替换 导出是{a_id,b_id} 导入反过来,所以只用写一个
* databaseFormat 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数 * 据库格式
*/
@Excel(name = "商品名称(规格描述、单位)" , type = 2 , imageType = 1 , height = 54 , width = 25)
private String picUrl; /**
* 商品名称
*/
@Excel(name = "商品名称(规格描述、单位)" , height = 54 , width = 25)
private String productName; /**
* 商品编码
*/
@Excel(name = "商品编码" , height = 54 , width = 25)
private String productCode; /**
* 原价
*/
@Excel(name = "原价" , height = 54 , width = 25 , numFormat = "0.00")
private BigDecimal primeCost; /**
* 售价
*/
@Excel(name = "售价" , height = 54 , width = 25 , numFormat = "0.00")
private BigDecimal price; /**
* 库存
*/
@Excel(name = "库存" , height = 54 , width = 25)
private int repertory; /**
* 商品状态(0未提交1已提交2已上架3已下架)
*/
@Excel(name = "商品状态" , height = 54 , width = 25 , replace = {"未提交_0","已提交_1","已上架_2","已下架_3"})
private int productStatus; /**
* 上架时间
*/
@Excel(name = "上架时间" , height = 54 , width = 25 , databaseFormat = "yyyy-MM-dd HH:mm:ss" , format = "yyyy-MM-dd HH:mm:ss")
private String addedTime; /**
* 审核状态(0--1未审核2审核成功3审核失败)
*/
@Excel(name = "审核状态" , height = 54 , width = 25 , replace = {"--_0","未审核_1","审核成功_2","审核失败_3"})
private int auditStatus; /**
* 审核人姓名
*/
@Excel(name = "审核人姓名" , height = 54 , width = 25)
private String auditUserName; /**
* 创建人姓名
*/
@Excel(name = "创建人姓名" , height = 54 , width = 25)
private String createUserName; /**
* 创建时间
*/
@Excel(name = "创建时间" , height = 54 , width = 25 , databaseFormat = "yyyy-MM-dd HH:mm:ss" , format = "yyyy-MM-dd HH:mm:ss")
private Date createTime; }
编写导出控制层代码
@ApiOperation(value = "导出" , notes = "导出")
@GetMapping("exportProduct")
public void exportProduct(@RequestParam("productIdList") List<String> productIdList, HttpServletRequest request, HttpServletResponse response) throws Exception{
ecCommodityManagementService.exportProduct(productIdList,request,response);
}
编写导出业务层代码
/**
* 导出
* @param productIdList
* @param request
* @param response
*/
@Override
public void exportProduct(List<String> productIdList, HttpServletRequest request, HttpServletResponse response) throws Exception{
//如果勾选商品则查询勾选的数据,如没有勾选则查所有商品数据
List<EcCommodityManagementExportVo> ecCommodityManagementList = ecCommodityManagementMapper.findExportData(productIdList);
if (ecCommodityManagementList != null && ecCommodityManagementList.size() > 0){
//封装图片数据
for (EcCommodityManagementExportVo ecCommodityManagementExportVo : ecCommodityManagementList) {
//导出图片时如果是链接形式要填写全路径
ecCommodityManagementExportVo.setPicUrl(fileUrl + ecCommodityManagementExportVo.getPicUrl());
}
}
//设置导出文件表头及sheet名
ExportParams exportParams = new ExportParams("商品列表", "商品列表");
//设置导出类型为Excel
exportParams.setType(ExcelType.XSSF);
//创建数据导出对象
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, EcCommodityManagementExportVo.class, ecCommodityManagementList);
//合并单元格new CellRangeAddress(从第几行开始, 到第几行结束, 从第几列开始, 到第几列结束)
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 1);
workbook.getSheetAt(0).addMergedRegion(cellAddresses);
//创建导出文件名
String fileName = "商品列表.xlsx";
if (workbook != null){
//让浏览器看的懂我们要干啥
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type","application/vnd.ms-excel");
response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
workbook.write(response.getOutputStream());
}
}
注:持久层代码就不贴了
编写导入使用的Javabean,根据具体的需求来定。
//导入实体类的唯一标识
@ExcelTarget("uploadExcel")
//提供get、set
@Data
//实现序列化
public class UploadExcelVo implements Serializable {
//name 对应导入的Excel中的列名,必须一致!
@Excel(name = "题目")
private String topic; @Excel(name = "选项A")
private String optionA; @Excel(name = "选项B")
private String optionB; @Excel(name = "选项C")
private String optionC; @Excel(name = "选项D")
private String optionD; @Excel(name = "正确答案(多个答案逗号隔开且必须大写)")
private String rightAnswers; }
编写导入控制层代码
@ApiOperation(value = "题目模板导入" , notes = "题目模板导入")
@PostMapping("uploadExcel")
@ResponseBody
public ResultBody uploadExcel(HttpServletRequest request,MultipartFile file){
return sybQuestionBankService.uploadExcel(request,file);
}
编写导入业务层代码
`/**
* 题目模板导入
* @param file
* @return
*/
@Override
public ResultBody uploadExcel(HttpServletRequest request,MultipartFile file) {
//导入数据总条数
int totalNum = 0;
//导入成功条数
int cg = 0;
try {
String bankId = request.getParameter("bankId");
//创建数据导入规则对象
ImportParams importParams = new ImportParams();
//设置第一行为表头不读取
importParams.setHeadRows(1);
//验证Excel
importParams.setNeedVerify(true);
//工具类进行读取直接封装返回值类型UploadExcelVo
ExcelImportResult<UploadExcelVo> objectExcelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), UploadExcelVo.class, importParams);
//遍历读取到的数据
if (objectExcelImportResult.getList() != null && objectExcelImportResult.getList().size() > 0){
totalNum = objectExcelImportResult.getList().size();
SybQuestionBankDetail byQuestionBankIdLimitOne = sybQuestionBankDetailDao.findByQuestionBankIdLimitOne(bankId);
int detailSort = 0;
if (byQuestionBankIdLimitOne != null && !byQuestionBankIdLimitOne.equals("")){
detailSort = byQuestionBankIdLimitOne.getDetailSort()+1;
}else {
detailSort = 1;
}
for (UploadExcelVo uploadExcelVo : objectExcelImportResult.getList()) {
//创建题目对象进行存储数据
SybQuestionBankDetail sybQuestionBankDetail = new SybQuestionBankDetail();
sybQuestionBankDetail.setId(UUIDGenerator.getUUID());
sybQuestionBankDetail.setIsDelete(0);
sybQuestionBankDetail.setTopic(uploadExcelVo.getTopic());
sybQuestionBankDetail.setQuestionBankId(bankId);
sybQuestionBankDetail.setDetailSort(detailSort);
sybQuestionBankDetail.setCreateTime(new Date());
//封装题目选项
List<Map<String,Object>> options = new ArrayList<>();
Map<String,Object> mapA = new HashMap<>();
mapA.put("optionKey","A");
mapA.put("optionValue",uploadExcelVo.getOptionA());
options.add(mapA);
Map<String,Object> mapB = new HashMap<>();
mapB.put("optionKey","B");
mapB.put("optionValue",uploadExcelVo.getOptionB());
options.add(mapB);
if (uploadExcelVo.getOptionC() != null && !uploadExcelVo.getOptionC().equals("")){
Map<String,Object> mapC = new HashMap<>();
mapC.put("optionKey","C");
mapC.put("optionValue",uploadExcelVo.getOptionC());
options.add(mapC);
}
if (uploadExcelVo.getOptionD() != null && !uploadExcelVo.getOptionD().equals("")){
Map<String,Object> mapD = new HashMap<>();
mapD.put("optionKey","D");
mapD.put("optionValue",uploadExcelVo.getOptionD());
options.add(mapD);
}
sybQuestionBankDetail.setOptions(JSON.toJSONString(options));
//封装正确答案
String[] split = uploadExcelVo.getRightAnswers().split(",", -1);
sybQuestionBankDetail.setRightAnswers(JSON.toJSONString(split));
int insert = sybQuestionBankDetailDao.insert(sybQuestionBankDetail);
if (insert > 0){
detailSort++;
cg++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return ResultBody.ok().data("应导入"+totalNum+"条题目,导入成功"+cg+"条");
}
注:持久层代码就不贴了
以上就是easypoi的导入导出的使用。
关于java的Excel导入导出之easypoi的更多相关文章
- JAVA实现Excel导入/导出【转】
JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...
- java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)
最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
- java中excel导入\导出工具类
1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...
- Java POI Excel 导入导出
这个东西很容易懂,不是特别难,难就难在一些复杂的计算和Excel格式的调整上. 近期写了一个小列子,放上来便于以后使用. POI.jar下载地址:http://mirror.bit.edu.cn/ap ...
- Java 使用 Jxl 实现 Excel 导入导出
开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的.这里做一下使用JXL的学习记录.首先需要导入相应的 ...
- Java Excel 导入导出(一)
本文主要描述通过java实现Excel导入导出 一.读写Excel三种常用方式 1.JXL——Java Excel开放源码项目:读取,创建,更新 2.POI——Apache POI ,提供API给Ja ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- Java之POI的excel导入导出
一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...
随机推荐
- liunx 安装ActiveMQ 及 spring boot 初步整合 activemq
源码地址: https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget https://arch ...
- 银行业评分卡制作——IV、WOE
参考链接:https://blog.csdn.net/kevin7658/article/details/50780391 1.IV的用途 IV的全称是Information Value,中文意思是信 ...
- SOUI3界面编辑器使用说明
SOUI一直没有官方的界面编辑器,关键是我自己一直坚持手写界面更好控制. 大概是2年前,网友"指尖"开发了一个SOUI2的编辑器,功能非常多,特点是可以拖动控件来实现可视化布局. ...
- <转>libevent基本使用demo
这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...
- [BUUCTF]REVERSE——[ACTF新生赛2020]Oruga
[ACTF新生赛2020]Oruga 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索字符串,根据提示来到关键函数 14行~18行就是让字符串的前5位是 actf{ ,sub_78A( ...
- CF1106A Lunar New Year and Cross Counting 题解
Content 试求出在一个 \(n\times n\) 的地图 \(M\) 中,满足 \(1\leqslant i,j\leqslant n\) 且 \(M_{i,j}=M_{i+1,j+1}=M_ ...
- LuoguP7127 「RdOI R1」一次函数(function) 题解
Content 设 \(S_k\) 为直线 \(f(x)=kx+k-1\),直线 \(f(x)=(k+1)x+k\) 与 \(x\) 轴围成的三角形的面积.现在给出 \(t\) 组询问,每组询问给定一 ...
- JavaScript数组的push()等方法的使用
数组是值得有序集合.每个值在数组中有一个位置,用数字表示,叫做索引.JavaScript数组是无类型的:数组元素可以是任何类型,而且同一个数组中可以存在不同类型元素,甚至可以是对象或是其他数组,这就可 ...
- .NET Core基础篇之:白话管道中间件
在.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景区很远 ...
- java数据类型:集合存储元素类型限制<泛型> ;自定义类指定泛型<T> 以及限制用法;派生子类泛型<T> super(泛型内参数); 泛型通配符?以及?限制用法
问题背景 Java 集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时 该对象的编译类型就变Object类型(其 ...