using Infrastructure.Abstructions; using Infrastructure.Word; using NPOI.XWPF.UserModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BackGround.Hangfire.Jobs.UMEs { public class UMETableResolver : IWordTableResolver, ITransientDependency { private List fmkeys = new List { "姓名", "性别", "出生年月", "站内职务", "兼任职务", "联系电话" }; public Dictionary Resolve(XWPFTable table) { var result = new Dictionary { { "队员情况", new List>() }, { "消防装备器材配备", new List>() } }; var currentTableName = string.Empty; var fireMenInfoRows = new List(); var equipmentInfoRows = new List(); var otherEquipmentRows = new List(); bool isHeaderRow = false; bool isUnderOtherEqRow = false; foreach(var row in table.Rows) { var cells = row.GetTableCells(); var tableName = GetStringContentOfCell(cells[0]); if (!string.IsNullOrEmpty(tableName)) { isHeaderRow = true; currentTableName = tableName; } else { isHeaderRow = false; } if(currentTableName.Trim()== "队员情况") { if (!isHeaderRow) { fireMenInfoRows.Add(row); } } else if(currentTableName == "消防装备器材配备") { var cell1Value = GetStringContentOfCell(cells[1]); if(cell1Value.Trim()== "其他消防装备、器材") { isUnderOtherEqRow = true; continue; } if (isUnderOtherEqRow) { otherEquipmentRows.Add(row); } else { equipmentInfoRows.Add(row); } } } ((List>)result["队员情况"]).AddRange(GetFireMenInfos(fireMenInfoRows)); ((List>)result["消防装备器材配备"]).Add(GetEuipmentMenInfos(equipmentInfoRows)); ((List>)result["消防装备器材配备"]).Add(GetOtherEuipmentMenInfos(otherEquipmentRows)); return result; } private string GetStringContentOfCell(XWPFTableCell cell) { var names = cell.Paragraphs.Select(p => p.ParagraphText); return string.Join(null, names); } private List> GetFireMenInfos(List rows) { var result = new List>(); rows.ForEach(row => { var cells = row.GetTableCells(); var infoOfMenDict = new Dictionary(); for (var i = 1; i < cells.Count; i++) { var cellcontenText = GetStringContentOfCell(cells[i]); infoOfMenDict.Add(fmkeys[i - 1], cellcontenText); } result.Add(infoOfMenDict); }); return result; } private Dictionary GetEuipmentMenInfos(List rows) { var result = new Dictionary(); for(var i=0; i < rows.Count;) { var keyCells = rows[i].GetTableCells(); var valveCells= rows[i+1].GetTableCells(); for (var j=1; j < keyCells.Count; j++) { var key = keyCells[j].Paragraphs[0].ParagraphText; var value = GetStringContentOfCell(valveCells[j]); if (!result.ContainsKey(key)) result.Add(key, value); } i = i + 2; } return result; } private Dictionary GetOtherEuipmentMenInfos(List rows) { var result = new Dictionary(); for (var i = 0; i < rows.Count;) { var keyCells = rows[i].GetTableCells(); var valveCells = rows[i + 1].GetTableCells(); for (var j = 2; j < keyCells.Count; j++) { var key = GetStringContentOfCell(keyCells[j]); var value = GetStringContentOfCell(valveCells[j]); if (!result.ContainsKey(key)) result.Add(key, value); } i = i + 2; } return result; } } }