3

問題

SQL 2005 フィールドにバイナリ データとして保存されている「Excel ファイル」データを解析/アクセス/抽出する方法を教えてください。

(そのため、最終的にすべてのデータを他のテーブルの他のフィールドに格納できます。)

バックグラウンド

基本的に、当社の顧客はユーザーから大量の詳細データを要求しています。残念ながら、当社のお客様は、ユーザーにいかなる種類のデータベース エクスポートも要求できません。そのため、顧客は、ユーザーがデータを入力できるように何らかの UI を提供する必要があります。すべてのユーザーに受け入れられると顧客が判断した UI は、適度に堅牢な UI を備えているため、Excel でした。そのため、顧客はこのデータを解析してデータベースに自動的に保存する必要があります。

私たちは、ユーザーがこれを一度だけ実行してから、データベースのエクスポートを要求することを顧客に納得させようとしました! ただし、顧客はユーザーのデータベース エクスポートを要求することはできません。

  • 私たちの顧客は、Excel ファイルを解析するように私たちに要求しています
  • 顧客のユーザーは、すべての必要なデータを入力するための「最適な」ユーザー インターフェイスとして Excel を使用しています。
  • ユーザーには空白の Excel テンプレートが与えられ、入力する必要があります。
    • これらのテンプレートには、固定数の一意の名前のタブがあります
    • これらのテンプレートには、完了しなければならない多数の固定領域 (セル) があります。
    • これらのテンプレートには、ユーザーが同じフォーマットの行を最大数千行挿入する領域もあります
  • 完了すると、Excel ファイルは標準の html ファイルのアップロードによってユーザーから送信されます
  • お客様は、このファイルをそのまま SQL データベースに保存します

与えられた

  • 標準の Excel (「.xls」) ファイル (ネイティブ形式、コンマまたはタブで区切られていない)
  • ファイルはvarbinary(max)SQL 2005 フィールドにそのまま保存されます
  • Excel ファイルのデータは、行間で必ずしも「均一」であるとは限りません。つまり、1 つの列がすべて同じデータ型であると仮定することはできません (たとえば、行ヘッダー、列ヘッダー、空のセル、異なる「フォーマット」、 ...)

要件

  • 完全に SQL 2005 内のコード (ストアド プロシージャ、SSIS?)
  • 任意のワークシート (タブ) の値にアクセスできる
  • 任意のセルの値にアクセスできる (数式データや逆参照は不要)
  • セル値が行間で「均一」であると仮定してはなりません。つまり、1 つの列がすべて同じデータ型であると仮定することはできません (たとえば、行ヘッダー、列ヘッダー、空のセル、数式、異なる "フォーマット", ...)

環境設定

  • ファイルシステムへのアクセスなし (一時的な .xls ファイルの書き込みなし)
  • 定義された形式で値を取得します (たとえば、39876 のような生の数値ではなく、実際の日付値)
4

5 に答える 5

3

何でもできると思いますが、代償はあります。この特定のケースでは、価格が高すぎるようです。

テスト済みの解決策はありませんが、そのような問題を最初に試す方法を共有できます。

私の最初のアプローチは、SqlServer マシンに Excel をインストールし、いくつかのアセンブリをコーディングして、Excel API を使用して行のファイルを消費し、それらをアセンブリ プロシージャとして Sql サーバーにロードすることです。

私が言ったように、これは単なるアイデアであり、詳細はわかりませんが、ここにいる他の人が私のアイデアを補完または批判できると確信しています.

しかし、私の本当のアドバイスは、プロジェクト全体を再考することです. データベースのテーブルの行のセルに格納されているバイナリ ファイルの表形式のデータを読み取ることは意味がありません。

于 2008-09-17T03:40:48.500 に答える
2

これは「ここから始めない」というような質問のようです。

「Excelをサーバーにインストールしてコーディングを開始する」という答えが唯一の方法のように見えますが、最初に代替案を検討するだけの価値があります。それは、苦痛で、費用がかかり、時間がかかるでしょう。

間違った問題への答えである「要求」を見ていると強く感じます。

このニーズを生み出しているビジネス上の問題は何ですか?何がそれを推進しているのですか?歴史を探索するための可能な方法として、 5つのなぜを試してください。

于 2008-09-17T10:12:57.760 に答える
1

varbinary を Raw File Destination に書き込めますか? 次に、優先順位制約の次のステップへの入力として Excel ソースを使用します。

私はそれを試していませんが、それは私が試してみたいものです。

于 2009-01-08T20:07:53.263 に答える
1

まあ、セットアップ全体が少しねじれているようです:-)他の人がすでに指摘しているように。

要件とセットアップ全体を本当に変更できない場合: Aspose.CellsSyncfusion XlsIO、ネイティブ .NET コンポーネントなど、ネイティブ Excel (XLS) ファイルの読み取りと解釈を可能にするコンポーネントを検討してみてはいかがでしょうか。私は2つのどちらでもかなりそうです。バイナリExcelをMemoryStreamに読み込んでから、それをExcel読み取りコンポーネントの1つにフィードして、すぐに使用できるはずです。

したがって、少しの .NET 開発と SQL CLR があれば、これは実行可能になるはずです。これが最善の方法かどうかはわかりませんが、うまくいくはずです。

于 2009-02-18T17:06:52.613 に答える
1

データベース テーブル全体をスプレッドシート内に保存してから、単一のテーブルのフィールド内に保存しようとしているようです。最初にデータベース テーブルにデータを保存し、必要に応じて XLS としてエクスポートする方が簡単ではないでしょうか?

インスタンス Excel を開いて、Excel でワークシート参照を解決しない限り、それが実行可能かどうかはわかりません。

于 2008-09-17T03:21:04.133 に答える