|
@@ -0,0 +1,303 @@
|
|
|
|
+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.nio.file.Files;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.Iterator;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+public class WbsExcelUtil {
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ WbsExcelUtil excelUtil = new WbsExcelUtil();
|
|
|
|
+ //读取excel数据
|
|
|
|
+ ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("D:\\Download\\WBS划分模板1.xls");
|
|
|
|
+ for (Map<String, String> map : result) {
|
|
|
|
+ System.out.println("输出:" + map);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 读取excel数据
|
|
|
|
+ *
|
|
|
|
+ * @param path
|
|
|
|
+ */
|
|
|
|
+ public ArrayList<Map<String, String>> readExcelToObj(String path) {
|
|
|
|
+
|
|
|
|
+ Workbook wb = null;
|
|
|
|
+ ArrayList<Map<String, String>> result = null;
|
|
|
|
+ try {
|
|
|
|
+ wb = WorkbookFactory.create(new File(path));
|
|
|
|
+ result = readExcel(wb, 0, 1, 0);
|
|
|
|
+ } catch (InvalidFormatException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ 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());
|
|
|
|
+// System.out.print(rs + "------ ");
|
|
|
|
+ returnStr = rs;
|
|
|
|
+ } else {
|
|
|
|
+// System.out.print(c.getRichStringCellValue()+"++++ ");
|
|
|
|
+ returnStr = c.getRichStringCellValue().getString();
|
|
|
|
+ }
|
|
|
|
+ if (c.getColumnIndex() == 0) {
|
|
|
|
+ map.put("1", returnStr);
|
|
|
|
+ } else if (c.getColumnIndex() == 1) {
|
|
|
|
+ map.put("2", returnStr);
|
|
|
|
+ } else if (c.getColumnIndex() == 2) {
|
|
|
|
+ map.put("3", returnStr);
|
|
|
|
+ } else if (c.getColumnIndex() == 3) {
|
|
|
|
+ map.put("4", returnStr);
|
|
|
|
+ } else if (c.getColumnIndex() == 4) {
|
|
|
|
+ map.put("5", returnStr);
|
|
|
|
+ } else if (c.getColumnIndex() == 5) {
|
|
|
|
+ map.put("6", returnStr);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ result.add(map);
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取合并单元格的值
|
|
|
|
+ *
|
|
|
|
+ * @param sheet
|
|
|
|
+ * @param row
|
|
|
|
+ * @param column
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public 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
|
|
|
|
+ */
|
|
|
|
+ public 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读取内容
|
|
|
|
+ */
|
|
|
|
+ public 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(file.getOriginalFilename());
|
|
|
|
+ convFile.createNewFile();
|
|
|
|
+ try (InputStream is = file.getInputStream()) {
|
|
|
|
+ Files.copy(is, convFile.toPath());
|
|
|
|
+ }
|
|
|
|
+ return convFile;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取path路径
|
|
|
|
+ *
|
|
|
|
+ * @param file
|
|
|
|
+ * @return
|
|
|
|
+ * @throws IOException
|
|
|
|
+ */
|
|
|
|
+ public static File convert1(MultipartFile file) throws IOException {
|
|
|
|
+ File convFile = new File(file.getOriginalFilename());
|
|
|
|
+ convFile.createNewFile();
|
|
|
|
+ FileOutputStream fos = new FileOutputStream(convFile);
|
|
|
|
+ fos.write(file.getBytes());
|
|
|
|
+ fos.close();
|
|
|
|
+ return convFile;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|