Excel 插入行(不是添加)

5
我有一个针对采购订单的Excel'07模板文件。在该模板中,只有3行可以用于项目,然后模板显示总计。
因此,在模板中它有: 第19行 - 项目 第20行 - 项目 第21行 - 项目 第22行 - 项目的总数
显然,大多数采购将有超过3个项目。那么我该如何在打印出3个项目后在第21行和第22行之间插入一行呢?
编辑:这是我拥有的内容:
            xlApp.Workbooks.Open(template, misValue, misValue, misValue, 
                misValue, misValue, misValue, misValue, misValue, misValue, 
                misValue, misValue, misValue, misValue, misValue); 

int row = 19;
if (poDetailBO1.MoveFirst())
            {
                do
                {
                    itemsBO3.FillByPK(poDetailBO1.Style);
                    if (row < 22)
                    {


                        xlApp.Cells[row, 1] = poDetailBO1.LineNo;
                        xlApp.Cells[row, 2] = itemsBO3.Factory;
                        xlApp.Cells[row, 3] = poDetailBO1.Style;
                        xlApp.Cells[row, 4] = itemsBO3.UPC_Code;
                        xlApp.Cells[row, 5] = itemsBO3.Item_Description;
                        xlApp.Cells[row, 6] = "TARRIFF"; //To be replaced later
                        xlApp.Cells[row, 7] = itemsBO3.Plate_Color;
                        xlApp.Cells[row, 8] = itemsBO3.Color;
                        xlApp.Cells[row, 9] = poDetailBO1.PrePack;
                        xlApp.Cells[row, 10] = itemsBO3.Cost;
                        xlApp.Cells[row, 11] = poDetailBO1.Qty;
                        xlApp.Cells[row, 12] = poDetailBO1.Qty * itemsBO3.Cost;

                        row++;
                    }
                    else if (row >= 22)
                    {
                        Excel.Range r = xlWorkSheet.Range[xlWorkSheet.Cells[row, misValue], xlWorkSheet.Cells[row, misValue]];
                        r.Insert(Excel.XlInsertShiftDirection.xlShiftDown, misValue);
                        r.Value2 = "GOBBLYDEEGOOK";

                        row++;
                    }
                } while (poDetailBO1.MoveNext());

然而,我的插入语句被插入到了错误的工作表中,哈哈。而且它被插入到了我甚至无法想象的位置——第2行,第19列。


为什么不更改模板?每个采购订单只有3个项目似乎太少了?你尝试过什么? - Derek
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
@Derek:问题是,我不知道单个采购订单上可能有多少项...所以无论我如何更改模板,我都需要插入行。除非你的意思是放弃第22行的“总计”,在我完成添加项目后自己编程添加它。 - user1096207
嗯,您可能希望每个工作表都有一个小计和最终工作表上的总计,因此我想您将不得不更改模板,除非已经包含在内。似乎3个项目意味着要生成更多的发票。 - Derek
3个回答

10

首先,我没有看到你在哪里设置了xlWorksheet,但这应该是我检查为什么单元格插入到错误工作表的第一个位置。

其次,我认为您的Excel.Range对象没有正确设置。你可能会遇到麻烦,因为你只在WorkSheet.Cells属性中指定了行号而没有列名。当我尝试时,我得到的结果是单元格插入到使用范围之后,而不是我想要的位置。我倾向于使用Worksheet对象的get_Range()方法,因为它通常以更可预测的方式工作。

鉴于这一切,根据您想要移动特定单元格还是整个行,您可以使用以下之一:

// To shift down a set of cells from columns A to F

Excel.Range r = xlWorkSheet.get_Range("A" + row.ToString(), "F" + row.ToString());
r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);

// To shift down all of a row

Excel.Range r = xlWorkSheet.get_Range("A" + row.ToString(), "A" + row.ToString()).EntireRow;
r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);

1
我在午餐休息后才看到Sid Holland的帖子,其中一位同事向我发送了这段代码,它基本上与他的代码做了相同的事情...
    private void CopyRowsDown(int startrow, int count, Excel.Range oRange, Excel.Worksheet oSheet)
    {
        oRange = oSheet.get_Range(String.Format("{0}:{0}", startrow), System.Type.Missing);
        oRange.Select();
        oRange.Copy();
        //oApp.Selection.Copy();

        oRange = oSheet.get_Range(String.Format("{0}:{1}", startrow + 1, startrow + count - 1), System.Type.Missing);
        oRange.Select();
        oRange.Insert(-4121);
        //oApp.Selection.Insert(-4121);

    }

运行完美,即使计数为1。


1
public static void CopyRowsDown(_Worksheet worksheet, int startRowIndex, int countToCopy)
    {
        for (int i = 1; i < countToCopy; i++)
        {
            var range = worksheet.get_Range(string.Format("{0}:{0}", startRowIndex, Type.Missing));
            range.Select();
            range.Copy();

            range = worksheet.get_Range(string.Format("{0}:{1}", startRowIndex + i, startRowIndex + i, Type.Missing));
            range.Select();
            range.Insert(-4121);
        }
    }

适用于任何数量

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接