当前位置: 首页 > news >正文

.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报表,并通过邮件发送给相关管理人员。

// 模拟日报系统数据生成
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格式,便于用户进行进一步分析或分享。

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文件是自动化的重要应用场景。例如,银行需要对大量的客户账单进行批量处理。

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自动化的高级应用。企业通常有标准的报表模板,自动化系统可以基于这些模板快速生成各类报表。

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

# 安装核心库
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文件直接编辑

<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命令

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桌面应用

<TargetFramework>net48</TargetFramework>

跨平台应用

<TargetFramework>net6.0-windows</TargetFramework>

Web应用

<TargetFramework>net6.0</TargetFramework>
3.3.2 平台目标设置

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

<PropertyGroup><PlatformTarget>x86</PlatformTarget><!-- 或 --><PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

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

3.3.3 编译选项配置
<PropertyGroup><AllowUnsafeBlocks>true</AllowUnsafeBlocks><UseWindowsForms>true</UseWindowsForms><UseWPF>true</UseWPF>
</PropertyGroup>

3.4 开发环境验证

3.4.1 环境检查工具

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

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应用程序属性
// 正确的资源释放方式
using var excelApp = ExcelFactory.BlankWorkbook();
// ... 操作代码
// 不需要手动调用Quit(),using语句会自动处理

问题3:权限不足

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

解决方案

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

4、第一个Hello World示例

4.1 基础Hello World

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

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示例

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

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 完善的异常处理

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

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 性能优化技巧
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;}}
}
http://www.dtcms.com/a/600578.html

相关文章:

  • 多站点网站群的建设与管理识图搜索在线 照片识别
  • C++ builder xe 用imageen组件ImageEnView1合并多个图片导出一个pdf
  • 深度拆解汽车制造系统设计:用 Java + 设计模式打造高扩展性品牌 - 车型动态生成架构
  • 客户端VS前端VS后端
  • 西安企业网站建设哪家好hs网站推广
  • 【宝塔面板】监控、日志、任务与安全设置
  • RPA财务机器人落地指南:治理架构、流程优化与风险防控
  • GitHub Agent HQ正式发布,构建开放智能体生态
  • XML节点SelectSingleNode(“msbuild:DebugType“ 为什么要加msbuild
  • 【GitHub热门项目】(2025-11-12)
  • 【RAG评测方案汇总】GitHub开源工具全览
  • 数据集月度精选 | 高质量具身智能数据集:打开机器人“感知-决策-动作”闭环的钥匙
  • 深圳网站制作易捷网络湘乡网站seo
  • Java Maven Log4j 项目日志打印
  • 面试:Spring中单例模式用的是哪种?
  • 长芯微LPS5820完全P2P替代NCP51820,LPS5820 是一款高速半桥驱动器,可用来驱动半 桥功率拓扑的 GaN 功率管。
  • Python 第三方库:PyTorch(动态计算图的深度学习框架)
  • 如果网站打开非常缓慢国内全屋定制十大名牌
  • 【操作系统】详解 分页与分段系统存储管理
  • flex:1
  • 【LeetCode经典题解】递归破解对称二叉树之谜
  • 电脑已连接网络无线自动重启
  • 创建Vue2和Vue3项目区别对比和对应示例演示
  • 《算法闯关指南:优选算法--位运算》--38.消失的两个数字
  • 建设银行网站背景图片wordpress 读写分离
  • 最简单的网站建设语音wordpress首页弹窗你
  • 哪里有建设哪里有我们wordpress如何做优化
  • Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略
  • Vue 列表渲染完全指南:v-for 核心用法、key 原理及数据监测实战(附代码案例)
  • webrtc降噪-PriorSignalModelEstimator类源码分析与算法原理