ListObject在添加后包含额外的标题

时间:2017-04-26 22:54:49

标签: c# excel excel-vba vsto excel-addins vba

我在工作表上从D3单元格开始添加一个新的ListObject,然后创建列并用XMLMap绑定它们。这是我的代码:

            Excel.Worksheet sheet = _workbook.Sheets["Data1"];
            sheet.Activate();
            sheet.get_Range("D3").Select();

            var xmlMap = _workbook
                .XmlMaps
                .Add(collectionDatablock.GetSchema(), NetworkTree.RootName);
            xmlMap.Name = collectionDatablock.Name;

            var listObject = sheet
                .ListObjects
                .Cast<Excel.ListObject>()
                .SingleOrDefault(l => l.Name == "ListName");

            listObject?.Delete();
            listObject = sheet.ListObjects.Add();

            listObject.Name = "ListName";

            var column = listObject
                .ListColumns
                .Cast<Excel.ListColumn>()
                .First();

            SetColumn(column, xmlMap, "Col1", "/Root/Region/@UniqueName");
            var newColumn = listObject.ListColumns.Add();
            SetColumn(newColumn, xmlMap, f, solution, "Col2", "/Root/Region/@Code");

和SetColumn方法:

    private void SetColumn(Excel.ListColumn column, Excel.XmlMap map, string header, string path)
    {
        column.Name = GetColumnCaption(header);
        column.XPath.SetValue(map, path);
    }

此代码在空工作表上按预期工作但如果上表中有任何数据(例如D2单元格有值),则列表向上移动,D2成为表格的左上角!此外,如果D1,D2和E2单元具有值,则生成表的额外列,称为#34; Column2&#34;。似乎Excel尝试将表格上方范围内的所有数据包含到ListObject中。怎么预防呢?

2 个答案:

答案 0 :(得分:1)

事实证明,我必须指定指向相同范围的DestinationSource个参数。

var tableCell = sheet.get_Range("D3");
listObject = sheet.ListObjects.Add(SourceType: Excel.XlListObjectSourceType.xlSrcRange, Source: tableCell, Destination: tableCell, XlListObjectHasHeaders: Excel.XlYesNoGuess.xlNo);

答案 1 :(得分:0)

这里可能需要明确说明Source所在的位置,否则Excel将自己选择最近的单元格作为源。在以下代码中,Source设置为Range[D3]。希望这能正确使用您的xml数据。

Add方法有一些其他参数Destination,似乎用于指定表的左上角单元格,但我无法使其与source-Type {{1}一起使用}。

xlSrcXml