Ошибка при чтение данных из Excel (С#)
Если в excel-файле существуют пустые строки, то выдается ошибка
Наиболее подходящий перегруженный метод для "int.Parse(string)" имеет несколько недопустимых аргументов.
Свойство:
class Price
{
public double Num { get; set; }
public double Price { get; set; }
}
Код:
Excel.Application ObjWorkExcel = new Excel.Application();
Excel.Workbook ObjWorkBook = ObjWorkExcel.Workbooks.Open($"{filepath}");
Excel.Worksheet ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[2];
var lastCell = ObjWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);
for (int i = 1; i < lastCell.Row; i++)
for (int j = 1; j < lastCell.Column; j++)
Magazine.Add(new DataPrice{
Num = double .Parse(ObjWorkSheet.Cells[i + 1, j++].Text),
Price = double .Parse(ObjWorkSheet.Cells[i + 1, j].Text)
});
ObjWorkBook.Close(false, Type.Missing, Type.Missing);
ObjWorkExcel.Quit();
GC.Collect();
Ответы (2 шт):
Автор решения: Нетерпеливый игуан
→ Ссылка
for (int i = 1; i < lastCell.Row; i++)
for (int j = 1; j < lastCell.Column; j++)
if(!string.IsNullOrEmpty(ObjWorkSheet.Cells[i + 1, j].Text) && !string.IsNullOrEmpty(ObjWorkSheet.Cells[i + 1, j + 1].Text))
Magazine.Add(new DataPrice{
Num = double.Parse(ObjWorkSheet.Cells[i + 1, j++].Text),
Price = double.Parse(ObjWorkSheet.Cells[i + 1, j].Text)
});
Автор решения: Alexander Petrov
→ Ссылка
Попробуйте так.
var cells = ObjWorkSheet.Cells;
for (int i = 2; i < lastCell.Row; i++)
{
for (int j = 1; j < lastCell.Column; j++)
{
string num = cells[i, j++].Text;
string price = cells[i, j].Text;
Magazine.Add(new DataPrice
{
Num = string.IsNullOrEmpty(num) ? 0 : double.Parse(num),
Price = string.IsNullOrEmpty(price) ? 0 : double.Parse(price)
});
}
}
Ещё более правильный вариант от @aepot, с использованием TryParse, который защитит не только от пустых строк, но и от значений, не являющихся валидными числами double.
var cells = ObjWorkSheet.Cells;
for (int i = 2; i < lastCell.Row; i++)
{
for (int j = 1; j < lastCell.Column; j++)
{
Magazine.Add(new DataPrice
{
Num = double.TryParse(cells[i, j++].Text, out double num) ? num : 0,
Price = double.TryParse(cells[i, j].Text, out double price) ? price : 0
});
}
}