Ссылка на столбцы VSTO Excel ListObject по имени заголовка вместо индекса столбца - PullRequest
2 голосов
/ 22 декабря 2011

На самом деле я легко могу прочитать содержимое ListObject в VSTO, используя следующий код.

В этом примере я читаю все продукты с данного листа.Данные редактируются с использованием таблицы Excel, которая преобразуется в объект ListObject внутри 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;
}

Но иногда пользователь хочет добавить еще одну строку или даже изменить порядок столбцов таблицы.Поэтому я хотел бы знать, есть ли лучший способ ссылаться на каждую строку по имени столбца вместо индекса столбца.

Приемлемым решением для этого будет что-то вроде этого:* Заранее спасибо за любые советы по этому вопросу.

Ответы [ 5 ]

2 голосов
/ 31 января 2012

Я только что столкнулся с подобной проблемой.Вот что я сделал, чтобы получить имена заголовков:

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

Надеюсь, это поможет!

1 голос
/ 22 декабря 2011
Sheet1.ListObjects("dataTable").DataBodyRange(2, "b").Value

Предполагается, что ваша таблица называется dataTable, которая имеет 3 столбца (a, b, c) и 2 строки.
Примечание. Я использую VBA.Я полагаю, что вы могли бы работать при использовании DataBodyRange.

var myValue = Sheet1.ListObjects("dataTable").DataBodyRange[1, "myColumnHeader"];
0 голосов
/ 28 октября 2016

Вы можете получать доступ к столбцам ListObject напрямую по имени столбца.@shahkalpesh и @gap близки, но идиома индексатора (VBA, а не c #) в объектах ListObjects не соответствует.В приведенном ниже примере создается простая таблица, которая ссылается на второй столбец по имени 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 илиСпектр';DataBodyRange исключает заголовок столбца, который обычно подходит.

0 голосов
/ 22 июня 2016

Поскольку 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;
   ...
}
0 голосов
/ 01 февраля 2013

Как насчет Sheet1.ListObjects ("dataTable"). ListColumns ["ColumnName"]. Range [rowOfInterest]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...