欢迎访问宙启技术站
智能推送

C# 复制(带格式)Excel工作表

发布时间:2023-05-15 04:14:40

在C#中,如果需要将一个Excel工作表进行复制,并且需要保留原工作表的格式,那么我们可以通过两种方式来实现。 种方式是使用Microsoft.Office.Interop.Excel程序集来完成,需要先安装Microsoft Office或者Excel的集成开发环境(IDE)。第二种方式是使用第三方库,例如EPPlus,NPOI等,本文将着重介绍 种方式。

1. Microsoft.Office.Interop.Excel方法

要使用Microsoft.Office.Interop.Excel程序集完成Excel的复制功能,我们需要添加对该程序集的引用。

using Microsoft.Office.Interop.Excel;

接下来,我们需要创建一个Excel应用程序对象,打开原Excel文件,选择要复制的工作表。然后将该工作表作为一个工作簿对象复制到新的Excel文件中。以下是示例代码:

using System.IO;
using System.Runtime.InteropServices;
using excel = Microsoft.Office.Interop.Excel;

namespace ExcelTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Excel应用程序对象
            excel.Application excelApp = new excel.Application();
            excel.Workbook excelWorkbook = null;
            excel.Worksheet excelWorksheet = null;

            try
            {
                //打开原Excel文件
                excelWorkbook = excelApp.Workbooks.Open(@"D:\OriginalWorkbook.xlsx");
                //选择要复制的工作表
                excelWorksheet = excelWorkbook.Worksheets["OriginalWorksheet"] as excel.Worksheet;

                //复制工作表到新的Excel文件中
                excelWorkbook.Worksheets.Add();
                excelWorksheet.Copy(Type.Missing, excelWorkbook.Worksheets[excelWorkbook.Worksheets.Count]);

                //保存新的Excel文件
                excelWorkbook.SaveAs(@"D:\CopiedWorkbook.xlsx");
            }
            catch (IOException ex)
            {
                Console.WriteLine("IOException: " + ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
            }
            finally
            {
                //释放Excel资源
                excelWorkbook.Close(false, Type.Missing, Type.Missing);
                Marshal.ReleaseComObject(excelWorksheet);
                Marshal.ReleaseComObject(excelWorkbook);
                excelApp.Quit();
                Marshal.ReleaseComObject(excelApp);
            }
        }
    }
}

在此示例代码中,我们使用了Try-Catch-Finally结构来保证资源的安全释放,避免因为未处理异常导致资源泄露的问题。Marshal.ReleaseComObject方法是专门用于释放COM对象所占用的资源的方法,避免了引用计数的问题,释放的顺序要与创建的顺序相反。

2. EPPlus方法

EPPlus是一个开源的、免费的、基于.NET的组件库,用于创建、读取和编辑Excel文件。它是一个轻量级的组件库,可以很方便地在.NET中使用,而且支持Excel中的绝大部分功能。以下是示例代码:

using System.IO;
using OfficeOpenXml;

namespace ExcelTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                FileInfo originalFile = new FileInfo(@"D:\OriginalWorkbook.xlsx");

                //读取原Excel文件
                using (ExcelPackage excelPackage = new ExcelPackage(originalFile))
                {
                    ExcelWorksheet originalWorksheet = excelPackage.Workbook.Worksheets["OriginalWorksheet"];

                    //创建新Excel文件
                    FileInfo copiedFile = new FileInfo(@"D:\CopiedWorkbook.xlsx");
                    using (ExcelPackage copiedPackage = new ExcelPackage(copiedFile))
                    {
                        ExcelWorksheet copiedWorksheet = copiedPackage.Workbook.Worksheets.Add("CopiedWorksheet");

                        //复制数据
                        copiedWorksheet.Cells.LoadFromCollection(originalWorksheet.Cells.ToList());
                        //复制格式
                        copiedWorksheet.Cells.Style.Copy(originalWorksheet.Cells.Style);

                        //保存新的Excel文件
                        copiedPackage.Save();
                    }
                }
            }
            catch (IOException ex)
            {
                Console.WriteLine("IOException: " + ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
            }
        }
    }
}

在此示例代码中,我们使用了ExcelPackage类来读取和创建Excel文件,ExcelWorksheet类来访问Excel文件中的工作表。LoadFromCollection方法和Style.Copy方法用于复制数据和格式,而Save方法则用于保存Excel文件。

总结

在C#中,我们可以使用Microsoft.Office.Interop.Excel程序集或第三方组件库,例如EPPlus来复制Excel工作表并保留格式。其中使用Microsoft.Office.Interop.Excel程序集需要安装微软办公软件或其它第三方程序集,而使用EPPlus则相对更加轻量级一些。无论使用哪种方法,都需要仔细处理资源的释放问题,以免造成内存泄露或其它相关问题。