🍅 粉絲福利,限時搶購 領取九折優惠券
🍅 粉絲福利,限時搶購 《Java基礎教程系列》限時九折
🍅 粉絲福利,限時搶購 《Spring Boot基礎教程》限時九折
🍅 簡介:Java領域優質創作者🏆、CSDN哪吒公眾號作者? 、Java架構師奮斗者💪
🍅 掃描主頁左側二維碼,加入群聊,一起學習、一起進步
🍅 歡迎點贊 👍 收藏 ?留言 📝
目錄
一、什么是easyExcel
二、讀取Excel插入資料
1、controller
2、service
3、serviceImpl
4、EasyExcelListener
5、mapper
6、mapper.xml
7、物體類Student
8、前端vue關鍵代碼
9、Excel
10、插入后效果
三、分批讀取Excel
四、寫入Excel
五、模板下載
1、controller
2、工具類
一、什么是easyExcel
EasyExcel是一個基于Java的簡單、省記憶體的讀寫Excel的開源專案,在盡可能節約記憶體的情況下支持讀寫百M的Excel,
二、讀取Excel插入資料
1、controller
@Autowired
private StudentService service;
@Description(desc = "easyExcel批量匯入")
@RequestMapping(value = "/importByEasyExcel", method = RequestMethod.POST)
@ResponseBody
public String importByEasyExcel(@RequestPart(value = "file") MultipartFile file,
@RequestParam(value = "id") String id) {
// easyExcel批量匯入
service.importByEasyExcel(file, service);
return "匯入成功";
}
2、service
// 批量匯入
void importToExcel(MultipartFile file, StudentService service) throws Exception;
3、serviceImpl
/**
* 批量匯入
*/
@Override
public void importToExcel(MultipartFile file, StudentService service) throws Exception {
InputStream in = file.getInputStream();
EasyExcel.read(in, Student.class, new EasyExcelListener(service)).sheet().doRead();
}
4、EasyExcelListener
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 批量匯入監聽器 easyExcel
*/
public class EasyExcelListener extends AnalysisEventListener<Student> {
public static List<Student> list = new ArrayList<Student>();
public StudentService studentService ;
public EasyExcelListener(StudentService studentService) {
this.studentService = studentService;
}
/**
* 逐行處理
*/
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
list.add(student);
}
/**
* 讀取表頭內容
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
}
/**
* 批量入庫
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
studentService.insertBatchStudent();
}
}
5、mapper
@Override
public void insertBatchStudent() {
mapper.insertBatchStudent(EasyExcelListener.list);
}
@Description(desc = "easyExcel 批量匯入")
void insertBatchStudent(List<Student> list);
6、mapper.xml
<!-- 通過easyExcel批量匯入 -->
<insert id="insertBatchStudent" parameterType="list">
begin
<foreach collection="list" item="item" index="index" separator=";" >
insert into STUDENT
<trim prefix="(" suffix=")" suffixOverrides="," >
id,
name,
nick_name
</trim>
values (
#{item.id,jdbcType=CHAR},
#{item.name,jdbcType=VARCHAR},
#{item.nick_name,jdbcType=VARCHAR}
)
</foreach>
;end;
</insert>
7、物體類Student
import com.alibaba.excel.annotation.ExcelProperty;
public class Student {
@ExcelProperty(value = {"編號"}, index = 0)
private String id;
@ExcelProperty(value = {"姓名"}, index = 1)
private String name;
@ExcelProperty(value = {"稱號"}, index = 2)
private String nick_name;
}
8、前端vue關鍵代碼
request({
url: '/nezha/importByEasyExcel',
method: 'post',
data: form
}).then(response => {
if (response.data === 'success') {
this.$message.success('excel匯入成功!')
} else {
this.$message.error(response.data)
}
})
9、Excel

10、插入后效果

三、分批讀取Excel
分批讀取Excel是easyExcel最重要的功能,easyExcel未出現之前,讀取Excel都是使用Apache 的POI,poi會將Excel的內容全部讀取到記憶體中,如果資料量過大,很容易造成資料溢位的問題,
而easyExcel是逐行讀取 Excel,可以設定一個理想的閾值,分批次讀取,并插入資料庫,間接的也緩解了資料庫的壓力,
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 批量匯入監聽器 easyExcel
*/
public class EasyExcelListener extends AnalysisEventListener<Student> {
private static final Logger logger = LoggerFactory.getLogger(EasyExcelListener.class);
/**
* 批處理閾值
*/
private static final int BATCH_COUNT = 1000;
public static List<Student> list = new ArrayList<Student>(BATCH_COUNT);
public StudentService studentService ;
public EasyExcelListener(StudentService studentService) {
this.studentService = studentService;
}
/**
* 逐行處理
*/
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
list.add(student);
if (list.size() >= BATCH_COUNT) {
// 批量入庫
saveData();
list.clear();
}
}
/**
* 讀取表頭內容
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
}
/**
* 所有資料決議完成了 都會來呼叫
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 批量入庫
saveData();
}
/**
* 批量入庫
*/
private void saveData() {
logger.info("{}條資料,開始存盤資料庫!", list.size());
studentService.insertBatchStudent();
logger.info("存盤資料庫成功!");
}
}
四、寫入Excel
@Test
public void simpleWrite() {
// 寫法1
String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 這里 需要指定寫用哪個class去寫,然后寫到第一個sheet,名字為模板 然后檔案流會自動關閉
// 如果這里想使用03 則 傳入excelType引數即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
// 寫法2
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 這里 需要指定寫用哪個class去寫
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
// 千萬別忘記finish 會幫忙關閉流
excelWriter.finish();
}
五、模板下載
1、controller
@Description(desc = "模板下載")
@RequestMapping(value = "/download_template", method = RequestMethod.POST)
@ResponseBody
public void downloadTempalate(HttpServletResponse response) throws IOException {
ExcelUtil.downloadTempalate(response, EasyTemplate);
}
2、工具類
public static void downloadTempalate(HttpServletResponse response, String filepath) throws IOException {
File path = new File(ResourceUtils.getURL("classpath:").getPath());
InputStream input = null;
OutputStream output = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
input = new BufferedInputStream(new FileInputStream(path + filepath));
// 得到檔案大小
int i = input.available();
// 開辟記憶體空間,用來存放讀取內容
byte data[] = new byte[1024];
// 下載處理
bis = new BufferedInputStream(input);
int bytes = 0;
output = response.getOutputStream();
bos = new BufferedOutputStream(output);
while ((bytes = bis.read(data, 0, data.length)) != -1) {
bos.write(data, 0, bytes);
}
bos.flush();
}
六、粉絲福利
1、Vue.js 3.0從入門到實戰
2、SQL從入門到精通
3、手把手教你學Linux
4、Oracle資料庫管理從入門到精通
本次活動送書規則:
1、社區積分榜前5名,隨機抽取一名幸運者
2、社區積分榜6-15名,隨機抽取一名幸運者
3、社區積分榜16-30名,隨機抽取一名幸運者
【賺取積分方式】哪吒社區內發帖、點贊、評論都可贏取積分!
🍅 粉絲福利,限時搶購 領取九折優惠券
🍅 粉絲福利,限時搶購 《Java基礎教程系列》限時九折
🍅 粉絲福利,限時搶購 《Spring Boot基礎教程》限時九折
🍅 社區入口:雙11勁爆來襲,哪吒微信群,圖書共讀活動火熱進行中
上一篇:【Spring Boot 27】RabbitMQ基礎知識總結
下一篇:SpringBoot學習路線總結,跟著路線走,不迷路(附思維導圖)

添加微信,備注1024,贈送Java學習路線思維導圖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/354627.html
標籤:java
