excel 表格导入 - java 实现

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 

import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.foreveross.security.service.extension.ApplicationException;
import com.foreveross.springboot.dubbo.utils.Payload;
import com.XXX.XXX.domain.dto.ProjectImportDto;
import com.xxx.xxx.service.rest.api.ProjectImportRestService;
import com.google.common.collect.Lists;
import com.sargeraswang.util.ExcelUtil.ExcelLogs;
import com.sargeraswang.util.ExcelUtil.ExcelUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.UUID;/*** 导入xxxx数据*/
@Service("projectImportRestService")
@Path("/api/v1/project")
public class ProjectImportRestServiceImpl implements ProjectImportRestService {private static Logger logger = LoggerFactory.getLogger(ProjectImportRestServiceImpl.class);@PersistenceUnitprivate EntityManagerFactory emf;private List<String> questionIds; // 存储问题数据@POST@Path("/import")@Consumes({MediaType.MULTIPART_FORM_DATA})@Produces({MediaType.APPLICATION_JSON})@Overridepublic Payload importProject(@Context HttpServletRequest request, @Context HttpServletResponse response) {response.setCharacterEncoding("UTF-8");boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (isMultipart) {FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);// 支持中文文件名upload.setHeaderEncoding("utf-8");List<FileItem> fileItems = Lists.newArrayList(); // guava 不用处理泛型,左边是什么类型,右边可以自动匹配。如果list里面放map这种,就可以自动转换。try {fileItems = upload.parseRequest(request);FileItem fileItem = fileItems.get(0); // 可以多文件上传,只有一个文件,所以get(0),取第一个。//获得上传的文件名String name = UUID.randomUUID().toString() + "-" + fileItem.getName();String filePath = "/home/logs";this.upload4Stream(name, filePath, fileItem.getInputStream());} catch (ApplicationException ex) {ex.printStackTrace();
//                return new Payload(ex.getMessage());throw new ApplicationException(Response.Status.NOT_IMPLEMENTED, ex.getMessage());} catch (Exception e) {e.printStackTrace();throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "导入发生异常:", e);}} else {throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "请上传文件");}return new Payload("Success "+questionIds);}/*** 上传文件具体操作     ** @param fileName 文件名* @param filePath 文件上传路径* @param inStream 文件流* @return 上传是否成功*/private boolean upload4Stream(String fileName, String filePath,InputStream inStream) throws Exception {boolean result = false;if ((filePath == null) || (filePath.trim().length() == 0)) {return result;}File outputFile = null;try {String wholeFilePath = filePath + File.separator + fileName;File dir = new File(filePath);if (!dir.exists()) {dir.mkdirs();}outputFile = new File(wholeFilePath);boolean isFileExist = outputFile.exists();boolean canUpload = true;if (isFileExist) {canUpload = outputFile.delete();}if (canUpload) {FileUtils.copyInputStreamToFile(inStream, outputFile);//导入数据库importData(outputFile);}} finally {FileUtils.deleteQuietly(outputFile);}return result;}/*** 导入Excel 数据到数据库* @param file* @throws Exception*/private void importData(File file) throws Exception {InputStream inputStream = new FileInputStream(file);ExcelLogs logs = new ExcelLogs();Collection<ProjectImportDto> list = ExcelUtil.importExcel(ProjectImportDto.class, inputStream,"yyyy-MM-dd HH:mm:ss", logs);EntityManager em = getEm();try {int i = 0;for (ProjectImportDto dto : list) {if (StringUtils.isEmpty(dto.getProjectCode())) {throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "xxx编号不能为空,请输入xxx编号,并检查是否为文本类型");}String querySql = "select * from GAEI_PROJECT where CODE = '" + dto.getProjectCode() + "'";List<Object> objectArrayList = em.createNativeQuery(querySql).getResultList();int result;try {em.getTransaction().begin();if (!CollectionUtils.isEmpty(objectArrayList)) {Object[] data = (Object[]) objectArrayList.get(0);JSONArray jsonArray = JSON.parseArray(data[9].toString());
//                        -----------------------------------------checkManagerId(dto,em);
//                        -----------------------------------------String professionJson = toProfessionJson(jsonArray, dto);String updateSql = "update GAEI_PROJECT set PROFESSIONAL_GROUP='" +professionJson + "' where CODE = '" + dto.getProjectCode() + "'";result = em.createNativeQuery(updateSql).executeUpdate();} else {
//                        -----------------------------------------checkManagerId(dto,em);
//                        -----------------------------------------JSONArray jsonArray = new JSONArray();String insertSql = "insert into GAEI_PROJECT (SOURCE, PROJECT_DIRECTOR_NO, CODE, STATUS,CREATED_AT, PROFESSIONAL_GROUP) " +" values ('本系统新增', " +"'" + gedProjectDirectorId(dto.getProjectManagerCode(),em) + "'," +"'" + dto.getProjectCode() + "'," +"'正常'," +"'" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "'," +"'" + toProfessionJson(jsonArray, dto) + "')";result = em.createNativeQuery(insertSql).executeUpdate();}em.getTransaction().commit();} catch (ApplicationException ex) {ex.printStackTrace();throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, ex.getMessage());} catch (Exception ex) {ex.printStackTrace();em.getTransaction().rollback();throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "导入xxxx数据失败", ex);}if (result <= 0) {throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "插入xxx数据失败");}}} catch (ApplicationException ex) {ex.printStackTrace();throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, ex.getMessage());}catch (Exception ex) {ex.printStackTrace();throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, ex.getMessage());} finally {if (null != em) {em.close();}}}/*** 得xxxxid* @param projectManagerCode* @param em* @return*/private String gedProjectDirectorId(String projectManagerCode,EntityManager em){if(projectManagerCode.length() <3){ // 没有工号return "00000";}String getIdSql = "select id from appbricks_user where usernumber = '" + projectManagerCode + "'";String projectDirectorId = (String)em.createNativeQuery(getIdSql).getSingleResult();if(null == projectDirectorId){questionIds.add("xxx工号:"+projectManagerCode);throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "xxx工号: "+projectManagerCode+" 有误,请核查");}return projectDirectorId;}/*** 设置xxxxid* @param dto* @param em*/private ProjectImportDto checkManagerId(ProjectImportDto dto,EntityManager em){String getManagerIdSql = "select id from appbricks_user where usernumber = '" + dto.getProfessionGroupManagerCode() + "'";if(null != dto && null != dto.getProfessionGroupManagerCode()){if(dto.getProfessionGroupManagerCode().length()>4 ){ // 长度大于4String managerId = null;try{managerId = (String)em.createNativeQuery(getManagerIdSql).getSingleResult();}catch ( Exception e){questionIds.add("xxxx工号:"+dto.getProfessionGroupManagerCode());logger.info("------------------------------------------------------------------\nxxx导入,xxxid不正确"+ e.getMessage());throw new ApplicationException(Response.Status.INTERNAL_SERVER_ERROR, "xxxx工号: "+dto.getProfessionGroupManagerCode()+" 有误,请核查");}dto.setProfessionGroupManagerCode(String.valueOf(managerId));}else {dto.setProfessionGroupManagerCode("无");}}else {dto.setProfessionGroupManagerCode("无");}return dto;}/*** 得EntityManager** @return*/private EntityManager getEm() {return emf.createEntityManager();}/*** xxx转json* @param jsonArray* @param dto* @return*/private String toProfessionJson(JSONArray jsonArray, ProjectImportDto dto) {JSONObject jsonObject = new JSONObject();jsonObject.put("name", dto.getProfessionGroup());jsonObject.put("departmentId", "");jsonObject.put("managerId", dto.getProfessionGroupManagerCode());jsonObject.put("managerName", dto.getProfessionGroupManagerName());if(null == jsonArray){jsonArray = new JSONArray();}jsonArray.add(jsonObject);return JSONUtils.toJSONString(jsonArray);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 API

MySQL的C语言API接口 1、首先当然是连接数据库&#xff0c;函数原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组需要…

python第九天(9-33)

一&#xff1a;进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程进程一般由程序&#xff0c;数据集&#xff0c;进程控制块组成进程控制块&#xff1a; 进程控制块用来记录进程的外部特征&#xff0c;描述进程的执行变化过程&#xff0c;系统可以利用它来控…

Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt问题的解决

删除了/Users/tycao/.gradle/wrapper/dists目录下对应的gradle-X.X-all目录重新sync了

双机热备份和负载均衡的区别

1、双机热备相当于2台服务器其中有一台是另一台的备机&#xff0c;也可以互为备机&#xff1b;而且这两台主机的数据时实时同步的&#xff1b;主机在运行服务时&#xff0c;备机处于检测状态&#xff0c;主机发生故障后&#xff0c;备机将接管主机的服务。2、负载均衡是在这2台…

Python 数据类型--Bytes类型

一、Bytes类型 在Python3以后&#xff0c;字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的&#xff0c;bytes类型是以字节为单位处理的。 bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样&#xff0c;也是不可变的序列对象。 bytes对象只…

Android应用开发-onNewIntent()

转载自Android中 activity 的onNewIntent函数

文件结构

C语言文件名命名的规则 1、文件标识符分为两部分&#xff0c;即文件名前缀和后缀。文件名前缀的最前面要使用范围限定符——模块名&#xff08;文件名&#xff09;缩写。 2、采用小写字母命名文件&#xff0c;避免使用一些比较通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 陨石的秘密 (线性DP)

题意&#xff1a; 公元11380年&#xff0c;一颗巨大的陨石坠落在南极。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨石上刻…

bzoj2561 最小生成树

题意&#xff1a;给你无向图&#xff0c;给定一条边&#xff0c;求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解&#xff1a; 假装我们把边排序了&#xff0c;然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

Android应用开发—onSaveInstanceState方法什么时候被调用?

转载自onSaveInstanceState方法什么时候被调用?&#xff08;转载/整理&#xff09; 在 Activity 被销毁之前被调用来保存每个实例的状态&#xff0c;这样就可以保证该状态能够从 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢复过来。 本方法在 Activity 可能被销毁…

记一次phpstudy重启后Apache无法启动

相信大家都碰到过phpstudy中Apache无法启动的情况1、首先检查80端口是否占用&#xff0c;有的话就管理2、检查是否缺少vc9运行文件如果上述两种方法还不能解决问题就进入安装目录中Apache的bin目录下&#xff0c;在命令行窗口中执行httpd.exe&#xff0c;看看是否报错。我就是在…

C#任务调度——LimitedConcurrencyLevelTaskScheduler

这是参考大佬分享的代码写的有问题请提出指正&#xff0c;谢谢。using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TaskManager {class TaskFactoryMa…

同步本地远程分支 git remote prune origin

git remote prune origin &#xff08;不常用总忘记&#xff0c;记录下&#xff09;

264 参考帧 list0 list1

作了这么久的h264工作&#xff0c;这部分还一直从未去深入了解过&#xff0c;真是不求甚解啊&#xff0c;那帮老外的代码也写得太全了&#xff0c;该部分至今天才开始研究 首先参考帧这里关注的是两种&#xff0c;p ,b ,前向参考和后向参考 由白皮书中看到&#xff0c;p帧的参…

面试官问我:什么是JavaScript闭包,我该如何回答

闭包&#xff0c;有人说它是一种设计理念&#xff0c;有人说所有的函数都是闭包。到底什么是闭包&#xff1f;这个问题在面试是时候经常都会被问&#xff0c;很多小白一听就懵逼了&#xff0c;不知道如何回答好。这个问题也有很多朋友在公众号给李老师留言了&#xff0c;问题表…

robotframework基础学习(8)

变量的使用 在 Edit 标签页中主要分&#xff1a;加载外部文件、定义内部变量、定义元数据等三个部分。 &#xff08;1&#xff09;&#xff1a;加载外部文件Add Library&#xff1a;加载测试库&#xff0c;主要是[PYTHON 目录]\Lib\site-packages 里的测试库 Add Resource&…

版本字符串比较工具接口常用接口函数

版本升级比较常用的接口&#xff0c;字符串解析&#xff0c;不是很难&#xff0c;但没必须重复造轮子&#xff0c;保存一份网上搜到的实现&#xff1a; /*** 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0** param version1* param version2* return…

[蓝桥杯]ALGO-188.算法训练_P0504

Anagrams指的是具有如下特性的两个单词&#xff1a;在这两个单词当中&#xff0c;每一个英文字母&#xff08;不区分大小写&#xff09;所出现的次数都是相同的。例如&#xff0c;Unclear和Nuclear、Rimon和MinOR都是Anagrams。编写一个程序&#xff0c;输入两个单词&#xff0…

什么是3-2混合

正如上面所述&#xff0c;电影转换成视频时&#xff0c;每秒24帧必须转成每秒60场&#xff08;30帧&#xff09;。实现这一点的方法是把电影的第一帧显示3场&#xff0c;然后把第二帧显示2场&#xff0c;再把第三帧显示3场&#xff0c;以此类推。这个3-2-3-2-3-2的顺序就被称为…