|
@@ -0,0 +1,318 @@
|
|
|
+package org.springblade.manager.excel;
|
|
|
+
|
|
|
+import com.alibaba.excel.util.CollectionUtils;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFCell;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+public class WbsExcelBatchUtil {
|
|
|
+/* public static void main(String[] args) throws IOException {
|
|
|
+ WbsExcelBatchUtil excelUtil = new WbsExcelBatchUtil();
|
|
|
+ //读取excel数据
|
|
|
+ ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\隧道总体.xlsx");
|
|
|
+ for (Map<String, String> map : result) {
|
|
|
+ System.out.println(map);
|
|
|
+ }
|
|
|
+ List<Map<String, String>> maps = WbsExcelBatchUtil.removeRepeatMapByKey(result, "表名");
|
|
|
+
|
|
|
+ }*/
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * List<Map>去重
|
|
|
+ * @param list
|
|
|
+ * @param mapKey
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static List<Map<String, String>> removeRepeatMapByKey(List<Map<String, String>> list, String mapKey) {
|
|
|
+ if (CollectionUtils.isEmpty(list)) return null;
|
|
|
+ List<Map<String, String>> listMap = new ArrayList<>();
|
|
|
+ Map<String, Map> msp = new HashMap<>();
|
|
|
+ for (int i = list.size() - 1; i >= 0; i--) {
|
|
|
+ Map map = list.get(i);
|
|
|
+ String id = map.get(mapKey).toString();//错误举例 (String)map.get(mapKey);
|
|
|
+ map.remove(mapKey);
|
|
|
+ msp.put(id, map);
|
|
|
+ }
|
|
|
+ Set<String> mspKey = msp.keySet();
|
|
|
+ for (String key : mspKey) {
|
|
|
+ Map newMap = msp.get(key);
|
|
|
+ newMap.put(mapKey, key);
|
|
|
+ listMap.add(newMap);
|
|
|
+ }
|
|
|
+ return listMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取excel数据
|
|
|
+ * @param path
|
|
|
+ */
|
|
|
+ public ArrayList<Map<String, String>> readExcelToObj(String path) throws IOException {
|
|
|
+ Workbook wb = null;
|
|
|
+ ArrayList<Map<String, String>> result = null;
|
|
|
+ try {
|
|
|
+ wb = WorkbookFactory.create(new File(path));
|
|
|
+ result = readExcel(wb, 0, 2, 0);
|
|
|
+ } catch (InvalidFormatException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ wb.close();
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取excel文件
|
|
|
+ * @param wb
|
|
|
+ * @param sheetIndex sheet页下标:从0开始
|
|
|
+ * @param startReadLine 开始读取的行:从0开始
|
|
|
+ * @param tailLine 去除最后读取的行
|
|
|
+ */
|
|
|
+ private ArrayList<Map<String, String>> readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
|
|
|
+ Sheet sheet = wb.getSheetAt(sheetIndex);
|
|
|
+ Row row = null;
|
|
|
+ ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
|
|
|
+ for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {
|
|
|
+ row = sheet.getRow(i);
|
|
|
+ Map<String, String> map = new HashMap<String, String>();
|
|
|
+ for (Cell c : row) {
|
|
|
+ String returnStr = "";
|
|
|
+ boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
|
|
|
+ //判断是否具有合并单元格
|
|
|
+ if (isMerge) {
|
|
|
+ String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
|
|
|
+ returnStr = rs;
|
|
|
+ } else {
|
|
|
+ c.setCellType(CellType.STRING);
|
|
|
+ returnStr = c.getRichStringCellValue().getString();
|
|
|
+ }
|
|
|
+ if (c.getColumnIndex() == 1) {
|
|
|
+ map.put("表名", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 2) {
|
|
|
+ map.put("字段名", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 3) {
|
|
|
+ map.put("数据类型", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 5) {
|
|
|
+ map.put("允许偏差范围", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 6) {
|
|
|
+ map.put("计算公式、方法或数值", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 7) {
|
|
|
+ map.put("表类型", returnStr);
|
|
|
+ } else if (c.getColumnIndex() == 9) {
|
|
|
+ map.put("备注", returnStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result.add(map);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取合并单元格的值
|
|
|
+ *
|
|
|
+ * @param sheet
|
|
|
+ * @param row
|
|
|
+ * @param column
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getMergedRegionValue(Sheet sheet, int row, int column) {
|
|
|
+ int sheetMergeCount = sheet.getNumMergedRegions();
|
|
|
+ for (int i = 0; i < sheetMergeCount; i++) {
|
|
|
+ CellRangeAddress ca = sheet.getMergedRegion(i);
|
|
|
+ int firstColumn = ca.getFirstColumn();
|
|
|
+ int lastColumn = ca.getLastColumn();
|
|
|
+ int firstRow = ca.getFirstRow();
|
|
|
+ int lastRow = ca.getLastRow();
|
|
|
+ if (row >= firstRow && row <= lastRow) {
|
|
|
+ if (column >= firstColumn && column <= lastColumn) {
|
|
|
+ Row fRow = sheet.getRow(firstRow);
|
|
|
+ Cell fCell = fRow.getCell(firstColumn);
|
|
|
+ return getCellValue(fCell);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断合并行
|
|
|
+ * @param sheet
|
|
|
+ * @param row
|
|
|
+ * @param column
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isMergedRow(Sheet sheet, int row, int column) {
|
|
|
+ int sheetMergeCount = sheet.getNumMergedRegions();
|
|
|
+ for (int i = 0; i < sheetMergeCount; i++) {
|
|
|
+ CellRangeAddress range = sheet.getMergedRegion(i);
|
|
|
+ int firstColumn = range.getFirstColumn();
|
|
|
+ int lastColumn = range.getLastColumn();
|
|
|
+ int firstRow = range.getFirstRow();
|
|
|
+ int lastRow = range.getLastRow();
|
|
|
+ if (row == firstRow && row == lastRow) {
|
|
|
+ if (column >= firstColumn && column <= lastColumn) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断指定的单元格是否是合并单元格
|
|
|
+ * @param sheet
|
|
|
+ * @param row 行下标
|
|
|
+ * @param column 列下标
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isMergedRegion(Sheet sheet, int row, int column) {
|
|
|
+ int sheetMergeCount = sheet.getNumMergedRegions();
|
|
|
+ for (int i = 0; i < sheetMergeCount; i++) {
|
|
|
+ CellRangeAddress range = sheet.getMergedRegion(i);
|
|
|
+ int firstColumn = range.getFirstColumn();
|
|
|
+ int lastColumn = range.getLastColumn();
|
|
|
+ int firstRow = range.getFirstRow();
|
|
|
+ int lastRow = range.getLastRow();
|
|
|
+ if (row >= firstRow && row <= lastRow) {
|
|
|
+ if (column >= firstColumn && column <= lastColumn) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断sheet页中是否含有合并单元格
|
|
|
+ * @param sheet
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean hasMerged(Sheet sheet) {
|
|
|
+ return sheet.getNumMergedRegions() > 0 ? true : false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合并单元格
|
|
|
+ * @param sheet
|
|
|
+ * @param firstRow 开始行
|
|
|
+ * @param lastRow 结束行
|
|
|
+ * @param firstCol 开始列
|
|
|
+ * @param lastCol 结束列
|
|
|
+ */
|
|
|
+ private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取单元格的值
|
|
|
+ * @param cell
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getCellValue(Cell cell) {
|
|
|
+
|
|
|
+ if (cell == null) return "";
|
|
|
+
|
|
|
+ if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
|
|
|
+
|
|
|
+ return cell.getStringCellValue();
|
|
|
+
|
|
|
+ } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
|
|
|
+
|
|
|
+ return String.valueOf(cell.getBooleanCellValue());
|
|
|
+
|
|
|
+ } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
|
|
|
+
|
|
|
+ return cell.getCellFormula();
|
|
|
+
|
|
|
+ } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
|
|
|
+
|
|
|
+ return String.valueOf(cell.getNumericCellValue());
|
|
|
+
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从excel读取内容
|
|
|
+ */
|
|
|
+ private static void readContent(String fileName) {
|
|
|
+ boolean isE2007 = false; //判断是否是excel2007格式
|
|
|
+ if (fileName.endsWith("xlsx"))
|
|
|
+ isE2007 = true;
|
|
|
+ try {
|
|
|
+ InputStream input = new FileInputStream(fileName); //建立输入流
|
|
|
+ Workbook wb = null;
|
|
|
+ //根据文件格式(2003或者2007)来初始化
|
|
|
+ if (isE2007) {
|
|
|
+ wb = new XSSFWorkbook(input);
|
|
|
+ } else {
|
|
|
+ wb = new HSSFWorkbook(input);
|
|
|
+ }
|
|
|
+ Sheet sheet = wb.getSheetAt(0); //获得第一个表单
|
|
|
+ Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
|
|
|
+ while (rows.hasNext()) {
|
|
|
+ Row row = rows.next(); //获得行数据
|
|
|
+ System.out.println("Row #" + row.getRowNum()); //获得行号从0开始
|
|
|
+ Iterator<Cell> cells = row.cellIterator(); //获得第一行的迭代器
|
|
|
+ while (cells.hasNext()) {
|
|
|
+ Cell cell = cells.next();
|
|
|
+ System.out.println("Cell #" + cell.getColumnIndex());
|
|
|
+ switch (cell.getCellType()) { //根据cell中的类型来输出数据
|
|
|
+ case HSSFCell.CELL_TYPE_NUMERIC:
|
|
|
+ System.out.println(cell.getNumericCellValue());
|
|
|
+ break;
|
|
|
+ case HSSFCell.CELL_TYPE_STRING:
|
|
|
+ System.out.println(cell.getStringCellValue());
|
|
|
+ break;
|
|
|
+ case HSSFCell.CELL_TYPE_BOOLEAN:
|
|
|
+ System.out.println(cell.getBooleanCellValue());
|
|
|
+ break;
|
|
|
+ case HSSFCell.CELL_TYPE_FORMULA:
|
|
|
+ System.out.println(cell.getCellFormula());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ System.out.println("unsuported sell type=======" + cell.getCellType());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException ex) {
|
|
|
+ ex.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取path路径
|
|
|
+ * @param file
|
|
|
+ * @return
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ public static File convert(MultipartFile file) throws IOException {
|
|
|
+ File convFile = new File(Objects.requireNonNull(Objects.requireNonNull(file.getOriginalFilename())));
|
|
|
+ FileOutputStream fos = null;
|
|
|
+ try {
|
|
|
+ convFile.createNewFile();
|
|
|
+ fos = new FileOutputStream(convFile);
|
|
|
+ fos.write(file.getBytes());
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ fos.close();
|
|
|
+ }
|
|
|
+ return convFile;
|
|
|
+ }
|
|
|
+}
|