/
valzem
/
MatControl
Обзор
Документация
Войти
/
valzem
/
MatControl
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/MatControl.Data/Import/PhonebookParser.cs
124 строки
3 KB
MatControl Dev
Сортировка и поиск в списках, статусы в Движении, импорт с выбором файла, поле Отдел, скиллы
07 авг 2026, 16:45
07 авг 2026, 16:45
4bdbbb6
Код
Авторство
О чём код?
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; namespace MatControl.Data.Import; public static class PhonebookParser { public static List<ParsedEmployee> Parse(string filePath) { var employees = new List<ParsedEmployee>(); using var document = WordprocessingDocument.Open(filePath, false); var body = document.MainDocumentPart?.Document.Body; if (body is null) { return employees; } foreach (var table in body.Descendants<Table>()) { var currentDepartment = string.Empty; foreach (var row in table.Elements<TableRow>()) { var cells = row.Elements<TableCell>() .Select(GetCellText) .ToArray(); if (cells.Length == 1) { var section = cells[0]?.Trim() ?? string.Empty; if (!string.IsNullOrEmpty(section)) { currentDepartment = section; } continue; } var employee = ParseRow(cells); if (employee is not null) { employee.Department = currentDepartment; employees.Add(employee); } } } return employees; } public static ParsedEmployee? ParseRow(string[] cells) { if (cells.Length < 2) { return null; } var position = cells[0]?.Trim() ?? string.Empty; var name = cells[1]?.Trim() ?? string.Empty; if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(name)) { return null; } var parts = SplitFullName(name); if (parts.Count < 2) { return null; } return new ParsedEmployee { FullName = string.Join(" ", parts), Position = position, Room = cells.Length > 2 ? (cells[2]?.Trim() ?? string.Empty) : string.Empty, Phone = cells.Length > 3 ? (cells[3]?.Trim() ?? string.Empty) : string.Empty }; } private static List<string> SplitFullName(string name) { var result = new List<string>(); foreach (var token in name.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { SplitByUpperCase(token, result); } return result.Where(IsNamePart).ToList(); } private static void SplitByUpperCase(string token, List<string> result) { var buffer = new System.Text.StringBuilder(); for (var i = 0; i < token.Length; i++) { if (i > 0 && char.IsUpper(token[i]) && !char.IsUpper(token[i - 1])) { result.Add(buffer.ToString()); buffer.Clear(); } buffer.Append(token[i]); } if (buffer.Length > 0) { result.Add(buffer.ToString()); } } private static bool IsNamePart(string part) { if (string.IsNullOrEmpty(part) || part.Length < 2) { return false; } return char.IsUpper(part[0]) && part.Skip(1).All(char.IsLower); } private static string GetCellText(TableCell cell) { return string.Concat(cell.Descendants<Text>().Select(t => t.Text)).Trim(); } }