Вот небольшая функция, которую я использовал в прошлом, чтобы сделать это через функциональность буфера обмена взаимодействия:
using Microsoft.Office.Interop.Excel;
public bool XlsCopyPaste(ref Workbook srcWb,
string srcSheetName, string srcRange,
ref Workbook tgtWb,
string tgtSheetName, string tgtRange,
XlPasteType pasteType)
{
try
{
var srcWs = srcWb.Sheets.Cast<Worksheet>().ToList();
var tgtWs = tgtWb.Sheets.Cast<Worksheet>().ToList();
var srcSheet = srcWs.FirstOrDefault(s => s.Name == srcSheetName);
if (srcSheet != null)
{
var tgtSheet = tgtWs.FirstOrDefault(s => s.Name == tgtSheetName);
if (tgtSheet == null)
{
tgtSheet = tgtWb.Sheets.Add();
tgtSheet.Name = tgtSheetName;
}
var source = srcSheet.Range(srcRange);
var target = tgtSheet.Range(tgtRange);
source.Copy();
target.PasteSpecial(pasteType, XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
}
}
catch (Runtime.InteropServices.COMException ex)
{
return false;
}
}
И вы можете назвать это так:
var xl = new Application();
var srcWb = (Workbook)xl.Workbooks.Open(xl.GetOpenFilename("Excel Workbooks (*.xls; *.xlsx),*.xls;*.xlsx").ToString());
var tgtWb = (Workbook)xl.Workbooks.Open(xl.GetOpenFilename("Excel Workbooks (*.xls; *.xlsx),*.xls;*.xlsx").ToString());
if (XlsCopyPaste(srcWb, "Sheet1", "B:C", tgtWb, "Sheet2", "A1", XlPasteType.xlPasteAll))
{
tgtWb.Save();
}
srcWb.Close();
tgtWb.Close();
xl.Quit();