替换excel文件列中的字符

时间:2018-02-01 17:19:13

标签: c# excel

我正在读取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;
                }
            }
        }
    }

3 个答案:

答案 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;