如何在C# WinForms中不打开Excel文件将Excel工作表复制到另一个Excel工作簿中?

5
在C# Windows应用程序中,我有许多Excel工作簿,我想要做的是将工作簿中的工作表复制到一个单一的工作簿中。这是可能的,但我必须打开Excel工作簿才能完成此操作。
        Excel.Application app = new Excel.Application();

        app.Visible = true;

        app.WindowState = XlWindowState.xlMinimized;

        app.Workbooks.Add("");
        app.Workbooks.Add(@"Path\WorkBook1.xlsx");
        app.Workbooks.Add(@"Path\WorkBook2.xlsx");

        for (int i = 2; i <= app.Workbooks.Count; i++)
        {
            int count = app.Workbooks[i].Worksheets.Count;

            app.Workbooks[i].Activate();
            for (int j = 1; j <= count; j++)
            {
                Excel._Worksheet ws = (Excel._Worksheet)app.Workbooks[i].Worksheets[j];

                ws.Select(true);
                ws.Cells.Select();

                Excel.Range sel = (Excel.Range)app.Selection;
                sel.Copy(Type.Missing);

                Excel._Worksheet sheet = (Excel._Worksheet)app.Workbooks[1].Worksheets.Add(
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing
                    );

                sheet.Paste(Type.Missing, Type.Missing);

                sheet.Name = app.Workbooks[i].Worksheets[j].Name;
            }


        }

        app.DisplayAlerts = false;
        app.Workbooks[3].Close();
        app.Workbooks[2].Close();
        app.DisplayAlerts = true;

        Cursor = Cursors.Default;

        MessageBox.Show("Successfully Generated Excel...!", "Excel Tool", MessageBoxButtons.OK, MessageBoxIcon.Information);

不打开Excel表格,是否有可能复制所有数据及其样式?


复制工作簿中的单个工作表而不打开Excel文件是不可能的。但是,如果您只想让复制操作在后台运行,可以在单独的Excel应用程序中执行该操作。有一次,我需要复制一些包含启动宏的模板工作表。我必须在一个单独的(不可见的)Excel应用程序中打开此模板,并关闭宏。 - StuartRedmann
1个回答

6

如果你想要复制一个工作表以及其中的所有内容和格式,而不是选择并复制工作表本身的内容,你可以使用Worksheet.Copy。你可以像这样使用它:

Excel._Worksheet ws = (Excel._Worksheet)app.Workbooks[i].Worksheets[j];
Excel._Worksheet sheet = (Excel._Worksheet)app.Workbooks[1].Worksheets.Add(
                Type.Missing, Type.Missing, Type.Missing, Type.Missing
                );
ws.Copy(Before: sheet);

然而,如果你的问题实际上是想将工作簿的内容复制到一个共同的工作簿中,而不需要打开文件,则我认为这是不可能的。你需要打开文件才能访问数据。


这不是问题的答案!! - Kazimierz Jawor
引用实际问题的话,而不仅是帖子的标题:“在不打开Excel表格的情况下,是否可以复制所有数据以及它们的样式?”这并不会打开工作表并复制所有数据。它只是复制了工作表。 - Adrian
你能在关闭的工作簿上运行它吗?我不确定... 你测试过了吗? - Kazimierz Jawor
我在另一个项目中几乎使用完全相同的调用序列,将模板工作簿中的工作表复制到用于报告生成的另一个工作簿中。如果能在不访问文件的情况下复制文件内容,我很想了解一下我的想法是否正确。 - Adrian
似乎这是一种替代方法。我可以删除这行并将其隐藏app.Visible = true;然后关闭其他工作表并保存并打开我的工作簿。 - Achilles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接