2017-05-17 4 views
-1

ODBCを使用してC#からxls/xlsxファイルを作成します(Provider=Microsoft.ACE.OLEDB.12.0)。結果テーブルには4行(たとえば)があります。 Excelでファイルを開き、5行目を追加してファイルを保存します。 ODBC経由でC#からで読み込もうとすると、5行目がなくても元の4行しか得られません。 ODBCはXLSファイルのどこかに行数を格納し、後でExcelやLibreOfficeから入力した新しいデータを使わずに読み込みます。これは既知の問題ですか?それを解決できますか? Excelで新しいスプレッドシートを作成すると、その行はすべてC#で読み込まれます。ODBCドライバがExcelで追加された行を読み取ることができません

EDIT:役に立つ情報が見つかりました。 XLSファイルがC#/ ODBCから最初に作成されるとき、2つのテーブル(シート)があります。テーブル名がTABLEの場合、DataTable sheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)にはsheets.Rows[0] == "TABLE"とsheets.Rows[1] == "TABLE $"が含まれます。 Excelは1枚の "TABLE"シートのみを表示します。編集後、変更内容(5行目)は "TABLE $"シートのみに存在します。

+0

スプレッドシートの特定の行の値をチェックすると、不要な余分な文字が保存されないことがあります。 –

+0

コードが表示されないと、手助けが困難になります。 ODBC接続でリフレッシュを実行しますか:https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.odbcconnection.refresh.aspx – PaulF

答えて

-1

問題が見つかりました。 Excelで作成された内部スプレッドシート名の最後に「$」記号があるようです。 ODBCによって生成されたシート名は、CREATE TABLEで指定された正確な文字列です。一方、Excel(およびLibreOffice)では、TABLETABLE$シートの両方に1枚のシートしか表示されません。 Excelで表を編集した場合、保存後に変更はTABLE$にしかありません。他のシートTABLEは変更されていません。私がSELECT * FROM [TABLE]を実行すると、結果はExcelの変更なしでオリジナルのODBC生成テーブルから得られます。今すぐXLSファイル内の利用可能なシートを列挙し、最初のシート名が "$"で終わらずシートが1より大きい場合、最初のシート名に "$"を追加して正しいテーブルを開きます。私は、ODBC接続文字列に "$" - 終了テーブルを扱うオプションを含めることができると思います...

0

もしそうなら、5行目を追加していますか?そうであれば、使用しているコード行を共有してください。あなたのコードに次のような問題があるかもしれません。

  1. コミットは正しく行われません。
  2. ファイル接続の読み込み前に更新が行われていません。
+0

5行目がExcelで追加されています(C#ではなく) 。その後、ODBCを使用しているC#は最初の4行だけを読み込みます。私はODBCがキャッシュ機能を持っているが、キャッシュがHDD /一時ファイルにあるのか、何とかXLSファイルにあるのかどうかはわかりません。 C#から格納されたすべての行は、C#で読み取られます。 – i486

関連する問題