อ่านจากการทำงานร่วมกันของ Excel และเขียนค่าที่แตกต่างกันไปยังชีตอื่น

ฉันใช้ 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();
}

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
ขออภัย ฉันแก้ไขไวยากรณ์ผิด คุณควรอ่านข้อมูลของคุณในอันแรกโดยใช้ Excel API และอันที่สองคุณต้องเขียนลงในชีต - person Beatles1692; 16.02.2012
comment
บางทีฉันอาจจะพลาดอะไรบางอย่างที่นี่ .. แต่เนื้อหาวิธีการว่างนั้นช่วยให้คุณอ่านอะไรได้อย่างไร - person toop; 17.02.2012
comment
จริงๆ แล้วคุณควรจะปรับใช้ร่างกาย :) - person Beatles1692; 18.02.2012