1

我已经在 .NET 上尝试过这段代码 - 将 excel 文件导入 devxpress datagrid - 它工作正常,但我现在必须创建一个在 delphi 上执行相同工作的程序。我对delphi不太了解,所以我需要一些想法如何做到这一点。

   public static DataTable ImportExcelXLS(string FileName, bool hasHeaders)
    {
        string HDR = hasHeaders ? "Yes" : "No";
        string strConn;
        if (FileName.Substring(FileName.LastIndexOf('.')).ToLower() == ".xlsx")
            strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
        else
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";

        //DataSet output = new DataSet();

        using (OleDbConnection conn = new OleDbConnection(strConn))
        {
            conn.Open();

                DataTable schemaTable = conn.GetOleDbSchemaTable(
                OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

            foreach (DataRow schemaRow in schemaTable.Rows)
            {
                string sheet = schemaRow["TABLE_NAME"].ToString();

                if (!sheet.EndsWith("_"))
                {
                    try
                    {

                        OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                        cmd.CommandType = CommandType.Text;

                        DataTable outputTable = new DataTable(sheet);

                        new OleDbDataAdapter(cmd).Fill(outputTable);

                        if (outputTable.Rows.Count > 0)
                        {
                            return outputTable;
                        }

                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message + string.Format("Sheet:{0}.File:F{1}", sheet, FileName), ex);
                    }
                }
            }
        }
        return null;
    } 
4

1 回答 1

3

您可以通过三个主要选项与 Microsoft Excel 表进行互操作

1)您的来源使用 OLE DB 来获取数据。这有三个主要的错误特征:

  • Microsoft ADO 已弃用,Delphi ADO 库漏洞百出。这些错误有解决方法,但您会花时间检测它们并学习这些技巧。
  • 这需要安装 Microsoft Excel,这不是免费程序
  • 电子表格不是表格数据,因此您只能以这种方式读取最简单的结构化数据。

但它既快速又方便,如果它有效的话。

您还可以阅读大量教程和操作方法。例如,使用 BabelFish 或 GoogleTranslate,您可以尝试http://devdelphi.ru/?p=63


2) 您可以使用正在运行的 Excel 应用程序作为 COM 服务器。您只需要将ExcelApplication组件放在表单上。请参见 c:\RAD Studio\9.0\OCX\Servers\

这可以说是使用 Excel 的最常用方法。它有几个优点:

  • COM 接口是 Excel 的自然 API,因此您可以访问它的大部分功能
  • 您可以在 Visual Basic 或 C++ 中获取任何代码示例并将其逐字翻译为 Delphi
  • 微软有很多关于该 API 的文档
  • 对于大多数操作,您可以使用内置的 Excel 宏记录器来获取现成的程序,如何在 Excel 中做某事
  • 通常 Excel 意味着最终权威是某些文件是否有效。因此,您可以确定您的程序能够读取给定的任何文件。如果不是 - 你可以责怪 Microsoft Excel,而不是你的程序。
  • 可以说,循环遍历行,然后遍历单元格,比掌握什么是 SQL 以及如何使用它更容易。

然而

  • 这需要安装 Microsoft Excel,这不是免费程序
  • 这很慢。甚至使用数组进行数据传输
  • 对于非英语语言环境,COM API 中存在未修复的错误
  • Delphi COM 实现中也存在一些错误。

同样,您有很多关于使用该组件的教程。而且你有很多关于使用 Visual Basic 控制 Excel 的微软教程

等等。如果你想改变你的方法 - 你会有很多信息

2.1) 也可以使用 OpenOffice.org(运行 scalc.exe 服务器,通过 COM 或 HTTP 控制,就像你运行 excel.exe 服务器一样)来读/写 Microsoft Office 文件,一些网络服务器可以做到这一点。但是,虽然我可能没有看到这种方法很受欢迎。所以只提一下。


3) 有一些 Delphi 原生库能够直接读/写 Excel 文件

  • 这可能是最快的方法,所以当你有大量数据时它会很震撼
  • 您可以控制发生的事情-您可以随时更改库,只要您更改自己的程序即可
  • 您的程序变得独立 - 它既不需要 Excel 本身,也不需要安装 Excel OLE DB 驱动程序。

然而

  • 这些库总是在追赶 Excel,因此它们只支持其功能的子集,而且通常是一个相当狭窄的功能
  • 甚至文件格式:有些库仅支持 XLS,有些库仅支持 XML 和 XLSX。特别是便宜或免费的。
  • 就像任何程序一样,这些库也有它们的错误。你也不能说“这就是 Excel 的工作原理”。
于 2013-11-12T08:14:44.683 回答