Чтение из взаимодействия с Excel и запись отдельных значений на другой лист

Я использую С# 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();
}

person toop    schedule 16.02.2012    source источник


Ответы (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);
person Beatles1692    schedule 16.02.2012
comment
что я должен поместить в тела методов? Также он говорит об этой ошибке: «не удается разрешить символ T». Спасибо. - person toop; 16.02.2012
comment
извините, я исправил неправильный синтаксис. Ну, вы должны прочитать свои данные в первом, используя API Excel, а во втором вы должны записать их на лист. - person Beatles1692; 16.02.2012
comment
Может быть, я что-то упускаю здесь... но как это пустое тело метода позволяет вам что-то читать? - person toop; 17.02.2012
comment
на самом деле вы должны реализовать тело :) - person Beatles1692; 18.02.2012