C# 加载Excel文件时,如果列值同时包含数字和字符串,则无法读取整个Excel列值
我有5列Excel文件,如下图所示: 看看TentacCD列,项目代码可以是所有数字或与字符字母组合。我的问题是,当加载此Excel文件时,我可以获得除TentacCD之外的所有值,其中项目代码包含数字和字母。它将返回空值(无)。例如:TentacCD:3020M4370、3020H0002将不返回任何内容。其他的返回值正好,调试时请看结果图: 我发现,如果TentacD包含格式相同的项目代码,如:3020H00013020M00023020L00033020P00043020Q0005,。。。它将正确返回所有值。我找不到任何文件来解释为什么会发生这种错误。 这是我的密码:C# 加载Excel文件时,如果列值同时包含数字和字符串,则无法读取整个Excel列值,c#,oledb,excel-interop,C#,Oledb,Excel Interop,我有5列Excel文件,如下图所示: 看看TentacCD列,项目代码可以是所有数字或与字符字母组合。我的问题是,当加载此Excel文件时,我可以获得除TentacCD之外的所有值,其中项目代码包含数字和字母。它将返回空值(无)。例如:TentacCD:3020M4370、3020H0002将不返回任何内容。其他的返回值正好,调试时请看结果图: 我发现,如果TentacD包含格式相同的项目代码,如:3020H00013020M00023020L00033020P00043020Q0005,。
if (result == DialogResult.OK)
{
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.DisplayAlerts = false;
mWorkBook = oXL.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "", false, false, 0, true, false, false);
mWSheet1 = (Worksheet)mWorkBook.Worksheets["アソート表"];
OleDbConnection OleDbConn = new OleDbConnection(conString);
OleDbConn.Open();
string trim_sheet1 = "ABC";
dtExcelData.Columns.AddRange(new DataColumn[5]
{
new DataColumn("TentacCD", typeof(String)),
new DataColumn("サイズ", typeof(String)),
new DataColumn("カラー", typeof(String)),
new DataColumn("数量", typeof(Int32)),
new DataColumn("Key", typeof(String))
});
string sqlcmd = string.Format(@"select [TentacCD],[サイズ],[カラー],[数量],[Key] FROM [" + trim_sheet1 + "$A10:Q50]");
OleDbCommand comm = new OleDbCommand();
comm.Connection = OleDbConn;
comm.CommandType = CommandType.Text;
comm.CommandText = sqlcmd;
OleDbDataAdapter oda = new OleDbDataAdapter();
oda.SelectCommand = comm;
oda.Fill(dtExcelData);
mWorkBook.Close(Type.Missing);
mWSheet1 = null;
mWorkBook = null;
oXL.Quit();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
OleDbConn.Close();
}
return dtExcelData;
}
为什么在使用OleDb访问相同的(?)数据时,有互操作代码打开工作表?如果使用DataAdapter,为什么要手动构建DataTable?不要那样做。连接字符串不可见。拿着代码试试。一些信息可能也很有用。指定正在使用的提供程序和Excel文件的版本。因为此Excel文件包含5列以上,但我只获取5个特定列,所以我必须手动构建数据表。我使用Interop来获取工作表名称。Excel 2003(.xls)版本。正如我提到的,我可以得到除了这个TnetacCD列之外的所有值。看起来,如果它满足第一个值,那么剩余的也必须是整数,反之亦然。谢谢您的帮助不,您不需要互操作来读取工作表名称,也不需要构建数据表。要读取工作表名称,可以使用OleDb,例如,
string sheetName=[Connection].GetSchema(“Tables”).Rows[0][“TABLE_NAME”].ToString()代码>,其中行[0]
是第一页,行[1]
是第二页等。要读取列的范围,请指定一个范围,如$”中的从[{sheetName}$A10:E50]中选择*
。使用Microsoft.ACE.OLEDB.12.0
或Microsoft.ACE.OLEDB.16.0
提供程序。在连接中添加IMEX=1
,如我链接的代码所示。您还可以测试ImportMixedTypes=Text
和TypeGuessRows=1
最后两个扩展选择器可能只在更改对应的值正在为您的案例设置注册表值。请对此进行搜索。您可以从这里开始:。这并不意味着这是必需的。这只是一件很好的事情。为什么在使用OleDb访问同一工作表的同时,您有打开工作表的互操作代码(?)数据?如果使用DataAdapter,为什么要手动构建DataTable?不要这样做。连接字符串不可见。获取代码并尝试这样做。一些信息可能也很有用。指定正在使用的提供程序和Excel文件的版本。因为此Excel文件包含5列以上,但我只获取5个特定的columns,因此我必须手动构建数据表。我使用Interop获取工作表名称purpose.Excel2003(.xls)版本。正如我所提到的,我可以得到除此TnetacCD列之外的所有值。看起来如果它满足第一个值,那么剩余的值也必须是整数,反之亦然。感谢您的帮助不,您不需要互操作来读取工作表名称,也不需要构建数据表。要读取工作表名称,请使用OleDb,例如,string sheetName=[Connection].GetSchema(“Tables”).Rows[0][“TABLE_NAME”].ToString();
,其中Row[0]
是第一张表,Row[1]
是第二张表等。要读取列的范围,请指定一个范围,如$“从[{sheetName}$A10:E50]
中选择*”。使用Microsoft.ACE.OLEDB.12.0
或Microsoft.ACE.OLEDB.16.0
提供程序。在连接中添加IMEX=1
,如我链接的代码所示。您还可以测试ImportMixedTypes=Text
和TypeGuessRows=1
最后两个扩展选择器可能仅在您的案例中更改相应的注册表值。搜索一下。您可以从这里开始:。这并不意味着这是必要的。知道这件事很好。