将具有混合数据的列转换为字符串
Convert column with mixed data to string
我有一个包含 1 列的 excel 文件,该列包含混合数据、整数和字符串。
从 excel 文件中读取数据后,我看到包含数据 AZ-965 的单元格为空。
这是我的字符串连接
return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
+ excel + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0;';");
这就是我从 Excel 文件中读取数据的方式
private static List<T> GetImportedData<T>(string sheet, OleDbConnection myConnection,
List<string> column, ImportDataView<T> view) where T : IImportableData
{
var cols = string.Join( ",", column.Select(Cast));
var formattableString = $"select {cols} from [{sheet}$]";
using (var MyCommand = new
OleDbDataAdapter(formattableString, myConnection))
{
using (var DtSet = new DataSet())
{
int nbRow = 0;
MyCommand.Fill(DtSet);
var dt = DtSet.Tables[0];
var rows = dt.AsEnumerable();
var convertedList = rows
//.AsParallel()
.Select(x => GenerateImport<T>(x, column, ref nbRow, view))
.ToList();
return convertedList;
}
}
}
private static string Cast(string arg)
{
return $"IIf(IsNull([{arg}]), '', CStr([{arg}]))";
// return $"CStr([{arg}]) as {cleanName(arg)}";
//return $"[{arg}]";
}
我检查了这个link,但没有任何效果,同样的问题
您的连接字符串中的 TypeGuessRows 不是连接字符串 属性,至少我不知道。这是一个注册表项:
所以我认为它并没有像您认为的那样...或任何与此相关的事情。
如果您无法控制注册表或文件的内容,我唯一的建议是将连接字符串 (HDR=YES
) 中的 header 属性 更改为"no" 以便它以文本形式读取第一条记录...然后您可以有效地丢弃第一行。
这不是一个很好的解决方案,但它应该可以满足您的需求。
或者,您可以尝试使用 DbDataReader
而不是数据适配器来读取内容:
using (OleDbCommand cmd = new OleDbCommand(formattableString, conn))
{
using (OleDbDataReader reader = cmd.ExecuteReader())
{
string column = reader.IsDBNull(0) ? null : reader.GetValue(0).ToString();
}
}
根据我对您正在尝试做的事情的推断,数据 reader 实际上也可能提供一些其他优势。
我有一个包含 1 列的 excel 文件,该列包含混合数据、整数和字符串。
从 excel 文件中读取数据后,我看到包含数据 AZ-965 的单元格为空。
这是我的字符串连接
return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
+ excel + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0;';");
这就是我从 Excel 文件中读取数据的方式
private static List<T> GetImportedData<T>(string sheet, OleDbConnection myConnection,
List<string> column, ImportDataView<T> view) where T : IImportableData
{
var cols = string.Join( ",", column.Select(Cast));
var formattableString = $"select {cols} from [{sheet}$]";
using (var MyCommand = new
OleDbDataAdapter(formattableString, myConnection))
{
using (var DtSet = new DataSet())
{
int nbRow = 0;
MyCommand.Fill(DtSet);
var dt = DtSet.Tables[0];
var rows = dt.AsEnumerable();
var convertedList = rows
//.AsParallel()
.Select(x => GenerateImport<T>(x, column, ref nbRow, view))
.ToList();
return convertedList;
}
}
}
private static string Cast(string arg)
{
return $"IIf(IsNull([{arg}]), '', CStr([{arg}]))";
// return $"CStr([{arg}]) as {cleanName(arg)}";
//return $"[{arg}]";
}
我检查了这个link,但没有任何效果,同样的问题
您的连接字符串中的 TypeGuessRows 不是连接字符串 属性,至少我不知道。这是一个注册表项:
所以我认为它并没有像您认为的那样...或任何与此相关的事情。
如果您无法控制注册表或文件的内容,我唯一的建议是将连接字符串 (HDR=YES
) 中的 header 属性 更改为"no" 以便它以文本形式读取第一条记录...然后您可以有效地丢弃第一行。
这不是一个很好的解决方案,但它应该可以满足您的需求。
或者,您可以尝试使用 DbDataReader
而不是数据适配器来读取内容:
using (OleDbCommand cmd = new OleDbCommand(formattableString, conn))
{
using (OleDbDataReader reader = cmd.ExecuteReader())
{
string column = reader.IsDBNull(0) ? null : reader.GetValue(0).ToString();
}
}
根据我对您正在尝试做的事情的推断,数据 reader 实际上也可能提供一些其他优势。