.NET驾驭Excel之力:自动化数据处理 - 开篇概述与环境准备

前言

在当今信息化时代,数据已经成为企业运营的核心资产。Excel作为最广泛使用的数据处理工具,承载着企业大量的业务数据、财务报表、统计分析等重要信息。然而,手动操作Excel文件不仅效率低下,还容易出错,尤其是在处理大量数据或重复性任务时。

MudTools.OfficeInterop.Excel库应运而生,它是对Microsoft Excel COM组件的.NET封装,旨在简化Excel自动化开发过程,让开发者能够更专注于业务逻辑的实现,而不是底层的技术细节。

1、Excel自动化的重要性与应用场景

1.1 Excel自动化的业务价值

Excel自动化具有巨大的商业价值,主要体现在以下几个方面:

效率提升:自动化处理可以显著提高数据处理速度,减少人工操作时间。在处理大量数据时,自动化的优势尤为明显。

准确性保障:人工操作容易出错,特别是在处理复杂计算或大量数据时。自动化程序可以确保每次处理的准确性。

标准化输出:通过自动化可以确保所有生成的Excel文件都符合统一的格式标准,提高文档的专业性。

可追溯性:自动化过程可以记录操作日志,便于问题排查和审计。

1.2 实际应用场景分析

1.2.1 企业日报系统

在企业日报系统中,自动生成每日销售报表是典型应用场景。想象一下,每天早上9点,系统自动从数据库中提取前一天的销售数据,生成格式统一的Excel报表,并通过邮件发送给相关管理人员。

csharp 复制代码
// 模拟日报系统数据生成
public class DailyReportGenerator
{
    public void GenerateSalesReport()
    {
        // 1. 从数据库获取销售数据
        var salesData = GetSalesDataFromDatabase();
        
        // 2. 创建Excel报表
        using var excelApp = ExcelFactory.BlankWorkbook();
        var worksheet = excelApp.ActiveWorkbook.ActiveSheetWrap;
        
        // 3. 填充报表内容
        worksheet.Range("A1").Value = "每日销售报表";
        worksheet.Range("A2").Value = DateTime.Now.ToString("yyyy-MM-dd");
        
        // 4. 设置数据表格
        worksheet.Range("A4").Value = "产品名称";
        worksheet.Range("B4").Value = "销售数量";
        worksheet.Range("C4").Value = "销售额";
        worksheet.Range("D4").Value = "同比增长率";
        
        // 5. 填充数据
        for (int i = 0; i < salesData.Count; i++)
        {
            var row = i + 5;
            worksheet.Range($"A{row}").Value = salesData[i].ProductName;
            worksheet.Range($"B{row}").Value = salesData[i].Quantity;
            worksheet.Range($"C{row}").Value = salesData[i].Amount;
            worksheet.Range($"D{row}").Value = salesData[i].GrowthRate;
        }
        
        // 6. 保存报表
        string fileName = $"SalesReport_{DateTime.Now:yyyyMMdd}.xlsx";
        excelApp.ActiveWorkbook.SaveAs(fileName);
    }
}
1.2.2 数据导出工具

数据导出工具是另一个常见应用场景。例如,将数据库查询结果导出为Excel格式,便于用户进行进一步分析或分享。

csharp 复制代码
public class DataExporter
{
    public void ExportToExcel<T>(List<T> data, string fileName) where T : class
    {
        using var excelApp = ExcelFactory.BlankWorkbook();
        var worksheet = excelApp.ActiveWorkbook.ActiveSheetWrap;
        
        // 获取对象的属性作为列标题
        var properties = typeof(T).GetProperties();
        
        // 设置列标题
        for (int i = 0; i < properties.Length; i++)
        {
            worksheet.Cells[1, i + 1].Value = properties[i].Name;
        }
        
        // 填充数据
        for (int row = 0; row < data.Count; row++)
        {
            var item = data[row];
            for (int col = 0; col < properties.Length; col++)
            {
                var value = properties[col].GetValue(item);
                worksheet.Cells[row + 2, col + 1].Value = value?.ToString();
            }
        }
        
        excelApp.ActiveWorkbook.SaveAs(fileName);
    }
}
1.2.3 批量文件处理

批量处理成百上千个Excel文件是自动化的重要应用场景。例如,银行需要对大量的客户账单进行批量处理。

csharp 复制代码
public class BatchFileProcessor
{
    public void ProcessMultipleExcelFiles(string directoryPath)
    {
        var excelFiles = Directory.GetFiles(directoryPath, "*.xlsx");
        
        foreach (var filePath in excelFiles)
        {
            try
            {
                ProcessSingleFile(filePath);
            }
            catch (Exception ex)
            {
                LogError($"处理文件 {filePath} 时出错: {ex.Message}");
            }
        }
    }
    
    private void ProcessSingleFile(string filePath)
    {
        using var excelApp = ExcelFactory.Open(filePath);
        var workbook = excelApp.ActiveWorkbook;
        var worksheet = workbook.ActiveSheetWrap;
        
        // 处理逻辑:数据验证、计算、格式化等
        ValidateData(worksheet);
        CalculateTotals(worksheet);
        FormatReport(worksheet);
        
        // 保存处理后的文件
        string newFileName = Path.Combine(
            Path.GetDirectoryName(filePath),
            $"Processed_{Path.GetFileName(filePath)}"
        );
        workbook.SaveAs(newFileName);
    }
}
1.2.4 报表模板系统

基于模板快速生成标准格式报表是Excel自动化的高级应用。企业通常有标准的报表模板,自动化系统可以基于这些模板快速生成各类报表。

csharp 复制代码
public class TemplateBasedReportGenerator
{
    public void GenerateReportFromTemplate(string templatePath, ReportData data)
    {
        // 基于模板创建工作簿
        using var excelApp = ExcelFactory.CreateFrom(templatePath);
        var worksheet = excelApp.ActiveWorkbook.ActiveSheetWrap;
        
        // 填充模板数据
        worksheet.Range("B2").Value = data.CompanyName;
        worksheet.Range("B3").Value = data.ReportDate;
        worksheet.Range("B4").Value = data.ReportPeriod;
        
        // 填充动态数据
        FillDynamicData(worksheet, data.FinancialData);
        
        // 应用公式
        ApplyFormulas(worksheet);
        
        // 生成文件名并保存
        string fileName = $"{data.CompanyName}_财务报告_{DateTime.Now:yyyyMMdd}.xlsx";
        excelApp.ActiveWorkbook.SaveAs(fileName);
    }
}

2、MudTools.OfficeInterop.Excel与其他方案的对比分析

2.1 主流Excel操作方案对比

2.1.1 原生Office Interop

优点

  • 功能最全面,支持所有Excel功能
  • 官方支持,稳定性高
  • 与Excel版本兼容性好

缺点

  • API复杂,学习曲线陡峭
  • 资源管理复杂,容易导致内存泄漏
  • 类型安全差,大量使用object类型
  • 需要安装Office软件
2.1.2 EPPlus库

优点

  • 无需安装Office软件
  • 性能较好,尤其是处理大量数据时
  • 开源免费,社区活跃
  • 支持.NET Core/.NET 5+

缺点

  • 不支持Excel的所有高级功能
  • 无法操作已打开的Excel实例
  • 不支持宏和VBA
  • 图表功能相对有限
2.1.3 OpenXML SDK

优点

  • 微软官方提供,稳定性高
  • 性能优秀,直接操作文件格式
  • 不需要安装Office软件
  • 支持高级文档操作

缺点

  • 学习曲线非常陡峭
  • API较为底层,使用复杂
  • 某些高级功能实现困难
  • 文档相对较少
2.1.4 MudTools.OfficeInterop.Excel

核心优势

  • API简洁易用:封装了复杂的COM接口,提供更简洁的.NET API
  • 面向对象设计:符合.NET开发习惯,易于理解和维护
  • 自动资源管理:通过IDisposable接口自动管理COM对象生命周期
  • 类型安全:强类型设计,减少运行时错误
  • 完整功能覆盖:支持Excel的常用功能,包括图表、数据透视表等
  • 性能优化:内置性能优化机制

3、环境配置和项目引用

3.1 系统要求

3.1.1 软件要求
  • 操作系统:Windows 7及以上版本
  • .NET Framework:4.6.2、4.7、4.8
  • .NET版本:.NET Standard 2.1、.NET 6.0-windows、.NET 7.0-windows、.NET 8.0-windows、.NET 9.0-windows
  • Microsoft Office:Excel 2010及以上版本(推荐Excel 2016+)
3.1.2 硬件要求
  • 内存:至少4GB RAM(推荐8GB以上)
  • 磁盘空间:至少500MB可用空间
  • 处理器:双核以上处理器

3.2 安装步骤

3.2.1 通过NuGet安装

方法一:Package Manager Console

powershell 复制代码
# 安装核心库
Install-Package MudTools.OfficeInterop -Version 1.2.2

# 安装Excel模块
Install-Package MudTools.OfficeInterop.Excel -Version 1.2.2

# 可选:安装其他Office模块
Install-Package MudTools.OfficeInterop.Word -Version 1.2.2
Install-Package MudTools.OfficeInterop.PowerPoint -Version 1.2.2
Install-Package MudTools.OfficeInterop.Vbe -Version 1.2.2

方法二:.csproj文件直接编辑

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="MudTools.OfficeInterop" Version="1.2.2" />
    <PackageReference Include="MudTools.OfficeInterop.Excel" Version="1.2.2" />
  </ItemGroup>
</Project>

方法三:dotnet CLI命令

bash 复制代码
dotnet add package MudTools.OfficeInterop --version 1.2.2
dotnet add package MudTools.OfficeInterop.Excel --version 1.2.2
3.2.2 手动引用DLL

如果无法使用NuGet,可以手动下载DLL文件并添加到项目引用中:

  1. 从GitHub Release页面下载DLL文件
  2. 在Visual Studio中右键点击"引用" → "添加引用"
  3. 选择"浏览"标签页,找到下载的DLL文件
  4. 勾选需要的DLL文件并确定

3.3 项目配置

3.3.1 目标框架选择

根据项目需求选择合适的目标框架:

Windows桌面应用

xml 复制代码
<TargetFramework>net48</TargetFramework>

跨平台应用

xml 复制代码
<TargetFramework>net6.0-windows</TargetFramework>

Web应用

xml 复制代码
<TargetFramework>net6.0</TargetFramework>
3.3.2 平台目标设置

由于Office Interop依赖于COM组件,需要设置正确的平台目标:

xml 复制代码
<PropertyGroup>
  <PlatformTarget>x86</PlatformTarget>
  <!-- 或 -->
  <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

重要提示:确保平台目标与已安装的Office版本匹配。32位Office需要x86平台,64位Office需要x64平台。

3.3.3 编译选项配置
xml 复制代码
<PropertyGroup>
  <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  <UseWindowsForms>true</UseWindowsForms>
  <UseWPF>true</UseWPF>
</PropertyGroup>

3.4 开发环境验证

3.4.1 环境检查工具

创建一个环境验证工具来检查系统配置:

csharp 复制代码
public class EnvironmentValidator
{
    public ValidationResult ValidateEnvironment()
    {
        var result = new ValidationResult();
        
        // 检查.NET版本
        result.NetVersion = Environment.Version.ToString();
        
        // 检查Office安装
        result.IsOfficeInstalled = CheckOfficeInstallation();
        
        // 检查Excel版本
        result.ExcelVersion = GetExcelVersion();
        
        // 检查权限
        result.HasRequiredPermissions = CheckPermissions();
        
        return result;
    }
    
    private bool CheckOfficeInstallation()
    {
        try
        {
            Type excelType = Type.GetTypeFromProgID("Excel.Application");
            return excelType != null;
        }
        catch
        {
            return false;
        }
    }
    
    private string GetExcelVersion()
    {
        try
        {
            using var excelApp = ExcelFactory.CreateInstance("Excel.Application");
            return excelApp.Version;
        }
        catch (Exception ex)
        {
            return $"无法获取Excel版本: {ex.Message}";
        }
    }
}

public class ValidationResult
{
    public string NetVersion { get; set; }
    public bool IsOfficeInstalled { get; set; }
    public string ExcelVersion { get; set; }
    public bool HasRequiredPermissions { get; set; }
}
3.4.2 常见问题排查

问题1:COMException异常

症状

复制代码
System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

解决方案

  1. 确认Office已正确安装
  2. 检查平台目标设置(x86/x64)
  3. 以管理员身份运行Visual Studio
  4. 重新注册Office COM组件

问题2:内存泄漏

症状:应用程序运行一段时间后内存占用持续增加

解决方案

  1. 确保正确使用using语句
  2. 手动调用Marshal.ReleaseComObject
  3. 设置Excel应用程序属性
csharp 复制代码
// 正确的资源释放方式
using var excelApp = ExcelFactory.BlankWorkbook();
// ... 操作代码
// 不需要手动调用Quit(),using语句会自动处理

问题3:权限不足

症状:访问某些文件或注册表时出现权限错误

解决方案

  1. 以管理员身份运行应用程序
  2. 修改文件/文件夹权限
  3. 在应用程序清单中请求管理员权限
xml 复制代码
<!-- 在app.manifest中添加 -->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

4、第一个Hello World示例

4.1 基础Hello World

让我们从一个最简单的示例开始,创建第一个Excel文件:

csharp 复制代码
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;

namespace ExcelHelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始创建第一个Excel文件...");
            
            try
            {
                // 创建Excel应用程序实例
                using var excelApp = ExcelFactory.BlankWorkbook();
                
                // 设置Excel可见(可选,用于调试)
                excelApp.Visible = true;
                
                // 获取活动工作簿
                var workbook = excelApp.ActiveWorkbook;
                
                // 获取活动工作表
                var worksheet = workbook.ActiveSheetWrap;
                
                // 在工作表中写入"Hello World"
                worksheet.Range("A1").Value = "Hello World!";
                
                // 设置字体格式
                worksheet.Range("A1").Font.Bold = true;
                worksheet.Range("A1").Font.Size = 16;
                worksheet.Range("A1").Font.Color = System.Drawing.Color.Blue;
                
                // 在其他单元格中添加更多信息
                worksheet.Range("A3").Value = "这是使用MudTools.OfficeInterop.Excel创建的第一个Excel文件";
                worksheet.Range("A4").Value = $"创建时间: {DateTime.Now}";
                worksheet.Range("A5").Value = $".NET版本: {Environment.Version}";
                
                // 自动调整列宽
                worksheet.Columns["A"].AutoFit();
                
                // 保存工作簿
                string fileName = $"HelloWorld_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                workbook.SaveAs(fileName);
                
                Console.WriteLine($"✓ 成功创建Excel文件: {fileName}");
                Console.WriteLine("文件已保存到当前目录");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 创建Excel文件时出错: {ex.Message}");
                Console.WriteLine("请检查环境配置是否正确");
            }
            
            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
    }
}

4.2 进阶Hello World示例

让我们创建一个更完整的示例,展示更多功能:

csharp 复制代码
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;

namespace AdvancedHelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("创建进阶Excel示例...");
            
            try
            {
                // 创建Excel应用程序实例
                using var excelApp = ExcelFactory.BlankWorkbook();
                excelApp.Visible = true; // 让Excel可见
                
                var workbook = excelApp.ActiveWorkbook;
                var worksheet = workbook.ActiveSheetWrap;
                
                // 设置工作表名称
                worksheet.Name = "欢迎页面";
                
                // 1. 创建标题区域
                CreateTitleSection(worksheet);
                
                // 2. 创建功能介绍区域
                CreateFeaturesSection(worksheet);
                
                // 3. 创建示例数据区域
                CreateSampleDataSection(worksheet);
                
                // 4. 创建统计信息区域
                CreateStatisticsSection(worksheet);
                
                // 保存文件
                string fileName = $"AdvancedHelloWorld_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                workbook.SaveAs(fileName);
                
                Console.WriteLine($"✓ 进阶示例创建成功: {fileName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 创建进阶示例时出错: {ex.Message}");
            }
            
            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
        
        static void CreateTitleSection(IExcelWorksheet worksheet)
        {
            // 主标题
            worksheet.Range("A1").Value = "MudTools.OfficeInterop.Excel 演示";
            worksheet.Range("A1").Font.Bold = true;
            worksheet.Range("A1").Font.Size = 20;
            worksheet.Range("A1").Font.Color = System.Drawing.Color.DarkBlue;
            
            // 副标题
            worksheet.Range("A2").Value = "强大的Excel自动化解决方案";
            worksheet.Range("A2").Font.Italic = true;
            worksheet.Range("A2").Font.Size = 14;
            worksheet.Range("A2").Font.Color = System.Drawing.Color.Gray;
            
            // 分隔线
            worksheet.Range("A3").Value = new string('-', 50);
        }
        
        static void CreateFeaturesSection(IExcelWorksheet worksheet)
        {
            worksheet.Range("A5").Value = "核心功能特性:";
            worksheet.Range("A5").Font.Bold = true;
            worksheet.Range("A5").Font.Size = 14;
            
            string[] features = {
                "✓ 简洁的API设计,易于使用",
                "✓ 完整的Excel功能支持",
                "✓ 自动资源管理,避免内存泄漏",
                "✓ 类型安全,减少运行时错误",
                "✓ 支持模板化报表生成",
                "✓ 高性能数据处理能力"
            };
            
            for (int i = 0; i < features.Length; i++)
            {
                worksheet.Range($"A{i + 6}").Value = features[i];
                worksheet.Range($"A{i + 6}").Font.Color = System.Drawing.Color.DarkGreen;
            }
        }
        
        static void CreateSampleDataSection(IExcelWorksheet worksheet)
        {
            int startRow = 13;
            
            worksheet.Range($"A{startRow}").Value = "示例数据表格:";
            worksheet.Range($"A{startRow}").Font.Bold = true;
            
            // 表头
            string[] headers = { "产品名称", "单价", "数量", "总价", "库存状态" };
            for (int i = 0; i < headers.Length; i++)
            {
                worksheet.Cells[startRow + 1, i + 1].Value = headers[i];
                worksheet.Cells[startRow + 1, i + 1].Font.Bold = true;
                worksheet.Cells[startRow + 1, i + 1].Interior.Color = System.Drawing.Color.LightGray;
            }
            
            // 示例数据
            var sampleData = new[]
            {
                new { Name = "笔记本电脑", Price = 5999, Quantity = 10, Status = "充足" },
                new { Name = "无线鼠标", Price = 89, Quantity = 5, Status = "紧张" },
                new { Name = "机械键盘", Price = 299, Quantity = 0, Status = "缺货" },
                new { Name = "显示器", Price = 1299, Quantity = 3, Status = "充足" }
            };
            
            for (int i = 0; i < sampleData.Length; i++)
            {
                var data = sampleData[i];
                int row = startRow + 2 + i;
                
                worksheet.Cells[row, 1].Value = data.Name;
                worksheet.Cells[row, 2].Value = data.Price;
                worksheet.Cells[row, 3].Value = data.Quantity;
                worksheet.Cells[row, 4].Formula = $"=B{row}*C{row}"; // 计算总价
                worksheet.Cells[row, 5].Value = data.Status;
                
                // 根据库存状态设置颜色
                if (data.Quantity == 0)
                {
                    worksheet.Cells[row, 5].Font.Color = System.Drawing.Color.Red;
                }
                else if (data.Quantity < 5)
                {
                    worksheet.Cells[row, 5].Font.Color = System.Drawing.Color.Orange;
                }
                else
                {
                    worksheet.Cells[row, 5].Font.Color = System.Drawing.Color.Green;
                }
            }
            
            // 设置边框
            worksheet.Range($"A{startRow + 1}:E{startRow + 2 + sampleData.Length}").Borders.LineStyle = XlLineStyle.xlContinuous;
        }
        
        static void CreateStatisticsSection(IExcelWorksheet worksheet)
        {
            int startRow = 22;
            
            worksheet.Range($"A{startRow}").Value = "统计信息:";
            worksheet.Range($"A{startRow}").Font.Bold = true;
            
            // 使用公式计算统计信息
            worksheet.Range($"A{startRow + 1}").Value = "产品总数:";
            worksheet.Range($"B{startRow + 1}").Formula = "=COUNT(A14:A17)";
            
            worksheet.Range($"A{startRow + 2}").Value = "总库存量:";
            worksheet.Range($"B{startRow + 2}").Formula = "=SUM(C14:C17)";
            
            worksheet.Range($"A{startRow + 3}").Value = "平均单价:";
            worksheet.Range($"B{startRow + 3}").Formula = "=AVERAGE(B14:B17)";
            
            worksheet.Range($"A{startRow + 4}").Value = "最高单价:";
            worksheet.Range($"B{startRow + 4}").Formula = "=MAX(B14:B17)";
            
            worksheet.Range($"A{startRow + 5}").Value = "最低单价:";
            worksheet.Range($"B{startRow + 5}").Formula = "=MIN(B14:B17)";
            
            // 设置数字格式
            worksheet.Range($"B{startRow + 3}:B{startRow + 5}").NumberFormat = "¥#,##0.00";
        }
    }
}

4.3 错误处理与最佳实践

4.3.1 完善的异常处理

在实际应用中,需要添加完善的异常处理机制:

csharp 复制代码
public class SafeExcelOperation
{
    public void PerformSafeOperation()
    {
        IExcelApplication excelApp = null;
        
        try
        {
            // 创建Excel应用程序实例
            excelApp = ExcelFactory.BlankWorkbook();
            
            // 执行操作
            var workbook = excelApp.ActiveWorkbook;
            var worksheet = workbook.ActiveSheetWrap;
            
            worksheet.Range("A1").Value = "安全操作示例";
            
            // 保存工作簿
            workbook.SaveAs("SafeOperation.xlsx");
            
            Console.WriteLine("操作成功完成");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine($"文件未找到: {ex.FileName}");
            LogError(ex);
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("权限不足,请以管理员身份运行");
            LogError(ex);
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            Console.WriteLine("COM组件错误,请检查Office安装");
            Console.WriteLine($"错误代码: {ex.ErrorCode}");
            LogError(ex);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"未知错误: {ex.Message}");
            LogError(ex);
        }
        finally
        {
            // 确保资源被正确释放
            if (excelApp != null)
            {
                try
                {
                    excelApp.Quit();
                    ((IDisposable)excelApp).Dispose();
                }
                catch (Exception disposeEx)
                {
                    Console.WriteLine($"资源释放时出错: {disposeEx.Message}");
                }
            }
        }
    }
    
    private void LogError(Exception ex)
    {
        // 在实际应用中,这里应该记录到日志文件或数据库
        File.AppendAllText("error.log", $"{DateTime.Now}: {ex}\n");
    }
}
4.3.2 性能优化技巧
csharp 复制代码
public class OptimizedExcelOperation
{
    public void PerformOptimizedOperation()
    {
        using var excelApp = ExcelFactory.BlankWorkbook();
        
        // 性能优化设置
        excelApp.ScreenUpdating = false; // 关闭屏幕更新
        excelApp.DisplayAlerts = false;  // 关闭警告提示
        excelApp.EnableEvents = false;   // 禁用事件
        
        var workbook = excelApp.ActiveWorkbook;
        var worksheet = workbook.ActiveSheetWrap;
        
        try
        {
            // 批量操作数据(避免单个单元格操作)
            var dataRange = worksheet.Range("A1:D1000");
            
            // 使用二维数组批量设置值
            object[,] values = new object[1000, 4];
            for (int i = 0; i < 1000; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    values[i, j] = $"数据{i + 1}-{j + 1}";
                }
            }
            
            dataRange.Value = values;
            
            // 恢复设置
            excelApp.ScreenUpdating = true;
            excelApp.DisplayAlerts = true;
            excelApp.EnableEvents = true;
            
            workbook.SaveAs("OptimizedOperation.xlsx");
        }
        catch (Exception)
        {
            // 确保在异常情况下也恢复设置
            excelApp.ScreenUpdating = true;
            excelApp.DisplayAlerts = true;
            excelApp.EnableEvents = true;
            throw;
        }
    }
}
相关推荐
cx330上的猫2 小时前
【数据分析-Excel】常用函数汇总
数据分析·excel
拾光Ծ2 小时前
Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
linux·运维·自动化·gcc
唐青枫2 小时前
C#.NET WebAPI 返回类型深度解析:IActionResult 与 ActionResult<T> 的区别与应用
c#·.net
时光不去6 小时前
java接口自动化之allure本地生成报告
运维·笔记·自动化
追逐时光者11 小时前
一个基于 .NET 8 + DDD 搭建的模块化微服务框架
后端·.net
William_cl11 小时前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc
狮子不白12 小时前
C#WEB 防重复提交控制
开发语言·前端·程序人生·c#
Charles_go14 小时前
C#8、有哪些访问修饰符
java·前端·c#
yue00816 小时前
C# 求取整数的阶乘
java·开发语言·c#