我正在读取excel文件中的特定列并尝试更改其中的值。该文件包含如下记录
12345*5
12445*6
12312*9
我想用'_'替换'*'。
我收到以下错误'Cannot implicitly convert type 'object[*,*]' to 'string[*,*]'. An explicit conversion exists (are you missing a cast?)'
我在线查看了错误,但无法解决此错误。
static void Main(string[] args)
{
var xlApp = new Excel.Application();
var xlWorkbook = xlApp.Workbooks.Open(@"path");
var xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
ChangeValue(xlWorksheet);
}
private static void ChangeValue(Excel.Worksheet oWorksheet)
{
var colNo = oWorksheet.UsedRange.Columns.Count;
var rowNo = oWorksheet.UsedRange.Rows.Count;
string[,] array = oWorksheet.UsedRange.Value;
for (var j = 1; j <= colNo; j++)
{
for (var i = 1; i <= rowNo; i++)
{
if (array[i, j] == "Number Field")
{
for (var m = i + 1; m < rowNo; m++)
{
if(array[m, j].Contains('*'))
{
array[m, j].Replace('*', '_');
}
}
oWorksheet.UsedRange.Value = array;
return;
}
}
}
}
答案 0 :(得分:0)
您使用的属性Range.Value
不是简单的二维字符串数组。这就是你收到错误的原因。它返回一个可能包含值的XML对象,在这种情况下,您需要将这些值显式地转换为字符串,然后才能将它们存储在string
数组中。
由于您按列和行进行迭代,因此在检查条件或获取值时,最好通过转换为字符串而不指定新对象。我没有测试过,但这样的事情可能有用:
oWorksheet.UsedRange.Value[i, j].ToString() == "Number Field"
答案 1 :(得分:0)
错误非常清楚,告诉您正在尝试将object[,]
数组转换为string[,]
数组。
string[,] array = oWorksheet.UsedRange.Value;
所以,像这样修改你的代码。
private static void ChangeValue(Worksheet oWorksheet)
{
var colNo = oWorksheet.UsedRange.Columns.Count;
var rowNo = oWorksheet.UsedRange.Rows.Count;
for (var j = 1; j <= colNo; j++)
{
for (var i = 1; i <= rowNo; i++)
{
Range row = oWorksheet.Rows.Cells[i, j];
if (row.Value.ToString().Contains("*"))
{
row.Value = row.Value.ToString().Replace("*","_");
}
}
}
}
然后主方法看起来像;
static void Main(string[] args)
{
var xlApp = new Microsoft.Office.Interop.Excel.Application();
var xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\Administrator\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\asd.xlsx");
var xlWorksheet = xlWorkbook.Sheets[1];
ChangeValue(xlWorksheet);
xlWorkbook.Application.Save();
xlWorkbook.Save();
xlWorkbook.Close();
Marshal.FinalReleaseComObject(xlWorksheet);
Marshal.FinalReleaseComObject(xlWorkbook);
xlWorksheet = null;
xlWorkbook = null;
xlApp.Quit();
Marshal.FinalReleaseComObject(xlApp);
xlApp = null;
Console.ReadLine();
}
此外,您可以使用xlWorkbook.Application.Save
保存更改。
答案 2 :(得分:0)
你能试试吗?为2循环分配范围。像:
for (var j = 1; j <= colNo; j++)
{
for (var i = 1; i <= rowNo; i++)
{
if (array[i, j] == "Number Field")
{
for (var m = i + 1; m < rowNo; m++)
{
if(array[m, j].Contains('*'))
{
array[m, j].Replace('*', '_');
}
}
return;
}
}
}
oWorksheet.UsedRange.Value = array;