通过标题名称而不是列索引引用VSTO Excel ListObject的列

实际上,我可以使用下面的代码轻松读取VSTO中的ListObject的内容。

在这个例子中,我正在阅读给定工作表中的所有产品。 数据使用Excel Table进行编辑,该表转换为VSTO内的ListObject。 我使用VS2010和.NET 4.0以及Excel 2010。

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; } 

但有时用户想要添加另一行,甚至改变表格的列顺序。 所以我想知道是否有一个更好的方法来引用列名而不是列索引的每一行。

一个可接受的解决scheme将是这样的:

 var myValue = row.Range[1, "My Value"]; 

在此先感谢您的任何意见。

我刚碰到类似的问题。 以下是我所做的标题名称:

 private void listSPRData_BeforeDoubleClick(Range Target, ref bool Cancel) { foreach (Range c in Target.ListObject.HeaderRowRange.Cells) { // Do something... // "c.Value" contains the name of your header. // When you find your column, you can break to avoid unnecessary looping. } } 

希望这可以帮助!

 Sheet1.ListObjects("dataTable").DataBodyRange(2, "b").Value 

假设你的表名为dataTable,它有3列(a,b,c)和2行。
注意:我正在使用VBA。 我假设你可以在使用DataBodyRange时工作。

 var myValue = Sheet1.ListObjects("dataTable").DataBodyRange[1, "myColumnHeader"]; 

如何处理Sheet1.ListObjects(“dataTable”)。ListColumns [“ColumnName”]。Range [rowOfInterest]?

由于ListObject不提供该function,或者您可以使用Range.Find ..

 Range cellFind = Sheet1.Cells.Find(What: "Column your looking for", After: Type.Missing, LookIn: Excel.XlFindLookIn.xlValues, LookAt: Excel.XlLookAt.xlWhole, SearchOrder: Excel.XlSearchOrder.xlByColumns, SearchDirection: Excel.XlSearchDirection.xlNext, MatchCase: false, SearchFormat: false); if (cellFind != null) { int columnIndex = cellFind.Column; ... } 

可以直接按列名访问ListObject列。 @shahkalpesh和@gap是相近的,但ListObjects上的索引器成语(VBA,而不是c#)是不匹配的。 下面的示例构build一个简单的表,通过名称“ColName2”引用第二列,并修改第二列中的第一个数据单元;

 object[,] Data = new object[,] {{ "ColName1", "ColName2"}, { 11, 12 }, {21, 22 }}; Excel.Range tblRange = Globals.SParameters.Range["B20:C22"]; tblRange.Value = Data; Globals.SParameters.Controls.AddListObject(tblRange, "tblProdutos"); Globals.SParameters.ListObjects["tblProdutos"].ListColumns["ColName2"].DataBodyRange[1] = 55; 

请注意,您可以使用'DataBodyRange'或'Range'; “DataBodyRange”不包含通常合适的列标题。