C # - Как скопировать один лист Excel из одной книги в другую? - PullRequest
9 голосов
/ 28 сентября 2010

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

Вот чтоУ меня так далеко:

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 () на листе, он сохраняет ВСЕ листы из исходной книги в новую.Учебное пособие.Есть идеи, как это исправить?

Заранее спасибо,Sonny

Ответы [ 3 ]

13 голосов
/ 28 сентября 2010

Вы также можете использовать метод Sheet.Copy ().

Как правило, Sheet.copy копирует лист и автоматически создает новую книгу одновременно.

Попробуйте добавитьследующие строки в вашем коде после вызова Worksheets.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

4 голосов
/ 14 сентября 2013

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

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

    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();
    }
2 голосов
/ 25 сентября 2014

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

Вот предложение, чтобы копировать листы между книгами Excel, абсолютно необходимо использовать только ОДИН объект приложения Excel, а затем открыть обе книги с помощью этого единственного приложения, тогда мы можем использовать известный метод Worksheet.Copy.и просто укажите, что лист копируется после или перед листом в этой другой книге.

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

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

Я надеюсь, что это все ещеУ меня есть какая-то ценность.С наилучшими пожеланиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...