Microsoft.Office.Interop.Excel
命名空间。,2. 创建 Excel 应用程序对象并打开或新建工作簿。,3. 在工作表中写入数据库连接字符串等信息。,4. 保存并关闭工作簿,释放资源。
在C#中操作Excel并添加数据库相关内容,通常涉及到使用一些第三方库,比如NPOI、EPPlus、ClosedXML等,这些库可以帮助开发者在.NET应用程序中读取、写入和修改Excel文件,下面将介绍如何使用C#结合ClosedXML库在Excel中添加数据库相关内容。
需要在项目中安装ClosedXML库,可以通过NuGet包管理器来安装:
Install-Package ClosedXML
假设我们使用SQL Server作为数据库,首先需要连接到数据库并获取数据,这里以System.Data.SqlClient
命名空间中的类为例:
using System; using System.Data.SqlClient; using System.Data; public class DatabaseHelper { private string connectionString = "your_connection_string_here"; public DataTable GetData() { using (SqlConnection connection = new SqlConnection(connectionString)) { string query = "SELECT FROM YourTableName"; SqlCommand command = new SqlCommand(query, connection); SqlDataAdapter adapter = new SqlDataAdapter(command); DataTable dataTable = new DataTable(); adapter.Fill(dataTable); return dataTable; } } }
在上面的代码中,将your_connection_string_here
替换为实际的数据库连接字符串,将YourTableName
替换为实际的表名。
使用ClosedXML库创建Excel文件并将从数据库中获取的数据添加到Excel中:
using ClosedXML.Excel; using System.IO; public class ExcelHelper { public void CreateExcelWithData(DataTable dataTable, string filePath) { using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Sheet1"); // 添加表头 for (int i = 0; i < dataTable.Columns.Count; i++) { worksheet.Cell(1, i + 1).Value = dataTable.Columns[i].ColumnName; } // 添加数据行 for (int i = 0; i < dataTable.Rows.Count; i++) { for (int j = 0; j < dataTable.Columns.Count; j++) { worksheet.Cell(i + 2, j + 1).Value = dataTable.Rows[i][j]; } } // 保存Excel文件 workbook.SaveAs(filePath); } } }
整合上述代码并在主程序中调用:
class Program { static void Main(string[] args) { string filePath = @"C:pathtoyourexcel.xlsx"; var databaseHelper = new DatabaseHelper(); var excelHelper = new ExcelHelper(); var dataTable = databaseHelper.GetData(); excelHelper.CreateExcelWithData(dataTable, filePath); Console.WriteLine("Excel文件已成功创建!"); } }
Q1: 如果数据库中的表有很多列,如何确保Excel文件中的列宽足够显示所有内容?
A1: 可以在创建Excel文件时,遍历每一列并根据内容的长度动态调整列宽,可以在添加数据到Excel后,遍历每一列并设置合适的列宽:
for (int i = 0; i < dataTable.Columns.Count; i++) { worksheet.Column(i + 1).Width = dataTable.Columns[i].ColumnName.Length > 10 ? 20 : 10; // 根据列名长度调整列宽,这里只是一个示例,可以根据实际需求调整逻辑 }
Q2: 如果数据库中的数据量很大,一次性加载到内存中可能会导致性能问题,有什么优化建议?
A2: 如果数据量很大,可以考虑分批处理数据,可以使用SqlDataReader
逐行读取数据并写入Excel,而不是一次性将所有数据加载到DataTable
中,这样可以显著减少内存占用并提高性能。