从Excel互操作读取并将不同的值写入另一个工作表

时间:2012-02-16 09:08:47

标签: c# .net excel c#-4.0 com

我正在使用c#4.0并且正在从一个Excel工作表读取并从每个列中获取值然后在另一个工作表上我只写每列的不同值。

即。如果结果表有:

COLA         COLB       COLC
-----      -------    -------
dog         cow        rabbit
cat          moose     hare
dog          moose     bunny
bird         yak       hare
fish                   fox
                       bunny
                       weasel
                       fox
                       bunny

然后不同的表应该有(每列中的排序并不重要):

COLA         COLB       COLC
-----      -------    -------
dog         cow        rabbit
cat          moose     hare
bird         yak       weasel
fish                   fox
                       bunny

任何人都可以建议一种更简单的方法(仍然使用com interop excel),否则需要使用这个丑陋的2d对象数组,arraylist组合,列表回到array.etc。

这是我的工作进度代码,感觉我走的方向错误:

for (int c = 0; c < num_of_cols; c++)
{
    string colref = NumToLetter(c + 1);
    int lastRow = workbook.Sheets["Results"].Cells[workbook.Sheets["Results"].Rows.Count, colref].End(MSExcel.XlDirection.xlUp).Row;
    MSExcel.Range excelRange = workbook.Sheets["Results"].Range[colref + "2:" + colref + lastRow];
    object[,] valueArray = (object[,])excelRange.get_Value(MSExcel.XlRangeValueDataType.xlRangeValueDefault);
    List<ArrayList> distinctList = new List<ArrayList>();
        for (int index = 0; index < num_of_cols.Length; index++)
            distinctList.Add(new ArrayList());
    for (int i = 1; i <= valueArray.GetUpperBound(0); i++)
    {
        if (valueArray[i, 1] != null)
        {
            if (!distinctList[c].Contains(valueArray[i, 1].ToString()))
                distinctList[c].Add(valueArray[i, 1].ToString());
        }
    }
    var startCell = (MSExcel.Range)distinctVals_worksheet.Cells[1, c + 1];
    var endCell = (MSExcel.Range)distinctVals_worksheet.Cells[distinctList[c].Count,c + 1];
    var writeRange = distinctVals_worksheet.Range[startCell, endCell];
    writeRange.Value2 = distinctList[c].ToArray();
}

1 个答案:

答案 0 :(得分:1)

我认为你可以在每个列的基础上执行此操作,并使用linq选择不同的值,然后将它们写在目标上。 像这样:

static IEnumerable<string> GetValuesOfColumn(this Excel.Sheet sheet,int col)
{
//returns all the values of the specific column of a sheet
}

static void WriteValuesToColumn(this Excel.Sheet sheet,IEnumerable<string> values,int col,int row)
{
//Writes values to a certain range of a sheet
}

然后你可以这样做:

var distinctValues=mySheet.GetValuesOfColumn(0).Distinct();

myOtherSheet.WriteValuesToColumn(distinctValues,0,0);