1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/magicodes-Magicodes.IE

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
6.Import Multi-Sheet Tutorial.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 03.03.2025 03:18 5e09f6d

Учебник по импорту нескольких листов данных

Описание

Этот учебник объясняет, как использовать Magicodes.IE.Excel для выполнения импорта данных с нескольких листов в одном формате.

Основные моменты

  • Импорт данных с нескольких листов в одинаковом формате
  • Импорт данных с нескольких листов в различных форматах

Основные шаги

1. Импорт данных с нескольких листов в одинаковом формате

1.1 Создание Dto для импорта листов

Основной код представлен ниже:

  • 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; }
      }

1.2 Создание Import Excel Dto

Основной код представлен ниже:

  • DTO для студентов

      public class ImportClassStudentDto
      {
    
          [ExcelImporter(SheetName = "Данные для импорта 1 класса")]
          public ImportStudentDto Class1Students { get; set; }
    
          [ExcelImporter(SheetName = "Данные для импорта 2 класса")]
          public ImportStudentDto Class2Students { get; set; }
    
      }

Как показано выше, мы определяем DTO для данных студентов каждого класса. Основные соображения следующие:

  1. В DTO для Excel не требуется добавление дополнительных атрибутов сверху.
  2. Свойства внутри DTO для Excel должны быть типа DTO для конкретного листа, а атрибут ExcelImporter используется для установки имени листа через параметр SheetName.

1.3 Шаблоны Excel

Замечание: Имена столбцов в Excel для нескольких листов должны быть согласованы (соответствовать типу DTO для конкретного листа).

Шаблон находится здесь: src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/класс_студентов_базовый_импорт.xlsxПервый лист: Класс студентов базовый импорт

Второй лист: Класс студентов базовый импорт

1.4 Код импорта

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();
}

2. Импорт данных с нескольких листов в различных форматах

2.1 Создание Dto для импорта листов

Основной код представлен ниже:

  • 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; }

    }

2.2 Создайте импорт Excel в DTO

Основной код представлен ниже:

  • DTO для базовых данных студентов и потока платежей

      public class ImportStudentAndPaymentLogDto
      {
          [ExcelImporter(SheetName = "Данные для импорта 1 класса")]
          public ImportStudentDto Class1Students { get; set; }
    
          [ExcelImporter(SheetName = "Данные о платежах")]
          public ImportPaymentLogDto Class2Students { get; set; }
      }

2.3 Шаблоны Excel

Шаблон находится здесь: src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/Студенты_базовые_данные_и_поток_платежей_импорт.xlsx

Лист с базовыми данными студента: Студенты_базовые_данные_и_поток_платежей_импорт

Лист с данными о платежах: Студенты_базовые_данные_и_поток_платежей_импорт

2.4 Код импорта

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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/magicodes-Magicodes.IE.git
git@api.gitlife.ru:oschina-mirror/magicodes-Magicodes.IE.git
oschina-mirror
magicodes-Magicodes.IE
magicodes-Magicodes.IE
master