如何通过使用来自excel的C#循环遍历行来检索每个特定列的值?

时间:2018-01-22 02:46:55

标签: c# excel vba excel-vba syncfusion

我正在使用C#编辑上传的excel工作簿,其逻辑与我过去使用的VBA相同。我使用SyncFusion打开工作簿但是,下面的代码不允许我阅读整列来应用逻辑。为什么?

public void AppendID(string excelFilePath, HttpResponse response)
{

    using (ExcelEngine excelEngine = new ExcelEngine())
    {

        IApplication application = excelEngine.Excel;
        application.DefaultVersion = ExcelVersion.Excel2007;
        IWorkbook workbook = application.Workbooks.Open(excelFilePath);
        workbook.Version = ExcelVersion.Excel97to2003;
        workbook.Allow3DRangesInDataValidation = true;

        //Accessing worksheet via name

        IWorksheet worksheet = workbook.Worksheets[2];

当我尝试定义范围时,错误将显示“不允许两个名字”。

        var prismaID = worksheet.UsedRange["C15:C"].Value;
        var type = worksheet.UsedRange["F15:F"].Value;
        var placements = worksheet.UsedRange["I15:I"].Value;

        if (!type.Contains("PKG"))
        {
            placements = placements + prismaID;
        }

        worksheet.Range["G7"].Text = "Testing";

        workbook.SaveAs(excelFilePath);
        workbook.Close();

    }
}

逻辑:

假设我有三列以及如何使用以下逻辑来操作usedRange单元格?

ID    Condition   Name        Output
1       Yes       Sarah        Sarah(1)
2       No        George       George
3       Yes       John(3)      John(3)

要应用的逻辑:

  1. 将第一列“ID”移至“名称”列的末尾,但
  2. if 列'条件'包含'否则不移动第一列
  3. ,如果它已包含相同的“ID”。
  4. 这是VBA代码:

    With xlSheet  
        LastRow = xlSheet.UsedRange.Rows.Count
        Set target = .Range(.Cells(15, 9), .Cells(LastRow, 9))
        values = target.Value
    
        Set ptype=.Range(.Cells(15,6),.Cells(LastRow,6))
        pvalues=ptype.Value
    
        For i = LBound(values, 1) To UBound(values, 1)
            'if Statement for test keywords
            If InStr(1,pvalues(i,1),"Package")= 0 AND InStr(1,pvalues(i,1),"Roadblock")= 0 Then 
                If Instr(values(I,1),.Cells(i + 15 - LBound(values, 1), 3)) = 0 Then
                'If InStr(1,values(i,1),"(")=0 Then
                    values(i, 1) = values(i, 1) & "(" & .Cells(i + 15 - LBound(values, 1), 3) & ")"
                End If 
            End If
        Next
    
        target.Value = values
    End With
    

2 个答案:

答案 0 :(得分:1)

您的要求可以通过使用XlsIO追加列ID和列名来实现。

请参阅以下代码段。

代码段:

for(int row = 1; row<= worksheet.Columns[1].Count; row++) 
    { 
        if (worksheet[row, 2].Value == "yes" && !worksheet[row, 3].Value.EndsWith(")")) 
            worksheet[row, 4].Value = worksheet[row, 3].Value + "(" + worksheet[row, 1].Value + ")"; 
        else 
            worksheet[row, 4].Value = worksheet[row, 3].Value; 
    } 

我们准备了简单的样本,样本可以从以下链接下载。

示例链接:http://www.syncfusion.com/downloads/support/directtrac/general/ze/Sample859524528.zip

我为Syncfusion工作。

答案 1 :(得分:1)

所以我正在使用excel中的模板,我开发了这个逻辑。

我创建了第一行列名和行的耦合,使用第一个单元格作为键将组中的数据绑定到多值字典。 我使用下面的函数,它可以适用于在解析之前跳过行,允许你定位正确的绑定行。 Book是ExcelDataReader.AsDataSet()

    public static MultiValueDictionary<string, ILookup<string, string>> ParseTemplate(string Sheet, ref List<string> keys)
    {
        int xskip = 0;
        MultiValueDictionary<string, ILookup<string, string>> mvd = new MultiValueDictionary<string, ILookup<string, string>>();

        var sheetRows = Book.Tables[Sheet];
        //Parse First row
        var FirstRow = sheetRows.Rows[0];

        for (var Columns = 0; Columns < sheetRows.Columns.Count; Columns++)
        {
            if (xskip == 0)
            {
                xskip = 1;
                continue;
            }
            keys.Add(FirstRow[Columns].ToString());
        }
        //Skip First Row
        xskip = 0;
        //Create a binding of first row and all subsequent rows
        foreach (var row in sheetRows.Select().Skip(1))
        {
            //Make the key the first cell of each row
            var key = row[0];
            List<string> rows = new List<string>();
            foreach (var item in row.ItemArray)
            {
                if (xskip == 0)
                {
                    xskip = 1;
                    continue;
                }
                rows.Add(item.ToString());
            }
            mvd.Add(key.ToString(), keys.Zip(rows, (m, n) => new { Key = m, Value = n }).ToLookup(x => x.Key, y => y.Value));
            xskip = 0;
        }
        return mvd;
    }

}

//This is example of what a function to parse this could do.
foreach(var Key in mvd.Keys)
{
     var KeywithValues = mvd[Key];
     foreach(ColumnName in Keys)
     {
         KeywithValues[ColumnName].
     }
}

希望它有所帮助。