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

时间:2013-10-08 11:43:48

标签: c# excel import export

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

  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 来保存文件,而不是手动选择其中一个。

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

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? 

*导出文件是保存为.xls的生成的XML文件。 有什么办法可以在没有警告的情况下将其保存为.xls吗?我真的需要 control + s 来保存文件。

提前致谢。

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

2 个答案:

答案 0 :(得分:2)

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

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

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


  

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

更新:文档格式化为XML文件,我可以通过使用“XML Spreadsheet 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;
        }
    }
}

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

答案 1 :(得分:-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工作簿。