1

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

  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();
    }

但是,当我在不使用“另存为:2003 xls”或“另存为:xlsx”选项的情况下导入 xls 文件时。(所以当我保存我下载的文件时control + s它不起作用。)我最终得到了这个错误:

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

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

问题可能是我所做的导出*,因为当我在导出后手动打开文件时,我看到了这个窗口:

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 而不会发出警告?我真的需要control + s保存文件。

提前致谢。

简而言之:如何将我创建的 XML 文件保存为 XLS 而不会出现上面显示的错误。我不想使用外部库,除非没有它们真的不可能做到这一点。

4

2 回答 2

2

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

因此,您正在与一个选择了错误文件名的糟糕程序作斗争,该程序转换了 XML 文件。此类程序的可能格式选择是 .csv,逗号分隔值。Excel 知道如何阅读的格式。但是,您使用的 OleDb 提供程序并不那么聪明。它需要从连接字符串中知道真正的格式。

您确实需要知道文件实际包含的内容才能知道如何配置连接字符串。一个起点是查看文件的实际内容。使用十六进制查看器。如果您无法理解它,请发布屏幕截图。或者使用记事本,我的水晶球预测你会看到完全可读的文本。


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

更新:文档被格式化为 XML 文件,我可以通过使用“XML 电子表格 2003”格式保存电子表格来重现标题。预期的文件扩展名是.xml. OleDb 提供程序无法按原样读取文档,需要进行转换。您可以编写一个小的控制台模式应用程序来处理它。Project + Add Reference,COM选项卡,选择“Microsoft Excel xx Object Library”。使代码类似于这样:

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;
        }
    }
}

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

于 2014-01-11T11:29:54.543 回答
-1

将 97-03 Excel 文件(“.xls”)的代码替换为以下代码

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

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

于 2013-10-08T11:55:31.947 回答