【发布时间】:2021-10-21 06:07:27
【问题描述】:
我正在编写一个使用“Excel Sheets”的程序。
我正在通过按钮将它们加载到 DataGridView 中。如果我完成了 Sheet 的工作,我可以按相同的按钮加载另一个 Sheet。问题是即使我正在清除和刷新我的 DataGridView,旧的 Sheet 并没有消失,而新的 Sheet 只是添加到了旧的。这是为什么呢?
按钮点击事件的代码:
private void button1_Click(object sender, EventArgs e)
{
//Excell Prozess kill (wenn "Datei öffnen" geklickt)
Process[] excelProcs = Process.GetProcessesByName("EXCEL");
foreach (Process proc in excelProcs)
{
proc.Kill();
}
//Preparing Excel
Excel.Workbook theWorkbook = null;
Excel.Application ExcelObj = null;
Excel.Sheets sheets = null;
Excel.Worksheet worksheet = null;
if (dataGridView1.DataSource != null)
{
dataGridView1.DataSource = null;
dataGridView1.Refresh();
}
else
{
dataGridView1.Columns.Clear();
}
//Deklaration
string filePath = string.Empty;
string fileExt = string.Empty;
//File dialog
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Excel Datei (*.xlsx *.xls)|*.xlsx; *.xls; |All Files (*.*)|*.*";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
filePath = dialog.FileName; //get the path of the file
fileExt = Path.GetExtension(filePath); //get the extension from the file
//File Path zeigen
label1.Text = filePath;
//Nur .xls und .xlsx
if (fileExt.CompareTo(".xls") == 0 || fileExt.CompareTo(".xlsx") == 0)
{
try
{
ExcelObj = new Excel.Application();
//open ExcelObj and load it into theWorkbook
theWorkbook = ExcelObj.Workbooks.Open(filePath);
sheets = theWorkbook.Worksheets;
//Get the reference of second worksheet
worksheet = (Excel.Worksheet)sheets.get_Item(1);
//Get the name of worksheet
string strWorksheetName = worksheet.Name;
//string for database con
String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
filePath
+ ";Extended Properties='Excel 12.0 XML;HDR=NO;';";
OleDbConnection con = new OleDbConnection(constr);
//select sheet from excel file
OleDbCommand oconn = new OleDbCommand("Select * From [" + strWorksheetName + "$]", con);
//open db
con.Open();
OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
sda.Fill(data);
//insert data into datagridview
dataGridView1.DataSource = data;
//Select all from table date
DataRow[] rows = data.Select();
//close db
con.Close();
//close ExcelObj
ExcelObj.Quit();
}
//if error -> show
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
//ComObject release
if (sheets != null) Marshal.ReleaseComObject(sheets);
if (ExcelObj != null) Marshal.ReleaseComObject(ExcelObj);
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (theWorkbook != null) Marshal.ReleaseComObject(theWorkbook);
}
我认为问题是由于 “Excel 文件” 没有在 “准备 Excel” 部分中正确释放,但 “Excel” 在许多情况下通过“Excel Prozess Kill”代码关闭。我通过任务管理器看了几次。那么是什么导致了问题呢?有什么意见吗?
【问题讨论】:
-
填充sda的对象“数据”是什么
-
查看数据,ToList()
-
Excel 互操作 ????
标签: c# excel button datagridview