Копирование данных из различных таблиц Excel в C# - PullRequest
0 голосов
/ 31 марта 2020

Я использую Windows Настольное приложение, и я sh открываю новую книгу Excel и рабочую таблицу, а затем пользователь выбирает существующий файл Excel, чтобы программа могла копировать данные на новый лист. Пользователь должен сделать это дважды, так как два файла Excel используются для справки.

Я знаю, что для получения новой рабочей книги Excel и рабочего листа вы должны сделать следующее:

Excel.Application oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng;

oXL = new Excel.Application();
oXL.Visible = true;

//Get a new workbook.
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
string sheetName = comboBox1.Text;
oSheet.Name = sheetName;

Но я заблудился, как сослаться на файл, выбранный пользователем. .. Не могли бы вы сделать ...

string excelPath = string.Empty;
using (OpenFileDialog excelFile = new OpenFileDialog())
{
    excelFile.InitialDirectory = "c:\\";
    if(excelFile.ShowDialog() == DialogResult.OK)
    {

    }
}

После этого, как мне ссылаться на данные в выбранном файле Excel, чтобы, например, извлечь все из столбца A и скопировать его в новый файл Excel?

1 Ответ

0 голосов
/ 31 марта 2020

Вот небольшая функция, которую я использовал в прошлом, чтобы сделать это через функциональность буфера обмена взаимодействия:

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();
...