1

C# を使用して Excel ファイルを使用するのは初めての経験です。

デモとして、Excel ファイルに 1 行書き込んで動作しましたが、現在 DataTable のすべての行を挿入しようとしていますが、次のエラーが発生します。

"HRESULT: 0x800A03EC"

コードは次のとおりです。

for (int i = 0; i < table.Rows.Count; i++)
{
    xlWorkSheet.Cells[i, 1] = table.Rows[i]["Ref"].ToString();
    xlWorkSheet.Cells[i, 2] = table.Rows[i]["Name"].ToString();
}

どうすれば修正できますか教えてください。

4

3 に答える 3

1

Range.Value代わりに使用してください。Worksheet.Cellsプロパティは読み取り専用です:

for (int i = 0; i < table.Rows.Count; i++)
{
    xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString();
    xlWorkSheet.Cells[i, 2].Value = table.Rows[i]["Name"].ToString();
}
于 2012-07-20T00:35:09.143 に答える
1

DataTable の代わりに、すべての値をobject[,]

次に、それらを一気に割り当てることができます。

using (var targetRangeHeader = _excelApp.Range[TargetRangeTopAddress].WithComCleanup())
 using (var targetRangeFirstDataCell = targetRangeHeader.Resource.Offset[1, 0].WithComCleanup())
  using (var targetRange = targetRangeFirstDataCell.Resource.Resize[MyObjectArrayValues.Length, 1].WithComCleanup())
{
 targetRange.Resource.Value2 = MyObjectArrayValues;

http://jake.ginnivan.net/vsto-com-interop の使用

于 2012-07-20T01:26:05.017 に答える
0

2 次元オブジェクト配列を使用するという Jeremy Thompson の回答を心から支持します。パフォーマンスは桁違いに速くなります。私は、あなたが書いたコードが動かない理由 (そして、なぜ動くはずだと思ったのか) を説明するために書いています。

Visual Basic には、"Default" プロパティという概念があります。これを VBA で記述するときは、その概念を使用しています。

xlWorkSheet.Cells(i, 1) = someValue

Cells プロパティは Range オブジェクトを返します。VBA では、Set キーワードを使用していないため、この行はオブジェクトの値を再割り当てしていません (また、Set キーワードを追加した場合、オブジェクトの値を再割り当てできません。これは読み取り専用であるためです)。プロパティ、Ria が指摘するように)。

Set キーワードがないと、 によって返される Range オブジェクトの既定のプロパティに割り当てが行われCells(i, 1)ます。もちろん、既定のプロパティは Value プロパティです。つまり、上記の VBA サンプルは次と同等です。

Dim r As Range

Set r = xlWorkSheet.Cells(i, 1)
r.Value = someValue

もちろん、r変数をスキップすることもできます:

xlWorkSheet.Cells(i, 1).Value = someValue

現在、C# には既定のプロパティの概念がありません。したがって、このコードをショートカットの方法で記述することはできません。これにより、Ria の回答で提案されているコードにたどり着きます。

xlWorkSheet.Cells[i, 1].Value = someValue;

または、 の代わりに実際の値を使用someValue:

xlWorkSheet.Cells[i, 1].Value = table.Rows[i]["Ref"].ToString();

デフォルトのプロパティは、初心者がコードを書きやすく、コードを簡潔にするのに役立ちますが、初級者と上級者の間の人にとっては混乱を招くものでもあります。

于 2012-07-20T04:09:38.530 に答える