我得到的程序能够将CSV和Excel文件加载到datagridview中。 除CSV文件保留旧数据外,此方法都可以正常工作。
例如,CSV文件具有30个值。我将数据加载到datagridview中,并且工作正常。 我关闭该应用程序,然后编辑CSV文件,删除了26行。下次打开应用程序并加载文件时,即使该文件不再存在,它仍然具有30个值的版本。
为清楚起见,我在记事本中打开并编辑该文件,该文件可以按预期工作,但是即使在记事本中对其进行编辑后,我的Winform应用程序似乎仍可以加载以前的版本。即使我重命名该文件,它仍然会获取不应该再存在的数据。即使在完全重启PC之后,该文件仍会保留不应该存在的数据。 但是! 如果我将文件移动到另一个文件夹(添加新文件夹并将其放入其中),它确实会加载新数据...
编辑: 看来它实际上是在文件夹中加载所有CSV文件。 (包括旧版本)
什么会导致此问题?看到Excel文件没有遇到此问题。
使用的代码:
private void OpenExcel()
{
OpenFileDialog openFileDialog1 = new OpenFileDialog
{
InitialDirectory = @"C:\",
Title = "Browse Text Files",
CheckFileExists = true,
CheckPathExists = true,
DefaultExt = "txt",
FilterIndex = 2,
RestoreDirectory = true,
ReadOnlyChecked = true,
ShowReadOnly = true,
Filter = "Excel Worksheets|*.csv"
};
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileLocation = openFileDialog1.FileName;
GetExcelSheetNames(openFileDialog1.FileName);
MyConnection = new OleDbConnection(connString);
MyCommand = new OleDbDataAdapter("select * from [" + SheetName + "]", MyConnection);
MyCommand.TableMappings.Add("Table", "TestTable");
Datatable_Temp = new DataTable();
MyCommand.Fill(Datatable_Temp);
MyConnection.Close();
}
else
{
Canceled = true;
}
}
private string GetExcelSheetNames(string excelFile)
{
OleDbConnection objConn = null;
DataTable dt = null;
string CSVOrNot = excelFile.Substring(excelFile.Length - 3);
try
{
// Connection String.
if (CSVOrNot == "csv")
{
connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", Path.GetDirectoryName(excelFile));
}
else
{
connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + excelFile + ";Extended Properties=Excel 12.0;";
}
// Create connection object by using the preceding connection string.
objConn = new OleDbConnection(connString);
// Open connection with the database.
objConn.Open();
// Get the data table containg the schema guid.
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (dt == null)
{
MessageBox.Show("No Data Found");
return null;
}
SheetName = dt.Rows[0]["TABLE_NAME"].ToString();
return SheetName;
}
catch
{
return null;
}
finally
{
// Clean up.
if (objConn != null)
{
objConn.Close();
objConn.Dispose();
}
if (dt != null)
{
dt.Dispose();
}
}
}
答案 0 :(得分:1)
我发现了问题,那与我想的不同。 看到该文件的较旧版本也位于该文件夹中,我没有注意到它并没有采用其本身的较旧版本,而只是将所有CSV文件合并到输出中。
我搜索了此内容,并发现了以下信息: c# reading csv file gives not a valid path
我添加了一个if子句以查看该文件是否为csv文件,然后使用以下命令: 因为打开Excel或CSV文件之间的区别是Excel文件要求输入路径和文件名,而CSV仅需要路径,后来又在查询中选择了文件...有点奇怪,但可以。
MyCommand = new OleDbDataAdapter("SELECT * FROM [" + Path.GetFileName(openFileDialog1.FileName) + "]", MyConnection);