17

c# を使用して、asp.net にアップロードされた Excel ファイル (xlsx) を解析しています。次のコードを使用しています(簡略化):

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connString);
DataSet ds = new DataSet();
adapter.Fill(ds);
adapter.Dispose();
DataTable dt = ds.Tables[0];
var rows = from p in dt.AsEnumerable() select new { desc = p[2] };

これは完全に機能します、セル内に 255 文字を超えるものがあると、途切れてしまいます。私が間違っていることは何ですか?ありがとうございました。

編集: Excel シートを表示すると、255 文字をはるかに超える文字が表示されるため、シート自体が制限されているとは思いません。

4

6 に答える 6

19

ソリューション!

今日もこれと戦ってきました。Excelスプレッドシートを解析する前に、いくつかのレジストリキーを変更することで、ようやく機能するようになりました.

Excel スプレッドシートを解析する前に、次のレジストリ キーを更新する必要があります。

// Excel 2010
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\
or
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\

// Excel 2007
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\

// Excel 2003
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\

このキーの下にあるとに変更TypeGuessRowsします。また、接続文字列を更新して、拡張プロパティに含める必要があります。0ImportMixedTypesTextIMEX=1

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";");

参考文献

http://blogs.vertigo.com/personal/aanttila/Blog/archive/2008/03/28/excel-and-csv-reference.aspx

http://msdn.microsoft.com/en-us/library/ms141683.aspx

...文字が切り捨てられる場合があります。切り捨てなしでメモ列からデータをインポートするには、サンプリングされた行の少なくとも 1 つのメモ列に 255 文字を超える値が含まれていることを確認するか、ドライバーによってサンプリングされた行の数を増やしてそのような値を含める必要があります。行。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel レジストリ キーの下にある TypeGuessRows の値を増やすことで、サンプリングされる行数を増やすことができます....

于 2010-09-27T17:41:37.067 に答える
1

スプレッドシート内で列のデータ型をテキストに設定しようとしましたか? これを行うと、セルに 255 文字をはるかに超える文字を含めることができると思います。

[編集] MS-Excel チームとの対話は興味深いものです。下部のコメント セクションでは、255 カットオフについての議論が行われています。彼らは、Excel 12 はセルあたり 32,000 文字をサポートできると言っています。

それが本当なら、このデータを取得する方法があるに違いありません。考慮すべき点が 2 つあります。

  1. 過去に、接続文字列で「IMEX=1」オプションを使用して、空として表示される混合データを含む列を処理しました。それはロングショットですが、試してみてください。

  2. ファイルをタブ区切りのフラット ファイルにエクスポートできますか? Excelには非常に多くの落とし穴があるため、これはExcelデータを処理する最も信頼できる方法です。

于 2009-05-29T15:06:15.797 に答える
0

.NET 用の SpreadsheetGear は、 xls および xlsx ワークブック (およびそれ以上) の読み取りと書き込みが可能で、テキスト用の Excel と同じ制限をサポートします。つまり、そのまま機能します。試してみたい場合は、無料の評価があります。

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

于 2009-05-29T16:35:29.110 に答える
0

件名を簡単にグーグル検索したところ、それが Excel の限界のようです。

EDIT可能な回避策(残念ながらVBで)

于 2009-05-29T15:02:15.367 に答える
0

前回の投稿に関しては、SpreadsheetGear も使用していますが、古い XLS (XLSX ではない) 形式から読み取る場合、1 セルあたり 255 文字の制限にも悩まされていることがわかりました。

于 2010-09-03T15:40:56.993 に答える