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