【问题标题】:Excel insert rows (not Add)Excel 插入行(不是添加)
【发布时间】:2012-11-16 14:40:16
【问题描述】:

我有一个用于采购订单的 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 列。

【问题讨论】:

  • 你为什么不改变模板?每个 PO 3 个项目似乎太小了?你试过什么?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @Derek:问题是,我不知道单个 PO 上可能有多少项目......所以无论我如何更改模板,我都需要以任何一种方式插入行.除非您说要取消第 22 行的“总计”并在我完成添加项目后自己以编程方式添加它。
  • 嗯,您可能需要为每张工作表设置小计,并在最后一张工作表上提供总计,因此您必须更改我想象的模板,除非已经合并。看起来 3 件商品将意味着生成更多的发票。

标签: c# .net excel c#-4.0


【解决方案1】:

首先,我看不到您将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);

【讨论】:

    【解决方案2】:

    直到午休后我才看到 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。

    【讨论】:

      【解决方案3】:
      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);
              }
          }
      

      适用于任何数量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多