在C#中导出和导入.xls(x) – 表错误

我正在使用这些连接string,具体取决于文件的扩展名:

public static string ExcelConnectionString(string filePath) { OleDbConnectionStringBuilder sbConnection = new OleDbConnectionStringBuilder(); String strExtendedProperties = String.Empty; sbConnection.DataSource = filePath; if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file { sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0"; strExtendedProperties = "Excel 8.0";//HDR=ColumnHeader,IMEX=InterMixed } else if (Path.GetExtension(filePath).Equals(".xlsx")) //for 2007 Excel file { sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0"; strExtendedProperties = "Excel 12.0"; } sbConnection.Add("Extended Properties", strExtendedProperties); return sbConnection.ToString(); } 

但是,导入xls文件时不使用“另存为:2003 xls”或“另存为:xlsx”选项。 (所以当我通过control + s保存我的下载文件时,它将无法工作。)我最终出现了这个错误:

用户代码未处理OleDbException – 外部表格不是预期的格式。

我怎样才能解决这个问题? 我的系统需要使用control + s来保存文件,而不是手动select其中的一个。

问题可能是导致我*,因为当我手动打开文件后,我看到这个窗口:

 The file you are trying to open "yourfile.xls" in a different format than specified file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now? 

*导出文件是一个生成的XML文件,保存为.xls。 有什么办法可以保存为.xls没有警告? 我真的需要控制+ s来保存文件。

提前致谢。

简而言之:如何将我创build的XML文件保存为XLS,而不会出现上面显示的错误。 我不想使用外部库,只有在没有这些库的情况下才真正做到这一点。

您有足够的证据certificate该文件实际上不是以本机Excel格式保存的电子表格文件。 换句话说,一个真正的 .xls或.xlsx文件。

所以你正在做一个糟糕的程序,只是select了错误的文件名,转换XML文件的程序的战斗。 逗号分隔值.csv,这样的程序可能的格式select。 Excel知道如何阅读的格式。 然而你使用的OleDb提供者并不是那么聪明。 它需要知道连接string的真实格式。

您确实需要知道文件实际包含的内容,才能知道如何configuration连接string。 一个起点是看文件的实际内容。 使用hex查看器。 如果你不能理解它,然后张贴截图。 或使用记事本,我的水晶球预测,你会看到完全可读的文字。


它始于: <?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>

更新:文档被格式化为XML文件,我可以通过使用“XML Spreadsheet 2003”格式保存电子表格来重新制作标题。 预期的文件扩展名是.xml 。 OleDb提供程序无法按原样读取文档,因此需要进行转换。 你可以写一个小小的控制台模式的应用程序来照顾它。 项目+添加引用,COM选项卡,select“Microsoft Excel xx对象库”。 使代码如下所示:

 using System; using Excel = Microsoft.Office.Interop.Excel; class Program { [STAThread] static int Main(string[] args) { var app = new Excel.Application(); try { if (args.Length != 2) throw new Exception("Usage: Convert inputfile outputfile"); var book = app.Workbooks.OpenXML(args[0]); System.IO.File.Delete(args[1]); book.SaveAs(args[1], FileFormat: Excel.XlFileFormat.xlExcel8); app.Quit(); return 0; } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); app.Quit(); return -1; } } } 

以防万一:确保您查看该转换器的输出文件 ,而不是input文件。

将您的97-03 Excel文件(“.xls”)的代码replace为以下内容

 sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0"; strExtendedProperties = "Excel 8.0";//HDR=ColumnHeader,IMEX=InterMixed 

此连接string用于使用Office 2007 OLEDB驱动程序(ACE 12.0)连接到较旧的97-2003 Excel工作簿。