我正在实施的项目的想法是从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。
答案 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对象。