>实际上,我可以使用以下代码轻松读取VSTO中ListObject的内容。
在此示例中,我正在读取给定工作表中的所有产品。数据使用 Excel 表进行编辑,该表转换为 VSTO 中的列表对象。我正在使用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;
}
但有时用户希望添加另一行,甚至更改表的列顺序。所以我想知道是否有更好的方法来按列名而不是列索引引用每一行。
一个可接受的解决方案是这样的:
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"];
How how of Sheet1.ListObjects("dataTable"(.列表列["列名称"]。范围[兴趣行]?
由于 ListObject 不提供该功能,或者您可以使用 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;
...
}
您可以按列名直接访问列表对象列。 @shahkalpesh和@gap很接近,但 ListObjects 上的索引器习惯用法(VBA,而不是 c#(不匹配。下面的示例构建一个简单的表,按其名称"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"不包括列标题,这通常是合适的。