为什么此代码会在写入的两行之间插入一个空行(C# Excel Interop)?

Why does this code insert a blank row between two rows written (C# Excel Interop)?

在我的 C# (.NET 4.5) Windows Forms 应用程序中使用 Excel Interop,我像这样调整了 here 中的代码(删除了 Resharper 变灰的冗余内容,并且在 "missing" 参数之前添加 "Type."(并将其大小写更改为大写):

private void WriteListObjectTestSheet()
{
    _xlSheetPlatypus.Cells[5, 1] = "Apple";
    _xlSheetPlatypus.Cells[6, 1] = "Strawberry";
    _xlSheetPlatypus.Cells[7, 1] = "Cashew";
    _xlSheetPlatypus.Cells[8, 1] = "Kumquat";
    _xlSheetPlatypus.Cells[9, 1] = "Pomegranate";
    _xlSheetPlatypus.Cells[10, 1] = "Banana";
    _xlSheetPlatypus.Cells[11, 1] = "Pineapple";
    _xlSheetPlatypus.Cells[12, 1] = "Kiwi";
    _xlSheetPlatypus.Cells[13, 1] = "Huckleberry";
    _xlSheetPlatypus.Cells[14, 1] = "Gooseberry";

    Excel.ListObject fruitList =
        _xlSheetPlatypus.
            ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange,
                _xlSheetPlatypus.Range[
                    _xlSheetPlatypus.Cells[4, 1],
                    _xlSheetPlatypus.Cells[4, 1]], 
                Type.Missing, Excel.XlYesNoGuess.xlNo);
}

根据需要将 ListObject 添加到第 4 行第 1 列(或 "A"),并将 "fruits" 写入单元格,但不是从第 5 行开始(其中 "Apple" 应该是)但是在第 6 行,正如您在此处看到的(突出显示不需要的空白行):

它可能有(更多),但这可能至少是 ListObject 不知道要排序和过滤什么的部分原因,单击它时提供的选项证明了这一点如此处所示:

为什么添加了第 5 行空白,我该如何避免?

当您从范围创建 ListObject 并说 table 没有 header 时,它会将范围向下移动一行并添加一个 Column1 单元格。

在上面的代码中你说创建一个从 [4,1][4,1] 的 table 而你说 table 没有 headers,所以它创建一个包含一行的 table 并添加一个 Column1 header 并将所有内容向下移动 1 行。所以结果就是你对excel说的给你做的。

您可以通过指定正确的范围并说您有一个 header 来更正它。

在下面的代码中,我首先在 [4,1] 处添加一个 Header,然后添加水果,最后创建从 [4, 1][14, 1] 的列表,并说table 有 header。所以它保留了我的 header.

using XL = Microsoft.Office.Interop.Excel;

private void button1_Click(object sender, EventArgs e)
{
    XL.Application application = new XL.Application();
    application.Visible = true;
    XL.Workbook book = application.Workbooks.Add();
    XL.Worksheet sheet = (XL.Worksheet)book.Worksheets[1];
    sheet.Cells[4, 1] = "Header";
    sheet.Cells[5, 1] = "Apple";
    sheet.Cells[6, 1] = "Strawberry";
    sheet.Cells[7, 1] = "Cashew";
    sheet.Cells[8, 1] = "Kumquat";
    sheet.Cells[9, 1] = "Pomegranate";
    sheet.Cells[10, 1] = "Banana";
    sheet.Cells[11, 1] = "Pineapple";
    sheet.Cells[12, 1] = "Kiwi";
    sheet.Cells[13, 1] = "Huckleberry";
    sheet.Cells[14, 1] = "Gooseberry";

    XL.ListObject fruitList = 
        sheet.ListObjects.Add(XL.XlListObjectSourceType.xlSrcRange,
            sheet.Range[sheet.Cells[4, 1], sheet.Cells[14, 1]], 
                Type.Missing, XL.XlYesNoGuess.xlYes);
}