在当今数字化时代,数据的导入与导出已成为企业日常运营中不可或缺的一环,特别是在处理Excel文件时,C#作为一种强大的编程语言,提供了丰富的API和库来简化这一过程,本文将深入探讨C#中如何利用API进行Excel的导入与导出操作,包括使用NPOI和EPPlus等流行库的实战技巧。
C# Excel导入导出的重要性及应用场景
在企业应用开发中,经常会遇到需要将数据从数据库导出到Excel文件,或者将Excel文件中的数据导入到系统的情况,财务部门可能需要将每月的财务报表导出为Excel格式,以便于分析和共享;而人力资源部门则可能需要将员工信息从Excel批量导入到系统中,C#提供了多种方式来实现这些功能,其中使用API结合第三方库如NPOI或EPPlus是较为常见的做法。
NPOI是.NET平台上的一个开源库,用于读取、写入和操作Microsoft Office文档,包括Excel文件(.xls和.xlsx格式),它提供了一组丰富的API,使得开发者可以轻松地在C#中创建、修改和读取Excel文件。
需要在项目中安装NPOI库,可以通过NuGet包管理器来安装:
Install-Package NPOI
以下是一个使用NPOI导出DataTable到Excel文件的示例代码:
using System; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; public class ExcelExporter { public void ExportDataTableToExcel(DataTable dataTable, string filePath) { IWorkbook workbook; // 判断文件类型,选择创建不同的Workbook实例 if (filePath.EndsWith(".xlsx")) { workbook = new XSSFWorkbook(); } else { workbook = new HSSFWorkbook(); } ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建标题行 IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < dataTable.Columns.Count; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(dataTable.Columns[i].Caption); } // 填充数据 for (int i = 0; i < dataTable.Rows.Count; i++) { IRow row = sheet.CreateRow(i + 1); for (int j = 0; j < dataTable.Columns.Count; j++) { ICell cell = row.CreateCell(j); cell.SetCellValue(dataTable.Rows[i][j].ToString()); } } // 写入文件 using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { workbook.Write(fs); } } }
导入Excel文件的过程相对复杂一些,因为需要处理各种数据类型和格式,以下是一个基本的导入示例:
using System; using System.Data; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; public class ExcelImporter { public DataTable ImportExcelToDataTable(string filePath) { DataTable dataTable = new DataTable(); IWorkbook workbook; using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { if (filePath.EndsWith(".xlsx")) { workbook = new XSSFWorkbook(fs); } else { workbook = new HSSFWorkbook(fs); } } ISheet sheet = workbook.GetSheetAt(0); for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++) { IRow row = sheet.GetRow(rowIndex); if (rowIndex == 0) { foreach (ICell cell in row) { dataTable.Columns.Add(cell.StringCellValue); } } else { DataRow dataRow = dataTable.NewRow(); foreach (ICell cell in row) { dataRow[cell.ColumnIndex] = cell.ToString(); } dataTable.Rows.Add(dataRow); } } return dataTable; } }
EPPlus是一个功能强大的.NET库,专门用于创建和操作Excel 2007及以上版本的文件(.xlsx格式),相比NPOI,EPPlus提供了更为简洁和直观的API,尤其适合处理复杂的Excel文件。
通过NuGet安装EPPlus库:
Install-Package EPPlus
以下是一个使用EPPlus导出DataTable到Excel文件的示例:
using System; using System.Data; using OfficeOpenXml; public class ExcelExporterEPPlus { public void ExportDataTableToExcelEPPlus(DataTable dataTable, string filePath) { using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1"); worksheet.Cells["A1"].LoadFromDataTable(dataTable, true); package.SaveAs(new FileInfo(filePath)); } } }
EPPlus同样支持从Excel文件导入数据到DataTable,以下是一个简单的示例:
using System; using System.Collections.Generic; using OfficeOpenXml; using System.Data; public class ExcelImporterEPPlus { public DataTable ImportExcelToDataTableEPPlus(string filePath) { DataTable dataTable = new DataTable(); using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath))) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; bool hasTitleRow = worksheet.Cells[1, 1].Text != string.Empty; // 假设第一行为标题行 int startRow = hasTitleRow ? 2 : 1; for (int col = 1; col <= worksheet.Dimension.End.Column; col++) { dataTable.Columns.Add(hasTitleRow ? worksheet.Cells[1, col].Text : string.Format("Column {0}", col)); } for (int row = startRow; row <= worksheet.Dimension.End.Row; row++) { DataRow dataRow = dataTable.NewRow(); for (int col = 1; col <= worksheet.Dimension.End.Column; col++) { dataRow[col 1] = worksheet.Cells[row, col].Text; } dataTable.Rows.Add(dataRow); } } return dataTable; } }
C API Excel导入导出的优缺点分析
优点:
1、灵活性高:C#结合NPOI或EPPlus可以实现对Excel文件的各种复杂操作,满足不同场景下的需求。
2、无需安装Office:这些库不需要在服务器上安装Microsoft Office,降低了部署成本。
3、丰富的功能:支持设置单元格样式、合并单元格、添加图片等多种高级功能。
4、跨平台性:作为.NET库,可以在Windows、Linux等多平台上运行。
缺点:
1、学习曲线:对于初学者来说,掌握这些库的API可能需要一定的时间和精力。
2、性能问题:在处理大型Excel文件时,可能会出现内存占用过高或性能下降的问题。
3、兼容性问题:虽然NPOI和EPPlus已经做得很好,但仍然可能存在与某些特殊Excel格式或功能的兼容性问题。
4、维护成本:随着Excel版本的更新,可能需要同步更新这些库以确保兼容性。
Q1: NPOI和EPPlus有什么区别?
A1: NPOI是一个更底层的库,支持更老的Excel格式(如.xls),但在处理现代Excel功能(如条件格式、数据验证等)时可能不如EPPlus灵活,EPPlus则专注于.xlsx格式,提供了更现代化的API和更好的性能表现,选择哪个库取决于具体需求和项目要求。
Q2: 如何处理Excel中的合并单元格?
A2: 在NPOI中,可以使用sheet.AddMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol))
来合并单元格,在EPPlus中,则可以使用worksheet.Cells[startCell].Merge()
方法来实现,需要注意的是,合并单元格后,只有左上角的单元格会保留数据,其他单元格将为空,在读取合并单元格时,需要特别处理以确保数据的正确性。