Этот учебник объясняет, как использовать Magicodes.IE.Excel для выполнения импорта данных с нескольких листов в одном формате.
Основной код представлен ниже:
DTO для студентов
/// <summary>
/// DTO для импорта данных студентов
/// IsLabelingError: Отметка ошибок данных
/// </summary>
[ExcelImporter(IsLabelingError = true)]
public class ImportStudentDto
{
/// <summary>
/// Номер записи
/// </summary>
[ImporterHeader(Name = "Номер записи")]
public long SerialNumber { get; set; }
/// <summary>
/// Школьный номер студента
/// </summary>
[ImporterHeader(Name = "Школьный номер", IsAllowRepeat = false)]
[MaxLength(30, ErrorMessage = "Длина школьного номера превышает максимальное ограничение, пожалуйста, исправьте!")]
public string StudentCode { get; set; }
/// <summary>
/// Имя студента
/// </summary>
[ImporterHeader(Name = "Имя")]
[Required(ErrorMessage = "Имя студента обязательно для заполнения")]
[MaxLength(50, ErrorMessage = "Длина имени превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Name { get; set; }
/// <summary>
/// Номер удостоверения личности
/// </summary>
[ImporterHeader(Name = "Номер удостоверения личности", IsAllowRepeat = false)]
[Required(ErrorMessage = "Номер удостоверения личности обязателен")]
[MaxLength(18, ErrorMessage = "Длина номера удостоверения личности превышает максимальное ограничение, пожалуйста, исправьте!")]
public string IdCard { get; set; }
/// <summary>
/// Пол
/// </summary>
[ImporterHeader(Name = "Пол")]
[Required(ErrorMessage = "Пол обязателен")]
[ValueMapping("Мужской", 0)]
[ValueMapping("Женский", 1)]
public Genders Gender { get; set; }
/// <summary>
/// Адрес проживания
/// </summary>
[ImporterHeader(Name = "Адрес проживания")]
[Required(ErrorMessage = "Адрес проживания обязателен")]
[MaxLength(200, ErrorMessage = "Длина адреса проживания превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Address { get; set; }
/// <summary>
/// Имя родителя
/// </summary>
[ImporterHeader(Name = "Имя родителя")]
[Required(ErrorMessage = "Имя родителя обязательно для заполнения")]
[MaxLength(50, ErrorMessage = "Длина имени родителя превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Guardian { get; set; }
/// <summary>
/// Контактный телефон родителя
/// </summary>
[ImporterHeader(Name = "Контактный телефон родителя")]
[MaxLength(20, ErrorMessage = "Длина контактного телефона родителя превышает максимальное ограничение, пожалуйста, исправьте!")]
public string GuardianPhone { get; set; }
/// <summary>
/// Школьный номер
/// </summary>
[ImporterHeader(Name = "Школьный номер")]
[MaxLength(30, ErrorMessage = "Длина школьного номера превышает максимальное ограничение, пожалуйста, исправьте!")]
public string StudentNub { get; set; }
/// <summary>
/// Номер общежития
/// </summary>
[ImporterHeader(Name = "Номер общежития")]
[MaxLength(20, ErrorMessage = "Длина номера общежития превышает максимальное ограничение, пожалуйста, исправьте!")]
public string DormitoryNo { get; set; }
/// <summary>
/// Номер QQ
/// </summary>
[ImporterHeader(Name = "Номер QQ")]
[MaxLength(30, ErrorMessage = "Длина номера QQ превышает максимальное ограничение, пожалуйста, исправьте!")]
public string QQ { get; set; }
/// <summary>
/// Нация
/// </summary>
[ImporterHeader(Name = "Нация")]
[MaxLength(2, ErrorMessage = "Длина названия нации превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Nation { get; set; }
/// <summary>
/// Характер регистрации
/// </summary>
[ImporterHeader(Name = "Характер регистрации")]
[MaxLength(10, ErrorMessage = "Длина характера регистрации превышает максимальное ограничение, пожалуйста, исправьте!")]
public string HouseholdType { get; set; }
/// <summary>
/// Контактный телефон студента
/// </summary>
[ImporterHeader(Name = "Контактный телефон студента")]
[MaxLength(20, ErrorMessage = "Длина контактного телефона студента превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Phone { get; set; }
/// <summary>
/// Статус
/// </summary>
[ImporterHeader(Name = "Статус")]
public StudentStatus? Status { get; set; }
/// <summary>
/// Примечание
/// </summary>
[ImporterHeader(Name = "Примечание")]
[MaxLength(200, ErrorMessage = "Длина примечания превышает максимальное ограничение, пожалуйста, исправьте!")]
public string Remark { get; set; }
/// <summary>
/// Живет ли в общежитии
/// </summary>
[ImporterHeader(IsIgnore = true)]
public bool? IsBoarding { get; set; }
/// <summary>
/// ID класса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid ClassId { get; set; }
/// <summary>
/// ID школы
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? SchoolId { get; set; }
/// <summary>
/// ID кампуса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? CampusId { get; set; }
/// <summary>
/// ID специальности
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? MajorsId { get; set; }
/// <summary>
/// ID года обучения
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? GradeId { get; set; }
}
Основной код представлен ниже:
DTO для студентов
public class ImportClassStudentDto
{
[ExcelImporter(SheetName = "Данные для импорта 1 класса")]
public ImportStudentDto Class1Students { get; set; }
[ExcelImporter(SheetName = "Данные для импорта 2 класса")]
public ImportStudentDto Class2Students { get; set; }
}
Как показано выше, мы определяем DTO для данных студентов каждого класса. Основные соображения следующие:
Замечание: Имена столбцов в Excel для нескольких листов должны быть согласованы (соответствовать типу DTO для конкретного листа).
Шаблон находится здесь: src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/класс_студентов_базовый_импорт.xlsxПервый лист:
Второй лист:
IExcelImporter Importer = new ExcelImporter();
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "класс_студентов_базовый_импорт.xlsx");
// Результат импорта получен в виде словаря, ключ - имя листа, значение - данные листа
Dictionary<string, ImportStudentDto> importDic = await Importer.ImportSameSheets<ImportClassStudentDto, ImportStudentDto>(filePath);
// Проходимся по словарю, получаем данные каждого листа.
foreach (KeyValuePair<string, ImportStudentDto> item in importDic)
{
ImportStudentDto import = item.Value;
// Импортированные данные листа
List<StudentDto> studentList = import.Data.ToList();
}
Основной код представлен ниже:
DTO для студентов аналогично вышеуказанному
DTO для журнала платежей:
/// <summary>
/// DTO для импорта журнала платежей
/// </summary>
[ExcelImporter(IsLabelingError = true)]
public class ImportPaymentLogDto
{
/// <summary>
/// Имя студента
/// </summary>
[ImporterHeader(Name = "Имя студента")]
[Required(ErrorMessage = "Имя студента обязательно для заполнения")]
[MaxLength(30, ErrorMessage = "Имя студента не должно превышать OnClickListener 30 символов")]
public string Name { get; set; }
/// <summary>
/// Номер удостоверения личности
/// </summary>
[ImporterHeader(Name = "Номер удостоверения личности")]
[Required(ErrorMessage = "Номер удостоверения личности обязателен")]
[MaxLength(18, ErrorMessage = "Номер удостоверения личности не должен превышать 18 символов")]
[MinLength(18, ErrorMessage = "Номер удостоверения личности не может быть меньше 18 символов")]
public string IdCard { get; set; }
/// <summary>
/// Тип платежа
/// </summary>
[ImporterHeader(Name = "Тип платежа")]
[Required(ErrorMessage = "Тип платежа обязателен")]
public string CostType { get; set; }
/// <summary>
/// Сумма платежа
/// </summary>
[ImporterHeader(Name = "Сумма")]
[Range(0.01m, 1000000m, ErrorMessage = "Объем платежа должен находиться в диапазоне от 1 до 1 млн")]
[Required(ErrorMessage = "Сумма обязательна")]
public decimal Amount { get; set; }
/// <summary>
/// Дата платежа
/// </summary>
[ImporterHeader(Name = "Дата платежа")]
[MaxLength(8, ErrorMessage = "Дата платежа не должна превышать 8 символов")]
[RegularExpression(@"^\d{6,8}$", ErrorMessage = "Дата платежа должна содержать 6-8 цифр, например, 201908/20190815")]
public string PayDate { get; set; }
/// <summary>
/// Номер чека
/// Для нескольких значений используйте запятую как разделитель, применимо только к офлайн чекам
/// </summary>
[ImporterHeader(Name = "Номер чека")]
[MaxLength(200, ErrorMessage = "Номер чека не может превышать 200 символов")]
public string ReceiptCodes { get; set; }
/// <summary>
/// Примечание
/// </summary>
[ImporterHeader(Name = "Примечание")]
[MaxLength(500, ErrorMessage = "Примечание не может превышать 500 символов")]
public string Remarks { get; set; }
/// <summary>
/// Время создания
/// </summary>
[ImporterHeader(IsIgnore = true)]
public DateTime? CreationTime { get; set; }
/// <summary>
/// ID услуги
/// </summary>
[ImporterHeader(IsIgnore = true)]
public int? ChargeProjectId { get; set; }
/// <summary>
/// ID класса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? ClassId { get; set; }
/// <summary>
/// Название класса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public string ClassName { get; set; }
/// <summary>
/// ID года обучения
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? GradeId { get; set; }
/// <summary>
/// Информация о годе обучения
/// </summary>
[ImporterHeader(IsIgnore = true)]
public string GradeName { get; set; }
/// <summary>
/// ID специальности
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? MajorId { get; set; }
/// <summary>
/// Информация о специальности
/// </summary>
[ImporterHeader(IsIgnore = true)]
public string MajorName { get; set; }
/// <summary>
/// ID кампуса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? CampusId { get; set; }
/// <summary>
/// Название кампуса
/// </summary>
[ImporterHeader(IsIgnore = true)]
public string CampusName { get; set; }
/// <summary>
/// ID школы
/// </summary>
[ImporterHeader(IsIgnore = true)]
public Guid? SchoolId { get; set; }
/// <summary>
/// Информация о школе
/// </summary>
[ImporterHeader(IsIgnore = true)]
public string SchoolName { get; set; }
}
Основной код представлен ниже:
DTO для базовых данных студентов и потока платежей
public class ImportStudentAndPaymentLogDto
{
[ExcelImporter(SheetName = "Данные для импорта 1 класса")]
public ImportStudentDto Class1Students { get; set; }
[ExcelImporter(SheetName = "Данные о платежах")]
public ImportPaymentLogDto Class2Students { get; set; }
}
Шаблон находится здесь: src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/Студенты_базовые_данные_и_поток_платежей_импорт.xlsx
Лист с базовыми данными студента:
Лист с данными о платежах:
IExcelImporter Importer = new ExcelImporter();
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "Студенты_базовые_данные_и_поток_платежей_импорт.xlsx");
// Полученный результат импорта представляет собой словарь, где ключ - это имя листа, а значение - данные этого листа
Dictionary<string, List<object>> importDic = await Importer.ImportMultipleSheet<ImportStudentAndPaymentLogDto>(filePath);
// Проходимся по словарю и получаем данные каждого листа
foreach (KeyValuePair<string, List<object>> item in importDic)
{
List<object> import = item.Value;
// Данные импортированного листа,
if (item.Key == "Данные для импорта 1 класса")
{
// Для разных типов листов значения представляются объектами, поэтому требуется преобразование типа
ImportStudentDto dto = (ImportStudentDto)import[0];
}
if (item.Key == "Данные о платежах")
{
ImportPaymentLogDto dto = (ImportPaymentLogDto)import[0];
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )