では、Excelの相互運用ライブラリを使用してセルの値を設定しようとしています。私は以下でそれを行うことができます:
sheet.Cells[row, col] = value;
設定している数が非常に遅いです。だから私はこのルートに行こうとしています:
Range excelRange = sheet.UsedRange;
excelRange.Cells.set_Item(row, col, value);
コードは実行されますが、データはセルに入力されません。私が欠けているものについて何か提案はありますか?ありがとう!
最初の方法は、画面の更新を無効にした場合(Application.ScreenUpdating = false
)。 ナレッジベース記事 は、C#アクセスを使用して行と列ごとにセルを設定する方法も説明しています。
配列を繰り返し処理して一度に1つのセルを設定するのではなく、すべての値を一度に設定してみましたか?そうすれば、セルごとに1回ではなく、COM境界を介してデータを渡すだけで済みます。
Excelはこの点で非常に柔軟です。以下を試してください:
int[] intArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range rng = excelApp.get_Range("A1", "J1");
rng.Value = intArray;
これは、設定したい各セルを繰り返すよりも速くする必要があります。
それ以外は、Andyの提案に従ってScreenUpdatedをオフにし、コピープロセスが完了するまで計算を手動に設定することも検討してください。
簡単な解決策ですが、ここではnugetコンソールに書き込むことでパッケージMicrosoft.Office.Interop.Excelをインストールする必要があります
インストールパッケージMicrosoft.Office.Interop.Excel
//test Excel file
Microsoft.Office.Interop.Excel.Application Excel = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = Excel.Workbooks.Open(System.Windows.Forms.Application.StartupPath + "/TrainedFaces/AttendanceLog.xlsx", ReadOnly: false, Editable: true);
Worksheet worksheet = workbook.Worksheets.Item[1] as Worksheet;
if (worksheet == null)
return;
var abc = worksheet.Cells[2, 1].Value;
Range row1 = worksheet.Rows.Cells[1, 1];
Range row2 = worksheet.Rows.Cells[2, 1];
row1.Value = "Test100";
row2.Value = "Test200";
Excel.Application.ActiveWorkbook.Save();
Excel.Application.Quit();
Excel.Quit();