C# - 如何将一个Excel工作表从一个工作簿复制到另一个?
我需要将工作表从一个工作簿复制到另一个工作表,并且我有点卡住了。前提是我有一个“主”工作簿,用于存储多个报表的模板,然后需要创建特定工作表的空白副本并将其添加到新的工作簿中。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(),这样可以节省一切从工作表原始工作簿放入新的工作簿中。任何想法如何纠正?
由于提前,
桑尼
您也可以使用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];
下面是复制()函数的引用,以及: 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应用程序对象,然后使用该单一应用程序打开两个工作簿,然后我们可以使用已知的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()
这是我能做到这一点,用户将看到一个闪烁的新工作簿坡平了,然后关闭,这是不是很整洁,但到目前为止,我不知道怎么回事做到这一点(或以不可见的方式执行此复制过程)
我希望这仍然有一定的价值。最好的祝福。