让C# Excel导入导出 支持不同版本Office

为了让C# Excel导入导出支持不同版本Office,我们需要使用Microsoft.Office.Interop.Excel库。但是不同版本的Office对Interop.Excel库的引用稍有不同,导致在使用Interop.Excel时可能会出现错误。

因此,我们需要先根据传递给我们的Excel文件的版本来确切地确定Interop.Excel的引用版本。以下是实现此目的的完整攻略:

  1. 确定Excel文件的版本:

要确定Excel文件的版本,我们需要获取文件的扩展名。在C#中,可以使用Path类中的GetExtension方法来获取文件的扩展名。

string fileExtension = Path.GetExtension(filePath);

接下来,我们可以使用Switch语句处理各种可能的扩展名。例如:

Excel.Application excelApp = new Excel.Application();
Excel.Workbook excelWorkbook = null;

switch (fileExtension)
{
    case ".xls":
        excelWorkbook = excelApp.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true);
        break;
    case ".xlsx":
        excelWorkbook = excelApp.Workbooks.Open(filePath);
        break;
    default:
        throw new Exception("不支持的Excel文件格式");
}

在上面的示例中,我们使用Switch语句检查Excel文件的扩展名,如果是.xlsx格式,则直接打开文件,否则需要设置其他一些参数来打开.xls格式的文件。

  1. 确定Interop.Excel库的版本:

一旦我们确定了Excel文件的扩展名,我们就可以确定Interop.Excel库的版本。为了实现此目的,我们需要定义一个枚举来表示在不同的Office版本中使用的Interop.Excel库的不同版本。

以下是用于定义Interop.Excel库版本的枚举:

public enum ExcelAccountingFormatLibraryVersion
{
    Excel2003 = 11,
    Excel2007 = 12,
    Excel2010 = 14,
    Excel2013 = 15,
    Excel2016 = 16
}

在上面的枚举中,我们定义了在各个版本的Office中使用的Interop.Excel库的版本号。

接下来,我们可以声明一个方法来获取Interop.Excel库版本,并在根据Excel文件的扩展名确定Office版本后使用此方法来获取正确的Interop.Excel库版本。

以下是检查Office版本并获取Interop.Excel库的方法:

private static ExcelAccountingFormatLibraryVersion GetExcelAccountingFormatLibraryVersion()
{
    using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("Excel.Application\\CurVer"))
    {
        string versionStr = key?.GetValue(String.Empty)?.ToString();

        if (string.IsNullOrEmpty(versionStr))
        {
            throw new Exception("无法获取安装的Excel版本信息");
        }

        switch (versionStr)
        {
            case "Excel.Application.11":
                return ExcelAccountingFormatLibraryVersion.Excel2003;
            case "Excel.Application.12":
                return ExcelAccountingFormatLibraryVersion.Excel2007;
            case "Excel.Application.14":
                return ExcelAccountingFormatLibraryVersion.Excel2010;
            case "Excel.Application.15":
                return ExcelAccountingFormatLibraryVersion.Excel2013;
            case "Excel.Application.16":
                return ExcelAccountingFormatLibraryVersion.Excel2016;
            default:
                throw new Exception("不支持的Excel版本");
        }
    }
}

在上述方法中,我们使用Registry类来检查当前安装的Excel版本,并在根据扩展名确定所需的Interop.Excel库版本后返回正确的版本。

  1. 使用正确的Interop.Excel库版本:

通过本文的前两个步骤,我们已确定Excel文件的扩展名和所需的Interop.Excel库版本。现在我们可以在C#中使用Interop.Excel库来读写Excel文件,并支持不同版本的Office。

以下是使用Interop.Excel库在不同版本的Office中读取Excel文件的示例:

Excel.Application excelApp = new Excel.Application();
Excel.Workbook excelWorkbook = null;

// 获取Excel文件的扩展名
string fileExtension = Path.GetExtension(filePath);

// 根据文件扩展名检查所需的Interop.Excel库版本
ExcelAccountingFormatLibraryVersion version = GetExcelAccountingFormatLibraryVersion();

// 根据Office版本,创建一个新的Excel应用程序对象
Type excelType = Type.GetTypeFromProgID($"Excel.Application.{(int)version}", true);
dynamic excelObject = Activator.CreateInstance(excelType);
excelApp = excelObject.Application;

// 打开Excel文件
switch (fileExtension)
{
    case ".xls":
        excelWorkbook = excelApp.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true);
        break;
    case ".xlsx":
        excelWorkbook = excelApp.Workbooks.Open(filePath);
        break;
    default:
        throw new Exception("不支持的Excel文件格式");
}

// 获取Excel Workbook中的第一个工作表
Excel.Worksheet excelWorksheet = excelWorkbook.Worksheets[1];

// 读取单元格值
Excel.Range range = excelWorksheet.UsedRange;
int rowCount = range.Rows.Count;
int colCount = range.Columns.Count;

for (int i = 1; i <= rowCount; i++)
{
    for (int j = 1; j <= colCount; j++)
    {
        string cellValue = (range.Cells[i, j] as Excel.Range)?.Value?.ToString();
        Console.Write(cellValue + "\t");
    }
    Console.WriteLine();
}

// 释放资源
excelWorkbook?.Close(false, Type.Missing, Type.Missing);
excelApp?.Quit();

Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelWorkbook);
Marshal.ReleaseComObject(excelApp);

以下是使用Interop.Excel库在不同版本的Office中写入Excel文件的示例:

Excel.Application excelApp = new Excel.Application();
Excel.Workbook excelWorkbook = null;

// 获取Excel文件的扩展名
string fileExtension = Path.GetExtension(filePath);

// 根据文件扩展名检查所需的Interop.Excel库版本
ExcelAccountingFormatLibraryVersion version = GetExcelAccountingFormatLibraryVersion();

// 根据Office版本,创建一个新的Excel应用程序对象
Type excelType = Type.GetTypeFromProgID($"Excel.Application.{(int)version}", true);
dynamic excelObject = Activator.CreateInstance(excelType);
excelApp = excelObject.Application;

// 创建一个新的Excel文件
excelWorkbook = excelApp.Workbooks.Add();

// 获取Excel Workbook中的第一个工作表
Excel.Worksheet excelWorksheet = excelWorkbook.Worksheets[1];

// 写入数据
excelWorksheet.Cells[1, 1] = "序号";
excelWorksheet.Cells[1, 2] = "用户名";
excelWorksheet.Cells[1, 3] = "年龄";

excelWorksheet.Cells[2, 1] = 1;
excelWorksheet.Cells[2, 2] = "张三";
excelWorksheet.Cells[2, 3] = 25;

excelWorksheet.Cells[3, 1] = 2;
excelWorksheet.Cells[3, 2] = "李四";
excelWorksheet.Cells[3, 3] = 28;

// 保存Excel文件
excelWorkbook.SaveAs(filePath);

// 释放资源
excelWorkbook.Close(false, Type.Missing, Type.Missing);
excelApp.Quit();

Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelWorkbook);
Marshal.ReleaseComObject(excelApp);

在上述示例中,我们使用Interop.Excel库在不同版本的Office中读取和写入Excel文件。注意,在以上示例中使用了一些Marshal.ReleaseComObject语句来确保释放Interop资源。

这是一个完整的攻略来让C# Excel导入导出支持不同版本Office。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:让C# Excel导入导出 支持不同版本Office - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    C# 数据绑定之向查询中添加参数(.Net连接外部数据库) 在C#中,我们可以使用.NET连接外部数据库,实现数据绑定等操作。在查询数据时,有时需要向查询中添加参数,以实现更加精准的查询结果。 1. 添加数据库连接 首先,我们需要添加数据库连接,使用SqlConnection类来连接数据库。连接字符串可以通过Visual Studio中的数据源管理器来获取。…

    C# 2023年6月1日
    00
  • 详解Java发送HTTP请求

    Java发送HTTP请求是一种常见的网络编程技术,可以用于与Web服务器进行通信。Java提供了多种方式发送HTTP请求,包括使用HttpURLConnection类、使用HttpClient库等。本文将提供详解Java发送HTTP请求的完整攻略,包括创建HttpURLConnection对象、设置请求参数、发送请求、处理响应等。同时,本文还提供两个示例,演…

    C# 2023年5月15日
    00
  • C#事件中的两个参数详解(object sender,EventArgs e)

    当我们在C#中定义事件时,通常会有两个参数,一个是object类型的sender参数,另一个是派生自EventArgs类的e参数。这两个参数对于事件处理程序来说非常关键,因为它们提供了有关触发事件的对象和事件的详细信息。 在本文中,我们将详细讲解C#事件中的这两个参数。 Object Sender参数 Sender参数指的是引发事件的对象。在事件处理程序中,…

    C# 2023年6月1日
    00
  • 基于C#的图表控件库 ScottPlot编译visual studio 2022

    ScottPlot是什么? ScottPlot是一个可视化绘图的C#控件库,提供了丰富的图表类型和交互式功能。ScottPlot基于.NET Core 3.0和.NET Framework 4.6.1开发,支持WinForms、WPF以及控制台程序等多种应用类型。 ScottPlot的安装 在Visual Studio 2022中安装ScottPlot有两种…

    C# 2023年6月3日
    00
  • c#封装百度web服务geocoding api 、百度坐标转换示例

    下面是详细讲解“c#封装百度web服务geocodingapi、百度坐标转换示例”的完整攻略。 1.了解百度Web服务、GeoCodingAPI和坐标转换功能 在开始本教程之前,首先需要了解百度Web服务、GeoCodingAPI和坐标转换功能的作用。 1.1 百度Web服务 百度Web服务是百度提供的一种通过互联网进行信息传输的服务。通过百度Web服务,你…

    C# 2023年5月15日
    00
  • C#二维码图片识别代码

    当我们编写C#应用程序时,可能会遇到需要识别二维码图片的需求。本文将介绍如何使用C#编写二维码图片识别代码。 步骤一:安装ZXing.NET库 首先,我们需要安装一个叫做ZXing.NET的二维码解析库。你可以在NuGet上找到这个库,并通过Visual Studio的程序包管理器安装它。 或者,你可以在ZXing.NET的GitHub页面上下载源代码并手动…

    C# 2023年6月1日
    00
  • C# MJPEG 客户端简单实现方法

    现在我将为你详细讲解“C# MJPEG 客户端简单实现方法”的完整攻略,包含以下内容: MJPEG 是什么 C# MJPEG 客户端库的选择 C# MJPEG 客户端实现步骤 两个示例说明 1. MJPEG 是什么 MJPEG 全称为 Motion JPEG,是一种针对视频图像内容的压缩技术,也是指基于该压缩技术的一种视频格式。MJPEG 格式存储的是逐帧的…

    C# 2023年6月7日
    00
  • .NET通过字典给类赋值实现代码

    对于.NET Framework提供的某些类型,我们可以通过字典的方式给类对象中的属性赋值。下面是实现过程的完整攻略: 1. 引入命名空间 在使用字典给类赋值时,我们需要引入System.Reflection命名空间。在代码中添加以下语句即可: using System.Reflection; 2. 创建类对象 首先,我们需要创建类的对象,以便我们可以给类的…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部