Специальная вставка в C # vsto Excel - PullRequest
4 голосов
/ 18 февраля 2011

Я работаю над приложением C # vsto Excel.

Всякий раз, когда пользователь вставляет что-либо в шаблон Excel из другого листа Excel, он также вставляет формат ячейки вместе с данными ячейки в шаблон Excel.Я хочу избежать этого.Так что я гуглил и наткнулся на термин «вставка спец».

«Вставка спец.» будет только вставлять содержимое и не будет изменять формат текущего листа.

Я хочувведите вставьте специальную опцию в мое приложение vsto.

У меня есть код,

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

, но он не работает ... Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

6 голосов
/ 05 сентября 2012
  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 голосов
/ 19 июля 2011

Я использовал следующий код для копирования и вставки только значений и форматирования с использованием PasteSpecial во 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();

Строка Clipboard.Clear () такая же, как VBA CutCopyMode = False, чтобы отменить выбор того, что быловыбран для копирования.

2 голосов
/ 24 февраля 2011

После большого количества методов поиска, проб и ошибок мне наконец-то удалось сделать "Специальная вставка" . Лист, на котором я работаю, был объявлен статическим рабочим листом в классе под названием commonData

class CommonData
    {
      public static Worksheet DATASHEET;

    }

после этого я использовал этот лист в ThisWorkbook.cs

На ThisWorkbook При запуске я заменил PASTE (^ v) на функцию 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 Macros Editor.

Инструменты >> Макросы >> Создать новый макрос , Это создаст Модуль 1 в Project Explorer, Вставьте следующий код в модуль 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, он будет вставлять только данные ячейки и не будет вставлять его формат. Он будет выдавать следующее сообщение, чтобы предупредить пользователя. Таким образом, оригинальный формат не изменится.

Ура,: -)

...