为什么xls在/在从代码中读取它之后打开

本文关键字:之后 读取 代码 xls 为什么 | 更新日期: 2023-09-27 17:51:11

我有分析excel文件的工具。用户选择要读取的xls/xlsx文件,然后我的工具在临时文件中创建一个随机名称的副本,然后实际解析该副本。代码的相关部分:

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中打开。最奇怪的事情来了。如果它在脚本运行期间被关闭,然后我只从windows资源管理器打开原始的xls,那么从temp的副本将再次打开。此外,如果我运行脚本例如10次(而原始是关闭的),当我打开它时,所有10个随机命名的副本都会随之打开。我想这不是代码本身的问题,而是一些windows/office的bug/功能。请建议。

为什么xls在/在从代码中读取它之后打开

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

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

你应该去掉它们。OleDb与Excel文件的交互不需要Interop才能工作。

顺便说一下,在处理这些难看的互操作变量时,我使用了一个简单的技巧来缩短这些名称
using ExcelLib = Microsoft.Office.Interop.Excel;
.....
ExcelLib.Application xlApp = new ExcelLib.Application();