В C# - Как скопировать один лист Excel из одной книги в другую?

Мне нужно, чтобы скопировать лист из одной книги в другую и я немного застрял. Предпосылка заключается в том, что у меня есть "главная" книга, в которой хранятся шаблоны для нескольких отчетов, а затем мне нужно создать пустую копию определенного листа и добавить его в новую книгу.

Это то, что у меня есть до сих пор:

private void CreateNewWorkbook(Tables table)
{
    Excel.Application app = null;
    Excel.Workbook book = null;
    Excel.Worksheet sheet = null;

    try
    {
        string startPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
        string filePath = System.IO.Path.Combine(startPath, "sal1011forms.xls");
        Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();

        app = new Excel.Application();
        book = app.Workbooks.Open(filePath);
        sheet = (Excel.Worksheet)book.Worksheets.get_Item((int)table + 1);

        sfd.AddExtension = true;
        sfd.FileName = table.ToString() + ".xls";
        sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

        if (sfd.ShowDialog() == true)
        {
            sheet.SaveAs(sfd.FileName);
        }
    }
    finally
    {
        if (book != null)
        {
            book.Close();
        }
        if (app != null)
        {
            app.Quit();
        }
        this.ReleaseObject(sheet);
        this.ReleaseObject(book);
        this.ReleaseObject(app);
    }
}

единственная проблема, которая у меня сейчас есть, это когда я звоню .Save() на листе сохраняет все листы из исходная книга в новую книгу. Есть идеи, как это исправить?

заранее спасибо,
Сонни!--2-->

3 ответов


вы также можете использовать лист.Метод копирования.

По Сути, Лист.копировать копирует лист, и автоматически создает новую книгу одновременно.

попробуйте добавить следующие строки в код после вызова рабочих листов.get_Item:

//Copies sheet and puts the copy into a new workbook
sheet.Copy(Type.Missing, Type.Missing);

//sets the sheet variable to the copied sheet in the new workbook
sheet = app.Workbooks[2].Sheets[1];

вот ссылка для функции Copy (), а также: MSDN Link


Я понимаю, что это несколько поздний ответ, но я немного боролся с этим, поэтому я решил опубликовать свое решение, чтобы оно могло помочь кому-то еще с этой проблемой.

имея шаблон листа, который вы хотите заполнить много раз:

    public void test()
    {

        Excel.Application excelApp;

        string fileTarget = "C:\target.xlsx";
        string fileTemplate = "C:\template.xlsx";
        excelApp = new Excel.Application();
        Excel.Workbook wbTemp, wbTarget;
        Excel.Worksheet sh;

        //Create target workbook
        wbTarget = excelApp.Workbooks.Open(fileTemplate);

        //Fill target workbook
        //Open the template sheet
        sh = wbTarget.Worksheets["TEMPLATE"];
        //Fill in some data
        sh.Cells[1, 1] = "HELLO WORLD!";
        //Rename sheet
        sh.Name = "1. SHEET";


        //Save file
        wbTarget.SaveAs(fileTarget);

        //Iterate through the rest of the files
        for (int i = 1; i < 3; i++)
        {
            //Open template file in temporary workbook
            wbTemp = excelApp.Workbooks.Open(fileTemplate);

            //Fill temporary workbook
            //Open the template sheet
            sh = wbTemp.Worksheets["TEMPLATE"];
            //Fill in some data
            sh.Cells[1, 1] = "HELLO WORLD! FOR THE " + i + ".TH TIME";
            //Rename sheet
            sh.Name = i + ". SHEET";

            //Copy sheet to target workbook
            sh.Copy(wbTarget.Worksheets[1]);
            //Close temporary workbook without saving
            wbTemp.Close(false);
        }

        //Close and save target workbook
        wbTarget.Close(true);
        //Kill excelapp
        excelApp.Quit();
    }

Я хотел бы дать ответ на этот вопрос, даже то, что прошло больше года с тех пор, как он был задан. У меня была такая же проблема с проектом, который я разрабатываю, и мне потребовалось время, чтобы найти ответ. Я опубликую, используя VB.NET код вместо C#, так как я не знаком с последним.

вот сделка, чтобы скопировать листы между книгами Excel, абсолютно необходимо использовать только один объект приложения Excel, а затем открыть обе книги с этим одним приложение, то мы можем использовать известный рабочий лист.Скопируйте метод и просто укажите, что лист копируется после или до листа в этой другой книге.

Private Sub ThisWorkbook_Startup() Handles Me.Startup
    Me.Application.Workbooks.Open(filePath)
    Me.Application.Workbooks(2).Worksheets("Reporte"). _
          Copy(After:=Me.Application.Workbooks(1).Worksheets("Hoja1"))
    Me.Application.Workbooks(2).Close()
    Me.Application.DisplayAlerts = False
    Globals.Hoja1.Delete()
    Me.Application.DisplayAlerts = True
End Sub

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

Dim xlApp As New Excel.Application
Dim book1 As Excel.Workbook
Dim book2 As Excel.Workbook
book1 = xlApp.Workbooks.Open(filePath1)
book2 = xlApp.Workbooks.Open(filePath2)

book1.Worksheets("Sheet to be copied").Copy(After:=book2.Worksheets(1))

конечно, приложение Excel покажет обе книги, поэтому после завершения копирования вы должны закрыть исходную книгу, если ваше намерение не отображать ее (или, по крайней мере, недостаточно долго для пользователя, чтобы что-либо сделать).

xlApp.Workbooks(1).Close()

вот как я мог бы это сделать, пользователь увидит мигающую новую книгу, всплывающую, а затем закрывающуюся, что не очень аккуратно, но до сих пор я понятия не имею, как еще это сделать (или сделать этот процесс копирования невидимым способом)

Я надеюсь, что это все еще имеет какое-то значение. С уважением.