2

OLEDBConnection を使用してスプレッドシートの内容を読み取っている asp.net C# アプリケーションがあります。以下のコード行を使用して、Excel スプレッドシートから読み取ります。

 OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fullFilePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'");

私の列の1つには、さまざまな行に文字列、数値、日付などのさまざまな形式のデータがあります。これを実行すると、データ形式が異なると、Excelファイルからその値が読み取られません。ネットでよく検索したところ、接続文字列で IMEX の妥当性について言及する必要があることがわかりました。それを追加しましたが、肯定的な反応はありませんでした。

多くのことを調べた後、任意の組み込みの Excel ドライバーがシートの最初の 8 行をクエリし、(ユーザーの許可や知識なしに) どの種類の列であるかを判断し、そうでないものは無視することがわかりました。シートの後半でこのデータ型に適合します。

http://www.mattjwilson.com/blog/2009/02/13/microsoft-excel-drivers-and-imex/

とにかくこの問題を取り除くことはありますか?

4

4 に答える 4

2

JET エンジンの多くの楽しい機能の 1 つを実行しています。これは基本的に、単一の列の各行のすべてのデータをサンプリングし、データ形式を推測しようとします。コードを「そのまま動作」させたい場合は、これに役立つレジストリ設定があります。ただし、このレジストリ設定は、特定のインポートだけでなく、システム上のすべてのインポートでの JET の動作に影響することに注意してください。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
"ImportMixedTypes"="Text"
"TypeGuessRows"=dword:00000000

このレジストリ設定は、フォーマットを推測する前に列内のすべての行のフォーマットをチェックするように JET に指示します。混合コンテンツが見つかった場合は、行をテキストとしてインポートします。

デフォルトでは、JET は型推測時に最初の 25 行をテストします。

または、TypeGuessRows を 1 に変更すると、JET は型推測時にのみ最初の行をチェックします。つまり、最初の行が数値で 2 番目の行が文字列の場合、JET はすべての行が数値であると想定し、ADO.NET を使用してそれらを読み取ることはできません。

もう 1 つの注意点: レジストリを編集するときは注意してください。注意を怠ると、システムを非常に迅速に破壊できます。

于 2009-12-15T19:31:27.867 に答える
1

更新: Microsoft は、サーバーで Excel COM サービスを使用することを実際には推奨していないようです。それでも、多くの開発者は、非 .NET (私の雇用主が行っているように) と .NET (こちらを参照) 環境の両方で行っています。代替手段はコストがかかるためです。すべての問題は、大部分が解決可能です (大量のアプリケーションで発生する可能性のあるスケーラビリティとパフォーマンスの問題、場合によってはライセンスの問題は別として)。コストのかかる代替手段は、このようなサードパーティのソリューションを使用しています。

1 つの列に異なるデータ型のデータがある場合は、OleDbConnection を使用しないでください。たとえば、Excel COM/OLE API を使用して Excel からの読み取りを試みることができます (ここからコンパイルすると、エラーが含まれる可能性があります)。

次の参照をプロジェクトに含めます。

Microsoft Excel 10.0 オブジェクト ライブラリ

Microsoft Office 10.0 オブジェクト ライブラリ

名前空間 Excel を含めます。

  using Excel;
  ...
      Excel.ApplicationClass xl = new Excel.Application();
      xl.Visible = false;
      xl.UserControl = false;
      Excel.Workbook theWorkbook = xl.Workbooks.Open(
         fileName, 0, true, 5,
          "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false,
          0, true); 
     Excel.Sheets sheets = theWorkbook.Worksheets;
     Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_Item(1);
     System.Array myvalues;
     Excel.Range range = worksheet.get_Range("A1", "E1".ToString());
     myvalues = (System.Array)range.Cells.Value;

重要!使用したリソースを解放する必要があります。ここから:

// Need all following code to clean up and extingush all references!!!
theWorkbook.Close(null,null,null);
xl.Workbooks.Close();
xl.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (range);
System.Runtime.InteropServices.Marshal.ReleaseComObject (sheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject (xl);
System.Runtime.InteropServices.Marshal.ReleaseComObject (worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (theWorkbook);
worksheet=null;
sheets=null;
theWorkbook=null;
xl = null;
GC.Collect(); // force final cleanup!
于 2009-11-09T08:29:56.640 に答える
0

SpreadsheetGear for .NETは、Excelのワークブックの読み取り、書き込み、計算などを行うことができ、IWorksheetなどのAPIを使用して、任意のセルの基になるデータ(数値、テキスト、論理、エラー)または任意のセルのフォーマットされたテキストにアクセスできます。 Cells [rowIndex、colIndex].ValueまたはIWorksheet.Cells[rowIndex、colIndex].Text。各列/セルのデータの種類に基づく制限はありません。SpreadsheetGearは100%安全な.NETコード(COM相互運用機能、安全でないネイティブ呼び出しなどなし)であるため、他のオプションよりも展開が簡単です(特にサーバーシナリオで)。

ここでライブサンプルを確認し、ここから無料トライアルをダウンロードできます。

免責事項:私はSpreadsheetGearLLCを所有しています

于 2009-11-09T20:53:04.683 に答える