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.pswp.cn/news/450010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450010.shtml
英文地址,請注明出處:http://en.pswp.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的順序就被稱為…