【问题标题】:importing an excel file to datagrid on delphi在delphi上将excel文件导入datagrid
【发布时间】:2013-11-12 07:47:37
【问题描述】:

我已经在 .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;
    } 

【问题讨论】:

    标签: excel delphi datagrid devexpress


    【解决方案1】:

    您可以通过三个主要选项与 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
    • Microsoft 有很多关于该 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 就是这样工作的”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多