为什么xls在从代码中读取后打开?

我有parsingexcel文件的工具。 用户select要读取的xls / xlsx,然后我的工具在temp中用随机名称创build它的一个副本,然后真正parsing副本。 代码的相关部分:

string sourceFile = textBox1.Text; string fileName = System.IO.Path.GetRandomFileName(); string destFile = System.IO.Path.Combine(Path.GetTempPath(), fileName + ".xlsx"); System.IO.File.Copy(sourceFile, destFile, true); Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook excelBook = xlApp.Workbooks.Open(destFile); OleDbConnection cnn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + destFile + "; Extended Properties=Excel 12.0;"); string qText = @"select * from [sheet1$]"; OleDbCommand oconn = new OleDbCommand(qText, cnn); cnn.Open(); OleDbDataAdapter adp = new OleDbDataAdapter(oconn); DataTable dt = new DataTable(); adp.Fill(dt); cnn.Close(); 

然后我开始使用DataTable 。 如果原始源文件(不是副本)在Excel中打开,那么临时文件夹中的副本也将在Excel中打开。 这里来了最奇怪的东西。 如果在脚本运行期间它被closures,然后我只从Windows资源pipe理器打开原始的xls,则从temp复制再次打开。 而且,如果我运行这个脚本,例如10次(当原稿被closures时),当我打开它时,所有10个随机命名的副本随之一起打开。 我想这不是由于代码本身,而是一些窗口/办公室bug /function。 请指教。

这里有两行用于初始化并打开目标文件的副本

 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook excelBook = xlApp.Workbooks.Open(destFile); 

你应该删除它们。 与Excel文件的OleDb交互不需要Interop工作。

顺便说一下,在处理这些丑陋的Interop变量时,我使用一个简单的技巧来缩短这些名称

 using ExcelLib = Microsoft.Office.Interop.Excel; ..... ExcelLib.Application xlApp = new ExcelLib.Application();