1. 引入poi的两个依赖

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

2. controller层

package com.cdqd.app.controllers;

import com.cdqd.app.common.JsonRet;
import com.cdqd.app.exception.BizException;
import com.cdqd.app.service.TranslateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Objects; /**
* @description:
* @author: Rosa
* @create: 2018-12-24 10:06
**/
@RestController
@RequestMapping("translate")
public class TranslateController { @Autowired
private TranslateService translateService; @PostMapping("source/name")
public JsonRet translateSourceName(HttpServletRequest request) throws Exception{
MultipartRequest multipartHttpServletRequest = (MultipartRequest) request;
MultipartFile multipartFile = multipartHttpServletRequest.getFile("file"); //如果为空,抛出异常,此处为自定义异常,如有需要请改写
if (Objects.requireNonNull(multipartFile).isEmpty()){
throw new BizException(4001);
} //存储临时文件
String fileName = multipartFile.getOriginalFilename();
String prefix = fileName.substring(Objects.requireNonNull(fileName).lastIndexOf("."));
File file = File.createTempFile(System.currentTimeMillis() + "", prefix);
multipartFile.transferTo(file); //调用service对流进行具体操作
translateService.translateSourceDatabase(new FileInputStream(file));
return JsonRet.buildRet(0);//
}
}

3. service层(给自己回忆用的,针对性强,读者没有必要往下看了)

接口: TranslateService.java

package com.cdqd.app.service;

import java.io.InputStream;

public interface TranslateService {

    void translateSourceDatabase(InputStream inputStream);
}

实现文件: TranslateServiceImpl.java

package com.cdqd.app.service.impl;

import com.cdqd.app.common.StringUtil;
import com.cdqd.app.entity.DatabaseEntity;
import com.cdqd.app.entity.TableEntity;
import com.cdqd.app.exception.BizException;
import com.cdqd.app.mapper.ColumnMapper;
import com.cdqd.app.mapper.DatabaseMapper;
import com.cdqd.app.mapper.TableMapper;
import com.cdqd.app.model.Column;
import com.cdqd.app.model.Database;
import com.cdqd.app.model.Table;
import com.cdqd.app.service.TableService;
import com.cdqd.app.service.TranslateService;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* @description:
* @author: Rosa
* @create: 2018-12-24 10:04
**/
@Service
public class TranslateServiceImpl implements TranslateService { @Autowired
private DatabaseMapper databaseMapper; @Autowired
private TableMapper tableMapper; @Autowired
private ColumnMapper columnMapper; @Autowired
private TableService tableService; @Override
public void translateSourceDatabase(InputStream inputStream) {
Map<String, Map<String, TableEntity>> databaseMap = getTransMap(inputStream);
//遍历所有库
if (databaseMap != null) {
for (String databaseEnName : databaseMap.keySet()) {
Database database = new Database();
database.setDatabaseEnName(databaseEnName);
//如果库存在则开始遍历表
if (databaseMapper.selectOne(database) != null) {
Integer databaseId = databaseMapper.selectOne(database).getDatabaseId();
//MapKey("tableEnName")
Map<String, TableEntity> dbTableMap = tableService.getTableEntityMap(databaseId); //<表英文名, 表实体>
Map<String, TableEntity> excelTableMap = databaseMap.get(databaseEnName); //遍历数据库map的表实体
for (String dbTableEnName : dbTableMap.keySet()) {
TableEntity dbTableEntity = dbTableMap.get(dbTableEnName);
//如果excel数据中有这边的表
if (excelTableMap.containsKey(dbTableEnName)) {
TableEntity excelTableEntity = excelTableMap.get(dbTableEnName);
//源表表名翻译
if (!StringUtil.isEmpty(excelTableEntity.getTableCnName())) {
Table table = new Table();
table.setTableId(dbTableEntity.getTableId());
table.setTableCnName(excelTableEntity.getTableCnName());
tableMapper.updateByPrimaryKeySelective(table);
}
//如果列不为空的话
if (dbTableEntity.getColumnList() != null && excelTableEntity.getColumnMap() != null) {
//<列英文名, 列实体>
Map<String, Column> excelColumnMap = excelTableEntity.getColumnMap();
for (Column dbColumn : dbTableEntity.getColumnList()) {
if (excelColumnMap.containsKey(dbColumn.getColumnEnName())) {
String columnCnName = excelColumnMap.get(dbColumn.getColumnEnName()).getColumnCnName();
if (!StringUtil.isEmpty(columnCnName)) {
//如果列中文名不为空,翻译列名
Column column = new Column();
column.setColumnId(dbColumn.getColumnId());
column.setColumnCnName(columnCnName);
columnMapper.updateByPrimaryKeySelective(column);
} }
}
}
}
}
}
}
}
// return TRANS_MAP;
} private Map<String, Map<String, TableEntity>> getTransMap(InputStream inputStream) {
Map<String, Map<String, TableEntity>> databaseMap = new HashMap<>();
try {
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = workbook.getSheetAt(0);
for (int row = 1; row < sheet.getLastRowNum(); row++) {
XSSFRow xssfRow = sheet.getRow(row);
if (xssfRow.getCell(0) == null) {
continue;
}
String databaseName = String.valueOf(xssfRow.getCell(0));
String tableEnName = String.valueOf(xssfRow.getCell(1));
String tableCnName = String.valueOf(xssfRow.getCell(2));
String columnEnName = String.valueOf(xssfRow.getCell(3));
String columnCnName = String.valueOf(xssfRow.getCell(4)); Column column = new Column();
column.setColumnEnName(columnEnName);
column.setColumnCnName(columnCnName); if (tableEnName == null) {
continue;
}
if (databaseMap.containsKey(databaseName)) { //<表英文名, 表实体>
Map<String, TableEntity> excelTableMap = databaseMap.get(databaseName);
//如果表存在,获取那个表实体
if (excelTableMap.containsKey(tableEnName)) {
TableEntity excelTableEntity = excelTableMap.get(tableEnName); if (columnEnName != null && !columnEnName.equals("")) {
if (excelTableEntity.getColumnMap() != null) {
Map<String, Column> columnMap = excelTableEntity.getColumnMap();
columnMap.put(columnEnName, column);
excelTableEntity.setColumnMap(columnMap);
} else {
Map<String, Column> columnMap = new HashMap<>();
columnMap.put(columnEnName, column);
excelTableEntity.setColumnMap(columnMap);
}
}
excelTableMap.put(tableEnName, excelTableEntity);
} else {
//表不存在时插入表
TableEntity excelTableEntity = new TableEntity();
excelTableEntity.setTableEnName(tableEnName);
excelTableEntity.setTableCnName(tableCnName);
if (columnEnName != null && !columnEnName.equals("")) {
Map<String, Column> columnMap = new HashMap<>();
columnMap.put(columnEnName, column);
excelTableEntity.setColumnMap(columnMap);
}
excelTableMap.put(tableEnName, excelTableEntity);
}
} else {
Map<String, TableEntity> excelTableMap = new HashMap<>();
TableEntity excelTableEntity = new TableEntity();
excelTableEntity.setTableEnName(tableEnName);
excelTableEntity.setTableCnName(tableCnName);
if (columnEnName != null && !columnEnName.equals("")) {
Map<String, Column> columnMap = new HashMap<>();
columnMap.put(columnEnName, column);
excelTableEntity.setColumnMap(columnMap);
}
excelTableMap.put(tableEnName, excelTableEntity);
databaseMap.put(databaseName, excelTableMap);
}
}
return databaseMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

spring boot缓存excel临时文件后再操作的更多相关文章

  1. Spring Boot项目指定启动后执行的操作

    Spring Boot项目指定启动后执行的操作: (1)实现CommandLineRunner 接口 (2)重写run方法 (3)声明执行顺序@Order(1),数值越小,优先级越高 (4)如果需要注 ...

  2. Spring boot缓存初体验

    spring boot缓存初体验 1.项目搭建 使用MySQL作为数据库,spring boot集成mybatis来操作数据库,所以在使用springboot的cache组件时,需要先搭建一个简单的s ...

  3. 3步轻松搞定Spring Boot缓存

    作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...

  4. 如何解决spring boot 项目导入依赖后代码报错问题

    如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15  14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片)

  5. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  6. Spring Boot 导出Excel表格

    Spring Boot 导出Excel表格 添加支持 <!--添加导入/出表格依赖--> <dependency> <groupId>org.apache.poi& ...

  7. Spring Boot缓存Ehcache

    Spring Boot 整合 Ehcache   修改 pom 文件 <!-- Spring Boot 缓存支持启动器 --> <dependency> <groupId ...

  8. spring boot, 容器启动后执行某操作

    常有在spring容器启动后执行某些操作的需求,现做了一个demo的实现,做一下记录,也希望可以给需要的同学提供参考. 1.spring启动后,以新线程执行后续需要的操作,所以执行类实现Runnabl ...

  9. Spring boot 配置 Tomcat 临时文件缓存目录

    1. 问题现象 spring boot 项目中,Tomcat 接收到 content-type 为 multipart/form-data 的请求时,需要将接收的文件缓存到临时目录(默认下载 /tmp ...

随机推荐

  1. django之分页器、多对多关系、form校验组件

    批量插入数据 bulk_create # 1.往书籍表中插入数据 1000 # for i in range(1000): # 这种插入方式 效率极低 # models.Book.objects.cr ...

  2. 在springboot中使用redis缓存,将缓存序列化为json格式的数据

    背景 在springboot中使用redis缓存结合spring缓存注解,当缓存成功后使用gui界面查看redis中的数据 原因 springboot缓存默认的序列化是jdk提供的 Serializa ...

  3. n8n 试用

    前边有简单的介绍n8n,如果大家看了官方网站会有一个比较醒目的说明zapier以及tray.io的开源替代方案 以下是一个简单的试用 环境准备 docker-compose 文件   version: ...

  4. [LeetCode] 913. Cat and Mouse 猫和老鼠

    A game on an undirected graph is played by two players, Mouse and Cat, who alternate turns. The grap ...

  5. [LeetCode] 903. Valid Permutations for DI Sequence DI序列的有效排列

    We are given S, a length n string of characters from the set {'D', 'I'}. (These letters stand for &q ...

  6. 下载工具系列——Aria2 (几乎全能的下载神器)

    一.介绍 说完了前面一堆BT/PT客户端,现在终于轮到Aria2了,关于这个我就不介绍太多了,自从百度限速以来我觉得这个快变成众所周知的了,我平时也收集了各种和Aria2相关的插件或者是辅助软件之类的 ...

  7. git生成并添加SSH key

    1.安装Git Bash https://git-scm.com/downloads 2.鼠标右键git bash here 3.执行以下命令: ①   cd ~/.ssh/    [如果没有对应的文 ...

  8. cv2.putText,cv2.rectangle方法

    常用方法:cv2.putText(img,xy,(x1,y1), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), thickness=2)img:要作用的图片xy:显示 ...

  9. Unsafe例子

    Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存.Java中的Unsafe类为我们提供了类似C++手动管理内存的能力,不建议使 ...

  10. SpringMVC-方法四种类型返回值总结,你用过几种?

    SpringMVC 现在算是 Java 领域的一个基础性框架了,很多人天天用,可是对于 SpringMVC 方法的返回值,你又是否完全清楚呢?今天松哥就来和大家聊一聊 SpringMVC 中四种不同类 ...