は編集:グレート、私はちょうど私があなたの大きな部分を逃したことに気づきました質問を受け取り、ワークシートに更新および削除を戻します。私はそれが可能かどうかは全く考えていませんが、私の解決策は役に立たないと思います。とにかくそれをここに残しておきます、多分それはどんな形であれ助けてくれるかもしれません。
なぜVSTOが必要ですか?私の知る限り、VSTOはOfficeアドインに使用されています。しかし、DataGridViewにデータを表示したいので、私は、ワークブックにアクセスするだけのWinFormsアプリケーションがあると仮定します。この場合、Office Interopを使用してブックを開くことができます。 Microsoft.Office.Interop.Excelへの参照をプロジェクトに追加し、using Microsoft.Office.Interop.Excel;
ステートメントを追加するだけです。エクセル相互運用のための
MSDNのリファレンスドキュメントは、ここで見つけることができます:http://msdn.microsoft.com/en-us/library/ms262200%28v=office.14%29.aspx
私は多分他の誰かが残りを行うことができます、あなたにExcelの一部を与えるでしょう。
まず、オープンExcelとワークブック:
Application app = new Application();
// Optional, but recommended if the user shouldn't see Excel.
app.Visible = false;
app.ScreenUpdating = false;
// AddToMru parameter is optional, but recommended in automation scenarios.
Workbook workbook = app.Workbooks.Open(filepath, AddToMru: false);
はその後何とか正しいワークシートを取得します。いくつかの可能性があります:
// Active sheet (should be the one which was active the last time the workbook was saved).
Worksheet sheet = workbook.ActiveSheet;
// First sheet (notice that the first is actually 1 and not 0).
Worksheet sheet = workbook.Worksheets[1];
// Specific sheet.
// Caution: Default sheet names differ for different localized versions of Excel.
Worksheet sheet = workbook.Worksheets["Sheet1"];
次に正しい範囲を取得してください。あなたは、必要なデータがどこにあるかをどのように知っているかを指定しなかったので、固定列にあると仮定します。
// If you also know the row count.
Range range = sheet.Range["A1", "D20"];
// If you want to get all rows until the last one that has some data.
Range lastUsedCell = sheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell);
string columnName = "D" + lastUsedCell.Row;
Range range = sheet.Range["A1", columnName];
値を取得します:2次元オブジェクト配列は、その後、あなたのDataGridViewのデータソースとして使用することができることを
// Possible types of the return value:
// If a single cell is in the range: Different types depending on the cell content
// (string, DateTime, double, ...)
// If multiple cells are in the range: Two dimensional array that exactly represents
// the range from Excel and also has different types in its elements depending on the
// value of the Excel cell (should always be that one in your case)
object[,] values = range.Value;
。私はWinFormsを何年も使用していないので、直接バインドできるかどうか、またはデータを特定の形式にする必要があるかどうかはわかりません。
最後に近いExcelが再び:あなたがCOMオブジェクトへのすべての参照が解放されていることを確認する必要があるため正しく相互運用機能を使用した後、Excelを閉じ
workbook.Close(SaveChanges: false);
workbook = null;
app.Quit();
app = null;
// Yes, we really want to call those two methods twice to make sure all
// COM objects AND all RCWs are collected.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
は、タスクそのものです。私がこれを行う最も簡単な方法は、別々の方法でExcelとブック(最初と最後のコードブロック)を開いて閉じることを除いてすべての作業を行うことです。これにより、Quit
が呼び出されたときに、そのメソッドで使用されているすべてのCOMオブジェクトが有効範囲外になります。
あなたはこれを見ましたか? http://stackoverflow.com/questions/15828/reading-excel-files-from-c-sharp – juanvan
これは私の質問ではっきりとわかりません。私はExcel Workbookを自分のプロジェクトとして取り組んでいます。だから私はExcel *内のデータ*を読み込もうとしています。私はある時点でListObjectの例が必要だと思っていますが、私は肯定的ではありません。 –
概念的には、VSTOを使用すると、Excelプロセス内で実行されているマネージコードからExcelオブジェクトモデルにアクセスできます。したがって、VSTOではなくExcelオブジェクトモデルを検索する必要があります。ほとんどの例はVBAにありますが、管理対象のC#に移植するのは簡単です。あなたはListObjectがおそらく一番簡単な方法だと思います。 – Joe