2011-02-18 132 views
3

我正在使用C#vsto Excel应用程序。在C#vsto Excel中特别粘贴

无论何时用户将Excel模板中的内容粘贴到另一个Excel表格中,它也会将单元格格式与Excel模板中的单元格数据一起粘贴。我想避免这种情况。 所以我用Google搜索&我遇到了术语贴特别。

特殊粘贴只会粘贴内容,不会改变当前表格的格式。

我想在我的vsto应用程序中引入粘贴特殊选项。

我这里有代码,

Application.OnKey("^v", "PasteSpecV"); 

但它不工作... 任何一个可以帮助我?

回答

5
  1. 下载DLL从http://globalmousekeyhook.codeplex.com/
  2. 添加引用MouseKeyboardActivityMonitor.dll

    private KeyboardHookListener k_keyListener; 
    
        private void ThisWorkbook_Startup(object sender, System.EventArgs e) 
        { 
         k_keyListener = new KeyboardHookListener(new AppHooker()); 
         k_keyListener.Enabled = true; 
         k_keyListener.KeyDown += new KeyEventHandler(k_keyListener_KeyDown); 
        } 
    
        void k_keyListener_KeyDown(object sender, KeyEventArgs e) 
        { 
         if (Control.ModifierKeys == Keys.Control) 
          if (e.KeyCode == Keys.V) 
          { 
           Worksheet actSht = ActiveSheet as Worksheet; 
           Range rng = actSht.Application.Selection as Range; 
           if (MessageBox.Show("You are about to paste values only. Do you want to continue?", "Paste Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
           { 
            rng.PasteSpecial(XlPasteType.xlPasteValues, XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false); 
           } 
           e.Handled = true; 
          } 
        } 
    
2

经过大量的搜索,并尝试和错误的方法,我终于成功地做到“选择性粘贴”。 片上我工作,我已经叫commonData

class CommonData 
    { 
     public static Worksheet DATASHEET; 

    } 

后,该类delacred作为静态工作表,我用工作表中ThisWorkbook.cs

的ThisWorkbook启动,我替换PASTE(^ v) by VBA功能Paste_cell

private void ThisWorkbook_Startup(object sender, System.EventArgs e) 
    { 
     // replacing paste by macro function Paste_cell 
     CommonData.DATASHEET.Application.OnKey("^v", "Paste_cell"); 

    } 

打开您工作的Excel工作表,按下ALT + F11即VBA宏编辑器。

工具>>宏>>创建新宏, 它将在Project Explorer创建模块1, 在模块1以下代码粘贴到现在

Sub Paste_cell() 

If MsgBox("You are about to Paste only Values and not the format, proceed?", vbQuestion + vbOKCancel, GSAPPNAME) = vbOK Then 
On Error Resume Next 

ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

End If 

End Sub 

,如果你复制粘贴的任何值从任何Excel表中,它只会粘贴单元格数据,不会粘贴其格式。它会提示以下消息以提醒用户。 所以原始格式不会改变。

干杯,:-)

2

我用下面的代码在VSTO 2010

  Excel.Worksheet lastSheet = Application.ActiveSheet; 
      Excel.Workbook wb = Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); 

      for (int i = this.Worksheets.Count; i >= 1; i--) 
      { 
       Excel.Worksheet source = this.Worksheets[i]; 
       source.Activate(); 
       Application.Cells.Select(); 
       Application.Selection.Copy(); 

       Excel.Worksheet sheet = wb.Worksheets.Add(); 
       sheet.Activate(); 
       Application.Selection.PasteSpecial(Excel.XlPasteType.xlPasteValues); 
       Application.Selection.PasteSpecial(Excel.XlPasteType.xlPasteFormats); 
       sheet.Name = source.Name; 
       sheet.Range["A1"].Select(); 
       Clipboard.Clear(); 
      } 
      lastSheet.Activate(); 
      lastSheet.Range["A1"].Select(); 

      wb.SaveAs(fileName); 
      wb.Close(); 

到复制粘贴只使用PasteSpecial的值和格式化线路Clipboard.Clear()是相同的VBA CutCopyMode = False,取消选择要复制的内容。