2012-11-16 132 views
4

我有一個採購訂單的Excel '07模板文件。在模板上,只有3行值的項目空間,然後模板顯示Total。Excel插入行(不添加)

所以,基本上,在模板有: 行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列。

+0

爲什麼不更改模板?每個PO有3個項目似乎太小?你有什麼嘗試? – Derek

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@Derek:問題是,我不知道單個PO中可能有多少項目...因此,無論如何更改模板,我都需要插入行。除非你要求放棄第22行的「總計」,並在完成添加項目後自己以編程方式添加它。 – user1096207

回答

9

首先,我沒有看到您的設置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); 
0

我沒有看到希德荷蘭的職位,直到我的午飯後突破,其中一個同事給我發了這個代碼,不會基本上是同樣的事情他......

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

0
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); 
     } 
    } 

適用於任何計數