在C#项目开发中,Excel数据导入是一个常见需求,尤其在企业应用、教育管理系统等场景中。传统的Excel导入方案往往代码繁琐、错误处理复杂,本文将通过详细案例,教你如何使用Magicodes.IE这款强大的开源库,实现高效、优雅的Excel导入功能。
Magicodes.IE是一个.NET平台下功能强大的导入导出通用库,支持Excel、Word、PDF、HTML等多种格式,尤其擅长处理Excel数据的导入导出。它具有以下优势:
在开始前,我们需要通过NuGet安装Magicodes.IE.Excel包:
C#// 通过NuGet包管理器控制台安装
Install-Package Magicodes.IE.Excel
// 或者使用dotnet CLI
dotnet add package Magicodes.IE.Excel
Magicodes.IE最强大的功能之一是自动生成Excel导入模板。不需要手动创建Excel模板,而是根据定义好的Dto自动生成,大大提高了开发效率。
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Excel;
namespace AppMagicodesIE
{
public class ImportStudentDto
{
[Display(Name = "序号")]
public int SequenceNumber { get; set; }
[Display(Name = "学籍号")]
[Required(ErrorMessage = "学籍号不能为空")]
public string StudentNub { get; set; }
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名不能为空")]
public string Name { get; set; }
[Display(Name = "身份证号")]
public string IdNumber { get; set; }
[Display(Name = "性别")]
public string Gender { get; set; }
[Display(Name = "家庭住址")]
public string Address { get; set; }
[Display(Name = "状态")]
public string Status { get; set; }
[Display(Name = "备注")]
public string Remarks { get; set; }
}
}
C#using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Excel;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Magicodes.ExporterAndImporter.Core.Filters;
using Magicodes.ExporterAndImporter.Core.Models;
using System.Dynamic;
using System.Reflection;
using System.IO;
namespace AppMagicodesIE
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Magicodes.IE Excel导入演示程序");
Console.WriteLine("===============================");
// 创建导入器实例
IImporter importer = new ExcelImporter();
try
{
// 生成导入模板
await GenerateStudentImportTemplate(importer);
// 演示导入操作 (如果有测试文件)
string importFilePath = Path.Combine(Directory.GetCurrentDirectory(), "学生数据导入模板.xlsx");
if (File.Exists(importFilePath))
{
Console.WriteLine("\n请先填写模板数据,然后按任意键继续导入...");
Console.ReadKey();
await ImportStudentData(importer, importFilePath);
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
Console.WriteLine("\n程序执行完毕,按任意键退出...");
Console.ReadKey();
}
/// <summary>
/// 生成Excel导入模板
/// </summary>
public static async Task GenerateStudentImportTemplate(IImporter importer)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "学生数据导入模板.xlsx");
if (File.Exists(filePath)) File.Delete(filePath);
Console.WriteLine($"正在生成Excel导入模板...");
var result = await importer.GenerateTemplate<ImportStudentDto>(filePath);
if (result != null && File.Exists(filePath))
{
Console.WriteLine($"模板生成成功,路径:{filePath}");
// 获取文件大小信息
var fileInfo = new FileInfo(filePath);
Console.WriteLine($"文件大小: {fileInfo.Length / 1024.0:F2} KB");
// 替换为:
Console.WriteLine("模板已生成,请查看文件了解详情");
}
else
{
Console.WriteLine("模板生成失败!");
}
}
/// <summary>
/// 导入学生数据
/// </summary>
public static async Task ImportStudentData(IImporter importer, string filePath)
{
Console.WriteLine($"开始导入学生数据,文件路径: {filePath}");
var importResult = await importer.Import<ImportStudentDto>(filePath);
if (importResult == null)
{
Console.WriteLine("导入失败,未能获取导入结果");
return;
}
// 检查是否有异常
if (importResult.Exception != null)
{
Console.WriteLine($"导入过程发生异常: {importResult.Exception.Message}");
return;
}
// 检查是否有模板错误
if (importResult.TemplateErrors?.Count > 0)
{
Console.WriteLine("导入模板存在以下错误:");
foreach (var error in importResult.TemplateErrors)
{
Console.WriteLine($"- [{error.ErrorLevel}] {error.Message}");
}
}
// 检查数据行错误
if (importResult.RowErrors.Count > 0)
{
Console.WriteLine("\n导入数据存在以下错误:");
foreach (var rowError in importResult.RowErrors)
{
Console.WriteLine($"第{rowError.RowIndex}行出现错误:");
foreach (var fieldError in rowError.FieldErrors)
{
Console.WriteLine($" - 字段 \"{fieldError.Key}\": {fieldError.Value}");
}
}
// 检查错误标注文件是否生成
string errorFilePath = filePath + "_.xlsx";
if (File.Exists(errorFilePath))
{
Console.WriteLine($"\n已生成错误标注文件: {errorFilePath}");
}
}
// 如果没有错误,显示导入的数据
if (!importResult.HasError)
{
Console.WriteLine($"\n成功导入 {importResult.Data.Count} 条学生数据:");
int index = 0;
foreach (var student in importResult.Data)
{
if (index < 5) // 只显示前5条,避免输出过多
{
Console.WriteLine($"- 学生: {student.Name}, 学号: {student.StudentNub}, 性别: {student.Gender}");
}
index++;
}
if (importResult.Data.Count > 5)
{
Console.WriteLine($"... 共 {importResult.Data.Count} 条记录");
}
}
}
}
}
生成的模板中,枚举字段会自动生成下拉选择,必填项的列头会标红,大大提升了用户体验。
Magicodes.IE是一个功能强大且易用的Excel导入导出库,特别适合用于处理复杂的数据验证和导入需求。通过本文的学生数据导入案例,我们展示了如何利用Magicodes.IE实现高效、稳定的Excel数据导入功能。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!