実際には、次のコードを使用してVSTOのListObjectの内容を簡単に読み取ることができます。参照VSTO Excel ListObjectの列を列のインデックスではなくヘッダー名
この例では、特定のシートからすべての製品を読み込んでいます。データは、VSTO内のListObjectに変換されるExcelテーブルを使用して編集されます。私は
private IEnumerable<Produto> ReadFromWorksheet()
{
var produtosLidos = new List<Produto>();
try
{
foreach (Excel.ListRow row in Globals.Sheet1.tblProdutos.ListRows)
{
var id = RangeUtils.ToInt(row.Range[1, 1]) ?? -1;
var codigo = RangeUtils.ToString(row.Range[1, 2]);
var nome = RangeUtils.ToString(row.Range[1, 3]);
var qtdDisp = RangeUtils.ToDecimal(row.Range[1, 4]);
var unidMed = RangeUtils.ToString(row.Range[1, 5]);
var valor = RangeUtils.ToDecimal(row.Range[1, 6]);
if (string.IsNullOrEmpty(codigo) ||nome == null || qtdDisp == null || unidMed == null || valor == null)
throw new ApplicationException("Os campos Nome, Qtd. Disponível, Unid. de Medida e Valor são obrigatórios.");
var p = new Produto();
p.Id = id;
p.CodigoProduto = codigo;
p.Nome = nome;
p.QtdDisponivel = qtdDisp;
p.UnidadeMedida = unidMed;
p.Valor = valor;
p.DataUltimaAlteracao = DateTime.Now;
p.Acao = RangeUtils.ToString(row.Range[1, 8]);
p.Ativo = true;
produtosLidos.Add(p);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
return produtosLidos;
}
エクセル2010、また、.NET 4.0としてVS2010を使用しています。しかし、時にはユーザーが別の行を追加したり、テーブルの列の順序を変更できます望んでいます。ですから、列インデックスの代わりに列名で各行を参照する方が良いかどうかを知りたいと思います。この上の任意のアドバイスを事前に
var myValue = row.Range[1, "My Value"];
ありがとう:このため
受け入れ可能な解決策は、このようなものになるだろう。
こんにちは@shahkalpesh、私はこの技術を試して、それは動作しませんでした。 VSTOはこのような列へのアクセス方法を受け入れていないようです。例外は次のとおりです。型の不一致。 (HRESULTからの例外:0x80020005(DISP_E_TYPEMISMATCH))。私は次のコードで試しました:for(int i = 1; i <= Globals.Sheet1.tblProdutos.ListRows.Count; i ++) { var value = _tbl.DataBodyRange [1、 "Valor Previsto"]; Debug.WriteLine(value); } –
@MárioMeyrelles:テーブル名、シート名、列名を設定ごとに変更して、上記のVBAコードがあなたのケースで機能するかどうか試してみることはできますか? – shahkalpesh
こんにちは@shahkalpesh、私はVBAの内部でこのアプローチを試して、それは動作しませんでした。 Sub Button1_Click() 'うまく動作します。 Debug.Print Sheet6.ListObjects( "tblSaidas")。DataBodyRange(1、1)。値 が列である ' ます。Debug.Print Sheet6.ListObjects( "tblSaidas")。DataBodyRange(1、 "武勇Previstoを")は動作しません。値 End Subの –