我有課
public class ImportAdditionalService
{
public string ServiceName { get; set; }
public decimal? Price { get; set; }
}
我需要根據Excel中的這個類從兩列中獲取資料,但是我的方法使用泛型發生例外我突出顯示了注釋“問題”方法代碼:
public List<T> GetData<T>(ImportExcelArguments importExcel, out string dataReadingError) where T : new()
{
string guid = importExcel.Guid;
ImportExcelSettings importExcelSettings = importExcel.ImportExcelSettings;
StringBuilder log = new StringBuilder();
List<T> result = new List<T>();
var info = _pendingFileProvider.GetPendingFile(guid);
var fileStream = GetFile(info.FileGuid);
var excelLineNumberProperty = typeof(T).GetProperty("ExcelLineNumber");
IXLWorkbook workbook = new XLWorkbook(fileStream);
IXLWorksheet worksheet = workbook.Worksheets.Worksheet(1);
int maxColumn = worksheet.RangeUsed().LastColumn().RangeAddress.LastAddress.ColumnNumber;
var col = worksheet.RangeUsed().Columns();
var x = 0;
var k = 0;
var u = 0;
var listInd = new List<int>();
for (var i = 1; i <= col.Count(); i )
{
IXLCell cell = worksheet.Cell(row: 1, column: i);
if (cell.Value.ToString().Trim().Length == 0)
{
u ;
continue;
}
else
{
x ;
}
if (x == importExcelSettings.Columns[k].Number)
{
listInd.Add(x u);
k ;
if (k == importExcelSettings.Columns.Count)
break;
}
}
for (int i = importExcelSettings.StartRow; i <= importExcelSettings.EndRow; i )
{
var row = new T();
if (excelLineNumberProperty != null)
{
excelLineNumberProperty.SetValue(row, i);
}
var indx = 0;
foreach (var column in importExcelSettings.Columns)
{
PropertyInfo property = row.GetType().GetProperty(column.Caption);
var range = worksheet.Cell(i, listInd[indx]);
if (range != null)
{
continue;
}
//PROBLEB
var value = Convert.ChangeType(range.Value, property.PropertyType, CultureInfo.InvariantCulture);
property.SetValue(row, value);
indx ;
}
if (row is IRawRowDataContainer)
{
var container = row as IRawRowDataContainer;
for (int j = Math.Max(1, importExcelSettings.StartColumn); j <= importExcelSettings.EndColumn; j )
{
var cell = worksheet.Cell(i, j);
if (cell != null)
{
container.Add(Convert.ToString(cell));
}
else
{
var rangeMerg = cell.MergedRange();
string value = "";
if (rangeMerg != null)
{
var range = rangeMerg.RangeAddress;
value = Convert.ToString(worksheet.Cell(range.FirstAddress).Value);
}
container.Add(value);
}
}
}
result.Add(row);
}
dataReadingError = log.ToString();
return result;
}
錯誤:System.InvalidCastException:“從 'System.Double' 到 'System.Nullable'1 [[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 的無效轉換。”
uj5u.com熱心網友回復:
該Convert.ChangeType方法不適用于可為空的值型別。您將需要特定的代碼來處理這些型別 - 例如:
private static object ChangeType(object value, Type targetType)
{
Type underlyingType = Nullable.GetUnderlyingType(targetType);
if (underlyingType != null)
{
if (value == null) return null;
targetType = underlyingType;
}
return Convert.ChangeType(value, targetType, CultureInfo.InvariantCulture);
}
用法:
var value = ChangeType(range.Value, property.PropertyType);
property.SetValue(row, value);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/420914.html
標籤:
下一篇:.Net6System.IO.Compression問題是否有任何解決方法。DeflateStream.Read方法在.Net6中作業不正確,但在舊版本中作業正常
