所以我试图读取一个excel文件并将数据插入到类属性中。我认为当我开始上课的时候会遇到一个问题,但是在我解析并将这些值添加到课程之前我会这样做。
解析完成后 - 我调用绑定类但它返回空值。
通话
TestData td = new TestData();
XLReader.GetClassFromExcel<TestData>(1,1,1);
var ddddd = td.Title; //this is null.
班级
public class TestData
{
public string Title { get; set; }
public string Site { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
public string Email { get; set; }
public string OrderRef { get; set; }
public string ReqBy { get; set; }
public string ApprovedBy { get; set; }
}
Excel的解析
public static class XLReader
{
/// <summary>
/// The deployment files folder name
/// </summary>
private static readonly string deploymentFilesFolderName =
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
public static List<T> GetClassFromExcel<T>(int fromRow, int fromColumn, int toColumn = 0)
{
var path = Path.Combine(deploymentFilesFolderName, @"Tools\TestData.xlsx");
List<T> retList = new List<T>();
using (var pck = new ExcelPackage())
{
using (var stream = File.OpenRead(path))
{
pck.Load(stream);
}
//Retrieve first Worksheet
var ws = pck.Workbook.Worksheets.First();
//If the to column is empty or 0, then make the tocolumn to the count of the properties
//Of the class object inserted
toColumn = toColumn == 0 ? typeof(T).GetProperties().Count() : toColumn;
//Read the first Row for the column names and place into a list so that
//it can be used as reference to properties
List<string> columnNames = new List<string>();
// wsRow = ws.Row(0);
foreach (var cell in ws.Cells[1, 1, 1, ws.Cells.Count()])
{
columnNames.Add(cell.Value.ToString());
}
//Loop through the rows of the excel sheet
for (var rowNum = fromRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
//create a instance of T
T objT = Activator.CreateInstance<T>();
//Retrieve the type of T
Type myType = typeof(T);
//Get all the properties associated with T
PropertyInfo[] myProp = myType.GetProperties();
var wsRow = ws.Cells[rowNum, fromColumn, rowNum, ws.Cells.Count()];
foreach (var propertyInfo in myProp)
{
if (columnNames.Contains(propertyInfo.Name))
{
int position = columnNames.IndexOf(propertyInfo.Name);
//To prevent an exception cast the value to the type of the property.
var blah = Convert.ChangeType(wsRow[rowNum, position + 1].Value, propertyInfo.PropertyType);
propertyInfo.SetValue(objT,blah);
}
}
retList.Add(objT);
}
}
return retList;
}
}
答案 0 :(得分:0)
当我导入excel数据时,我总是创建一个字符串数组来存储该代码的值
package.Load(fileContent.InputStream);
ExcelWorksheet workSheet = package.Workbook.Worksheets[1];
int totalRows = workSheet.Dimension.End.Row;
int totalCols = workSheet.Dimension.End.Column;
List<myObject> listMyObject = new List<myObject>();
for (int currentRow = 1; currentRow <= totalRows; currentRow++)
{
string[] resultRow = new string[totalCols];
for (int currentCol = 1; currentCol <= totalCols; currentCol++)
{
//We read the entire line and store it in the array
resultRow[currentCol - 1] = (workSheet.Cells[currentRow, currentCol].Value != null) ? workSheet.Cells[currentRow, currentCol].Value.ToString() : "";
}
//And now I can bind my array to my object
listMyObject.Add(myObjectHelper.Convert(resultRow));
}
//Here i've got my list object
我的数组最坏的是包含空字符串。在这种情况下,我知道我的Excel文件中没有任何内容。
将我的字符串数组转换为我的对象后