package com.fsinfo.common.utils; import com.fsinfo.modules.enterprise.entity.EnterpriseRecordEntity; import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * @Author leijiaxuan
* @Email 897953910@qq.com * @Date 9:50 2020/7/22 **/ public class ExcelInsert { // private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日志打印類 private static final String XLS = "xls"; private static final String XLSX = "xlsx"; /** * 根據文件后綴名類型獲取對應的工作簿對象 * @param inputStream 讀取文件的輸入流 * @param fileType 文件后綴名類型(xls或xlsx) * @return 包含文件數據的工作簿對象 * @throws IOException */ public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException { Workbook workbook = null; if (fileType.equalsIgnoreCase(XLS)) { workbook = new HSSFWorkbook(inputStream); } else if (fileType.equalsIgnoreCase(XLSX)) { workbook = new XSSFWorkbook(inputStream); } return workbook; } /** * 讀取Excel文件內容 * @param myfile 要讀取的Excel文件流 * @return 讀取結果列表,讀取失敗時返回null */ public static List<EnterpriseRecordEntity> readExcel(MultipartFile myfile) { Workbook workbook = null; FileInputStream inputStream = null; try { // 獲取Excel后綴名 String fileName=myfile.getOriginalFilename(); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); // // 獲取Excel文件 // File excelFile = new File(fileName); // if (!excelFile.exists()) { //// logger.warning("指定的Excel文件不存在!"); // return null; // } File file = new File(myfile.getOriginalFilename()); FileUtils.copyInputStreamToFile(myfile.getInputStream(), file); // 獲取Excel工作簿 inputStream = new FileInputStream(file); workbook = getWorkbook(inputStream, fileType); // 會在本地產生臨時文件,用完后需要刪除 if (file.exists()) { file.delete(); } // 讀取excel中的數據 List<EnterpriseRecordEntity> resultDataList = parseExcel(workbook); return resultDataList; } catch (Exception e) { // logger.warning("解析Excel失敗,文件名:" + fileName + " 錯誤信息:" + e.getMessage()); return null; } finally { try { if (null != workbook) { workbook.close(); } if (null != inputStream) { inputStream.close(); } } catch (Exception e) { // logger.warning("關閉數據流出錯!錯誤信息:" + e.getMessage()); return null; } } } /** * 解析Excel數據 * @param workbook Excel工作簿對象 * @return 解析結果 */ private static List<EnterpriseRecordEntity> parseExcel(Workbook workbook) { List<EnterpriseRecordEntity> resultDataList = new ArrayList<>(); // 解析sheet for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) { Sheet sheet = workbook.getSheetAt(sheetNum); // 校驗sheet是否合法 if (sheet == null) { continue; } // 獲取第一行數據 int firstRowNum = sheet.getFirstRowNum(); Row firstRow = sheet.getRow(firstRowNum); if (null == firstRow) { // logger.warning("解析Excel失敗,在第一行沒有讀取到任何數據!"); } // 解析每一行的數據,構造數據對象 int rowStart = firstRowNum + 1; int rowEnd = sheet.getPhysicalNumberOfRows(); for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) { Row row = sheet.getRow(rowNum); if (null == row) { continue; } EnterpriseRecordEntity resultData = convertRowToData(row); if (null == resultData) { // logger.warning("第 " + row.getRowNum() + "行數據不合法,已忽略!"); continue; } resultDataList.add(resultData); } } return resultDataList; } /** * 將單元格內容轉換為字符串 * @param cell * @return */ private static String convertCellValueToString(Cell cell) { if(cell==null){ return null; } String returnValue = null; switch (cell.getCellType()) { case 0: //數字 if (HSSFDateUtil.isCellDateFormatted(cell)) {// 處理日期格式、時間格式 SimpleDateFormat sdf = null; if (cell.getCellStyle().getDataFormat() == HSSFDataFormat .getBuiltinFormat("h:mm")) { sdf = new SimpleDateFormat("HH:mm"); } else {// 日期 sdf = new SimpleDateFormat("yyyy-MM-dd"); } Date date = cell.getDateCellValue(); returnValue = sdf.format(date); } else if (cell.getCellStyle().getDataFormat() == 58) { // 處理自定義日期格式:m月d日(通過判斷單元格的格式id解決,id的值是58) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); double value = cell.getNumericCellValue(); Date date = org.apache.poi.ss.usermodel.DateUtil .getJavaDate(value); returnValue = sdf.format(date); } else { double value = cell.getNumericCellValue(); CellStyle style = cell.getCellStyle(); DecimalFormat format = new DecimalFormat(); String temp = style.getDataFormatString(); // 單元格設置成常規 if (temp.equals("General")) { format.applyPattern("#"); } returnValue = format.format(value); } break; case 1: //字符串 returnValue = cell.getStringCellValue(); break; case 4: //布爾 Boolean booleanValue = cell.getBooleanCellValue(); returnValue = booleanValue.toString(); break; case 2: // 空值 break; case 7: // 公式 returnValue = cell.getCellFormula(); break; case 64: // 故障 break; default: break; } return returnValue; } /** * 提取每一行中需要的數據,構造成為一個結果數據對象 * * 當該行中有單元格的數據為空或不合法時,忽略該行的數據 * * @param row 行數據 * @return 解析后的行數據對象,行數據錯誤時返回null */ private static EnterpriseRecordEntity convertRowToData(Row row) { EnterpriseRecordEntity resultData = new EnterpriseRecordEntity(); Cell cell; int cellNum = 0; // 獲取記錄日期 cell = row.getCell(cellNum++); String recorddate = convertCellValueToString(cell); resultData.setRecorddate(java.sql.Date.valueOf(recorddate)); // 獲取企業名稱 cell = row.getCell(cellNum++); String enterpriseuuid = convertCellValueToString(cell); resultData.setEnterpriseuuid(enterpriseuuid); // 獲取企業反映問題 cell = row.getCell(cellNum++); String recordcontext = convertCellValueToString(cell); resultData.setRecordcontext(recordcontext); // 獲取解決情況 cell = row.getCell(cellNum++); String handlinfo = convertCellValueToString(cell); resultData.setHandlinfo(handlinfo); // 獲取備注 cell = row.getCell(cellNum++); String remarks = convertCellValueToString(cell); resultData.setRemarks(remarks); return resultData; } }