我有解析excel文件的工具。用户选择要读取xls / xlsx,然后我的工具使用随机名称在temp中创建它的副本,然后实际解析副本。代码的相关部分:
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 /功能。
请指教。
答案 0 :(得分:2)
这里有两行初始化和打开目标文件的副本
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工作。
顺便说一句,在使用这些丑陋的Interop变量时,我使用一个简单的技巧来缩短这些名称
using ExcelLib = Microsoft.Office.Interop.Excel;
.....
ExcelLib.Application xlApp = new ExcelLib.Application();