将excel文件导入delphi上的datagrid

时间:2013-11-12 07:47:37

标签: excel delphi datagrid devexpress

我在.NET上尝试过这个代码 - 将excel文件导入到devxpress datagrid-它工作正常,但我必须创建一个在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;
    } 

1 个答案:

答案 0 :(得分: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
  • Microsoft有很多关于该API的文档
  • 对于大多数操作,您可以使用内置的Excel宏录制器来获取现成的程序,如何在Excel中执行某些操作
  • 通常Excel意味着最终权限是某些文件有效或无效。因此,您可以确保您的程序能够读取给定的任何文件。如果没有 - 你可以责怪Microsoft Excel,而不是你的程序。
  • 对于行,然后在单元格上进行循环,比掌握什么是SQL以及如何使用它更容易。

然而

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

同样,您有很多关于使用该组件的教程。您有很多关于使用Visual Basic来控制Excel的Microsoft教程

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

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


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

  • 这可能是最快的方式,所以当你有大量数据时它会摇摆不定
  • 你可以控制发生的事情 - 你可以随时更改图书馆而不是改变你自己的程序
  • 您的程序变得自包含 - 它既不需要Excel本身也不需要安装Excel OLE DB驱动程序。

然而

  • 这些图书馆总是追赶Excel,因此它们只支持其功能的子集,通常是一个相当狭窄的功能
  • 甚至文件格式:某些库仅支持XLS,有些只支持XML和XLSX。特别便宜或免费的。
  • 这些库,就像任何程序一样,都有它们的错误。你无法说“这就是Excel的工作方式。”