消防站文档解析
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
5.0 KiB

2 years ago
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<string> fmkeys = new List<string> { "姓名", "性别", "出生年月", "站内职务", "兼任职务", "联系电话" };
public Dictionary<string, object> Resolve(XWPFTable table)
{
var result = new Dictionary<string, object> { { "队员情况", new List<Dictionary<string, object>>() }, { "消防装备器材配备", new List<Dictionary<string, object>>() } };
var currentTableName = string.Empty;
var fireMenInfoRows = new List<XWPFTableRow>();
var equipmentInfoRows = new List<XWPFTableRow>();
var otherEquipmentRows = new List<XWPFTableRow>();
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<Dictionary<string, object>>)result["队员情况"]).AddRange(GetFireMenInfos(fireMenInfoRows));
((List<Dictionary<string, object>>)result["消防装备器材配备"]).Add(GetEuipmentMenInfos(equipmentInfoRows));
((List<Dictionary<string, object>>)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<Dictionary<string, object>> GetFireMenInfos(List<XWPFTableRow> rows)
{
var result = new List<Dictionary<string, object>>();
rows.ForEach(row =>
{
var cells = row.GetTableCells();
var infoOfMenDict = new Dictionary<string, object>();
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<string, object> GetEuipmentMenInfos(List<XWPFTableRow> rows)
{
var result = new Dictionary<string, object>();
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<string, object> GetOtherEuipmentMenInfos(List<XWPFTableRow> rows)
{
var result = new Dictionary<string, object>();
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;
}
}
}