1

私は .NET でこのコードを試しました -Excel ファイルを devxpress データグリッドにインポートするために - うまくいきましたが、今はデルファイで同じ仕事をする手順を作成する必要があります。私はデルファイについてあまり知らないので、それを行う方法についていくつかのアイデアが必要です。

   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 テーブルと相互運用するには、主に 3 つのオプションがあります

1) ソースは OLE DB を使用してデータに到達します。これには 3 つの主な欠点があります。

  • 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 (excel.exe サーバーを実行するのと同じように、COM または HTTP を介して制御される scalc.exe サーバーを実行する) を使用して Microsoft Office ファイルを読み書きすることもでき、一部の Web サーバーはそれを行います。しかし、そのアプローチが一般的であるとは思わなかった可能性があります。だからそれについて言及するだけです。


3) Excel ファイルを直接読み書きできる Delphi ネイティブ ライブラリがいくつかあります。

  • それがおそらく最速の方法なので、大量のデータがある場合はうまくいきます
  • 自分のプログラムを変更するのと同じように、いつでもライブラリを変更できます。
  • プログラムは自己完結型になります。Excel 自体も Excel OLE DB ドライバーもインストールする必要はありません。

でも

  • これらのライブラリは常に Excel に追いつくため、その機能のサブセットのみをサポートし、通常はかなり狭い機能のみをサポートします。
  • 偶数ファイル形式: XLS のみをサポートするライブラリもあれば、XML と XLSX のみをサポートするライブラリもあります。特に安いものや無料のもの。
  • これらのライブラリには、他のプログラムと同様にバグがあります。そして、「それがエクセルの仕組みだ」とは言えません。
于 2013-11-12T08:14:44.683 に答える