我正在读取一个excel文件,并逐列将数据添加到集合中。 一旦遇到空值,它就会在下面的一行中爆炸:
exampleDataList.Add(new PersonalData {firstname = col1Value.ToString(),lastname = col2Value.ToString(), address=col3Value.ToString(), salary=col4Value.ToString() });
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
const int startRow = 1;
if (file != null && Path.GetExtension(file.FileName) == ".xlsx")
{
IList<PersonalData> exampleDataList = new List<PersonalData>();
using(var excel = new ExcelPackage(file.InputStream))
{
//open and read the xlsx file.
//Get the work book in the file
ExcelWorkbook workBook = excel.Workbook;
if (workBook != null)
{
if (workBook.Worksheets.Count > 0)
{
//Get the first worksheet
ExcelWorksheet currentWorkSheet = workBook.Worksheets.First();
for (int rowNumber = startRow + 1; rowNumber <= currentWorkSheet.Dimension.End.Row; rowNumber++)
// read each row from the start of the data (start row + 1 header row) to the end of the spreadsheet.
{
object col1Value = currentWorkSheet.Cells[rowNumber, 1].Value;
object col2Value = currentWorkSheet.Cells[rowNumber, 2].Value;
object col3Value = currentWorkSheet.Cells[rowNumber, 3].Value;
object col4Value = currentWorkSheet.Cells[rowNumber, 4].Value;
if ((col1Value != null && col2Value != null))
{
exampleDataList.Add(new PersonalData {firstname = col1Value.ToString(),lastname = col2Value.ToString(), address=col3Value.ToString(), salary=col4Value.ToString() });
}
}
int myresultcount = WriteToDb(exampleDataList);
}
}
}
}
return RedirectToAction("Index");
}
这是我的班级
public class PersonalData
{
public int Id { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
public string address { get; set; }
public string salary { get; set; }
}
获取错误消息:对象引用未设置为对象的实例
我该如何纠正?我究竟做错了什么。我的目标是将其写入数据库 在一天结束时。
答案 0 :(得分:1)
我相信你忘了检查value3和value4是否为null,或者如果允许这些值为null,则在执行ToString()
if (col1Value != null && col2Value != null &&
col3Value != null && col4Value != null)
{
exampleDataList.Add(new PersonalData
{
firstname = col1Value.ToString(),
lastname = col2Value.ToString(),
address = col3Value.ToString(),
salary = col4Value.ToString()
});
}
OR
if (col1Value != null && col2Value)
{
exampleDataList.Add(new PersonalData
{
firstname = col1Value.ToString(),
lastname = col2Value.ToString(),
address = col3Value != null ? col3Value.ToString() : String.Empty,
salary = col4Value.ToString() != null ? col4Value.ToString() : String.Empty
});
}
答案 1 :(得分:1)
检查第3列和第4列中的空值:
if ((col1Value != null && col2Value != null && col3Value != null && col4Value != null))
{
exampleDataList.Add(new PersonalData {firstname = col1Value.ToString(),lastname = col2Value.ToString(), address=col3Value.ToString(), salary=col4Value.ToString() });
}
或者,如果您想要第3列和第4列的空字符串而不是NULL:
if ((col1Value != null && col2Value != null))
{
exampleDataList.Add(new PersonalData {
firstname = col1Value.ToString(),
lastname = col2Value.ToString(),
address = col3Value == null ? "" : col3Value.ToString(),
salary = col4Value == null ? "" : col4Value.ToString() });
}
为了简化NULL检查,您可以利用+
使用空字符串表示空值的行为,并自动调用.ToString()
对象:
if ((col1Value != null && col2Value != null))
{
exampleDataList.Add(new PersonalData
{
firstname = col1Value.ToString(),
lastname = col2Value.ToString(),
address = "" + col3Value,
salary = "" + col4Value
});
}
答案 2 :(得分:0)
您缺少对colXValue对象的一些验证,在尝试对它们调用ToString()方法之前应该这样做。
这取决于你想如何处理空值。
如果你想忽略任何列上任何空值的记录,那么只需扩展你的:
if ((col1Value != null && col2Value != null))
看起来像:
if ( col1Value != null
&& col2Value != null
&& col3Value != null
&& col4Value != null)
您可能还想将空值转换为空字符串,在这种情况下,您可以执行以下操作:
object col1Value = currentWorkSheet.Cells[rowNumber, 1].Value;
object col2Value = currentWorkSheet.Cells[rowNumber, 2].Value;
object col3Value = currentWorkSheet.Cells[rowNumber, 3].Value;
object col4Value = currentWorkSheet.Cells[rowNumber, 4].Value;
if (col1Value == null) col1Value = string.Emtpy;
if (col2Value == null) col2Value = string.Emtpy;
if (col3Value == null) col3Value = string.Emtpy;
if (col4Value == null) col4Value = string.Emtpy;
exampleDataList.Add(new PersonalData {firstname = col1Value.ToString(),lastname = col2Value.ToString(), address=col3Value.ToString(), salary=col4Value.ToString() });