如何从Excel工作表创建数据字典以在控制台应用程序中显示(c#)

时间:2016-09-04 16:40:57

标签: c# excel dictionary

我正在实施的项目的想法是从excel表中获取一些数据,如下所示: column : FileName/docName and row:cells B-J (fieldType) are two things used to create a key docName和Fieldtype以格式(docName / fieldType)连接,以便为我提供一个存储在字典中的密钥。 我需要存储来自与密钥匹配的excel表格中相应单元格的值,条件是非空。

public class ReadingExcel
{
    #region Members

    int col = 1;
    int row = 1;
    int limit = 0;
    int valLimit = 1;
    int colLimit = 0;
    int rowLimit = 0;
    int totalColumns;
    int totalRows;
    string resultRowTemp = string.Empty;
    string result = string.Empty;
    StringBuilder concatValue = new StringBuilder();
    Application excelApp = new Application();
    Workbook ExtractionBook;
    Worksheet Sheet;
    Range dataRange;
    List<string> docName = new List<string>();
    List<string> fieldType = new List<string>();
    List<string> rowFieldValues = new List<String>();
    List<string> excelData = new List<String>();
    List<string> concatKey = new List<string>();
    Dictionary<string,List<string>> docFieldDictionary = new Dictionary<string,List<string>>();
    #endregion

    #region Public Methods

    public void ExtractKeys(string docPath, string sheetName, string key)
    {

        ExtractionBook = excelApp.Workbooks.Open(docPath);
        Sheet = (Worksheet)ExtractionBook.Sheets[sheetName];
        dataRange = (Range)Sheet.Cells;
        totalColumns = Sheet.UsedRange.Columns.Count;
        totalRows = Sheet.UsedRange.Rows.Count;

        //To get the docName alone 
        for (row = 2; row <= totalRows; row++)
        {
            dataRange = (Range)Sheet.Cells[row, col];
            result = (string)dataRange.Value2;
            if (!string.IsNullOrEmpty(result))
            {
                docName.Add(result);

            }
        }

        //To get the fields alone     
        for (col = 1; col <= totalColumns; col++)
        {
            dataRange = (Range)Sheet.Cells[col];
            result = (string)dataRange.Value2;
            if (!string.IsNullOrEmpty(result))
            {
                fieldType.Add(result);
            }
        }

        //To create the Dictionary Keys
        for (limit = 0; limit < docName.Count; limit++)
        {
            for (valLimit = 1; valLimit < fieldType.Count; valLimit++)
            {

                concatValue = concatValue.Append(docName[limit]).Append("/").Append(fieldType[valLimit]);
                result = concatValue.ToString();
                concatKey.Add(result);
                concatValue.Clear();

            }

        }

我对如何进一步添加密钥以及如何从Excel工作表中获取相应的值一无所知。

我尝试的下一步是在rowFieldValues列表中存储相应docName的所有fieldType值。

      //To read the entire excel sheet
            for (row = 2; row <= totalRows; row++)
            {
                for (col = 1; col <= totalColumns; col++)
                {
                    dataRange = (Range)Sheet.Cells[row, col];
                    result = (string)dataRange.Value2;
                    excelData.Add(result);               
                }
            }
            // To fetch and store data for each docName
            for ( rowLimit = 0; rowLimit < excelData.Count; rowLimit++)
            {
                for (limit = 0; limit < docName.Count; limit++)
                {
                    if (docName[limit] == excelData[rowLimit])
                    {
                        for (colLimit = 0; colLimit < fieldType.Count; colLimit++)
                        {
                            rowFieldValues.Add(excelData[colLimit]);
                            docFieldDictionary.Add(docName[limit], rowFieldValues);
                        }
                    }
                }       
            }

我有三个问题:

1.rowFieldValues列表返回所有docNames的相同数据。

2.我收到错误error msg saying: same dicitonary key is already added

3.一旦将一个docName的所有rowFieldValues添加到列表中,我就无法迭代到嵌套for循环中的下一个docName。

1 个答案:

答案 0 :(得分:0)

根据您发布的代码,我无法真正解决您的特定问题。但我建议重新考虑你的方法。

如果我尝试从已知格式的Excel电子表格中获取数据。我会设计一个封装该数据的类。

e.g。

public class DocDetails
{
    public string B { get; set; }
    ...
    public string J { get; set; }
}

注意:变量B-J仅为示例..使用描述实际属性的内容。

然后你的字典将成为DocDetails的字典,而字典的键只是docName。

这几乎肯定会使字典在C#应用程序中更容易使用,因为您不必构建Keys来获取值。您还可以通过从字典中获取KeyList来轻松获取文档名称列表。

要填充字典,只需抓取设置了docName列的每一行,然后根据其他列填充新的DocDetails对象。