我正在更新一个Excel外接程序(XLL),它需要处理工作簿的每个Excel工作表上的UsedRange.出于性能和 solidity 的考虑,我已经从以前的循环遍历UsedRange区域中的每个Range对象的行为切换到读取UsedRange. Formula和UsedRange.Value2作为object [*,*]array.这种新方法仍然相当慢,我怀疑是因为对象[*,*]数组的"体积".

我的代码需要判断每个Formula作为逐个单元格循环中的主要活动(实现为行、列嵌套循环),并且只有在满足某些条件时才需要判断Value2数据.因此,我试着看看如何将UsedRange. Formula数组直接映射到字符串[*,*]数组,因为我认为这样循环会更快一些?

我目前使用的是:

object[,] formulas = (object[,])ws.UsedRange.Formula;
int row_count = formulas.GetUpperBound(0);
int col_count = formulas.GetUpperBound(1);

然后我在公式数组上循环,做我需要做的事情.但是Excel Formula数据总是一个字符串(或空字符串),所以它应该是非常直接的创建字符串[*,*].但是,这个代码不起作用:

string[,] formulas_str = (string[,])formulas;

有没有可能像我在这里想做的那样对字符串[*,*]进行数组转换?如果我必须一个一个的go 做它,那么我做它没有任何好处.

推荐答案

在C#中不支持将对象[,]数组直接转换为字符串[,]数组,因为运行时不能保证数组中的所有对象都是字符串.即使Excel公式是字符串,但当您通过UsedRange. Formula检索它们时,由于COM接口的性质,它们会作为对象数组出现,并考虑到范围内可能包含不同类型的数据.

如果您必须将数组转换为字符串[,]以满足您的特定用例,那么以最小的开销来执行此操作是关键.不幸的是,你必须遍历数组:

object[,] formulas = (object[,])ws.UsedRange.Formula;
int rows = formulas.GetUpperBound(0) + 1; // Bounds are zero-based
int cols = formulas.GetUpperBound(1) + 1;
string[,] formulasStr = new string[rows, cols];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        // Safely cast each object to a string, handling possible null values
        formulasStr[i, j] = formulas[i, j]?.ToString() ?? string.Empty;
    }
}

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

无法使用ternal- .net修复可空警告

CsWin32如何创建PWSTR的实例,例如GetWindowText

. NET 8 HttpClient post参数将其情况更改为camel'

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

注册所有IMediatR类

如何在ASP.NET Core8中启用REST应用程序的序列化?

异步实体框架核心查询引发InvalidOperation异常

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

在swagger示例中添加默认数组列表

什么时候接受(等待)信号灯?尽可能的本地化?

如何将端点(或с匹配请求并判断其路径)添加到BCL?

Polly重试URL复制值

LINQ to Entities中的加权平均值

在Docker容器中运行API项目时,无法本地浏览到index.html

C#动态设置ServerReport报表参数

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

如何从Entity Framework Core中填充ListIInterface

未显示详细信息的弹出对话框

使用DI实例化带有动态参数的服务?