【问题标题】:Export and Import .xls(x) in C# - table error在 C# 中导出和导入 .xls(x) - 表错误
【发布时间】:2013-10-15 07:48:07
【问题描述】:

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

  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 而不会出现上面显示的错误。 我不想使用外部库,除非没有它们真的不可能做到这一点。

【问题讨论】:

  • 您能提供一个示例文件吗?在您使用连接字符串打开文件的位置发布代码也可能会有所帮助。

标签: c# excel import export


【解决方案1】:

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

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

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


开头是:<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>

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

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

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

【讨论】:

  • 我之前确实使用过 CSV,但不知何故应该可以将文件更新为“真实”文件,对吧?像“另存为”一样吗?
  • 从 CSV 转换为 XLS 需要使用 Excel。当然,这是可能的,您可以使用 Microsoft.Office.Interop.Excel 命名空间将其自动化。实际上没有必要,您的 OleDb 提供者知道如何read CSV as well。你只需要告诉它。那么,文件实际上包含什么?您是否尝试在记事本中打开它?它看起来像什么?
  • 它以:"w3.org/TR/REC-html40"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">" 并保存的 .xls 显示带有 [NUL] 和 [ETX] 的黑色块或其中的 [DC4],例如。
【解决方案2】:

将 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 工作簿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 2012-03-23
    • 1970-01-01
    • 2017-11-07
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多