2010-09-27 58 views
8

Tôi cần phải sao chép một trang tính từ một sổ làm việc này sang sổ làm việc khác và tôi bị kẹt một chút. Tiền đề là tôi có sổ làm việc "chính" lưu trữ các mẫu cho một số báo cáo và sau đó tôi cần phải tạo một bản sao trống của một trang tính cụ thể và thêm nó vào một sổ làm việc mới.C# - Làm thế nào để sao chép một bảng tính Excel từ sổ làm việc này sang sổ làm việc khác?

Đây là những gì tôi có cho đến nay:

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); 
    } 
} 

Vấn đề duy nhất mà tôi đang gặp vào lúc này là khi tôi gọi lệnh .save() trên bảng tính, nó tiết kiệm TẤT CẢ các bảng từ sổ làm việc gốc vào sổ làm việc mới. Bất kỳ ý tưởng về cách sửa lỗi này?

Cảm ơn trước,
Sonny

Trả lời

13

Bạn cũng có thể sử dụng phương pháp Sheet.Copy().

Về cơ bản, Sheet.copy sao chép trang tính và sẽ tự động tạo một sổ làm việc mới cùng một lúc.

Hãy thử thêm các dòng sau vào code của bạn, sau cuộc gọi của bạn để 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]; 

Dưới đây là tài liệu tham khảo cho Sao chép() chức năng cũng như: MSDN Link

3

Tôi nhận ra điều này là một câu trả lời hơi muộn, nhưng tôi đã đấu tranh khá một chút với điều này vì vậy tôi figured tôi đăng bài giải pháp của tôi để nó có thể giúp đỡ người khác có vấn đề này.

Có một mẫu sheet mà bạn muốn điền vào nhiều lần:

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(); 
    } 
1

Tôi muốn đưa ra một câu trả lời cho câu hỏi này, thậm chí rằng đó là hơn một năm kể từ khi nó được yêu cầu. Tôi đã có cùng một vấn đề bản thân mình với một dự án tôi đang phát triển, và nó đã cho tôi một thời gian để tìm câu trả lời. Tôi sẽ đăng bài bằng cách sử dụng VB.NET mã thay vì C# kể từ khi tôi không quen thuộc với người cuối cùng. Đây là thỏa thuận, để sao chép trang tính giữa các sổ làm việc Excel, chỉ cần một đối tượng ứng dụng Excel và sau đó mở cả sổ làm việc với ứng dụng đơn lẻ đó, chúng ta có thể sử dụng phương thức Worksheet.Copy đã biết và đơn giản xác định rằng trang tính được sao chép sau hoặc trước trang tính trong sổ làm việc đó.

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 

Trong trường hợp này ứng dụng Excel Tôi đang sử dụng là một trong những dự án chạy Excel Workbook của tôi, nhưng điều này cũng sẽ làm việc:

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

Tất nhiên, ứng dụng Excel sẽ hiển thị cả workbook , vì vậy sau khi bạn hoàn tất việc sao chép, bạn nên đóng Workbook nguồn nếu ý định của bạn không hiển thị nó (hoặc ít nhất là không đủ lâu để người dùng làm bất kỳ điều gì).

xlApp.Workbooks(1).Close() 

Đây là cách tôi có thể làm điều đó, người dùng sẽ thấy một Workbook mới nhấp nháy poping lên và sau đó đóng cửa, mà không phải là thực sự gọn gàng, nhưng cho đến nay tôi không có ý tưởng làm thế nào khác để làm điều đó (hoặc làm quá trình sao chép này theo cách không thể nhìn thấy)

Tôi hy vọng điều này vẫn có một số giá trị. Trân trọng.

Các vấn đề liên quan