让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日

相关文章

  • .NET中字符串比较的最佳用法

    关于“.NET中字符串比较的最佳用法”的攻略我可以给出以下内容: 1. 字符串比较的基本知识 1.1 区分大小写、不区分大小写 .NET中字符串比较默认是区分大小写的,例如 “cat” 和 “Cat” 是不相等的。但是如果要进行不区分大小写的比较,可以使用 StringComparison 枚举来指定不区分大小写的比较方式。 示例代码: string s1 …

    C# 2023年6月8日
    00
  • VS2022使用ClickOnce发布程序本地安装.net框架

    因为遇到下面的错误,没有在网上搜到详细解决问题的教程,费了一些时间才解决了问题,特此记录一下,也希望能帮助到其他人。  要在“系统必备”对话框中启用“从与我的应用程序相同的位置下载系统必备组件”,必须将“.NET 桌面运行时 6.0.14 (x64)”项的文件“net6desktopruntime_x64\windowsdesktop-runtime-6.0…

    C# 2023年5月3日
    00
  • 浅析C#中数组,ArrayList与List对象的区别

    浅析C#中数组,ArrayList与List对象的区别 在 C# 编程语言中,数组,ArrayList 和 List 都是常用的数据结构。虽然在某些场景下它们可以互相替代,但它们之间还是存在一些区别。 数组 数组是一种固定大小的、连续的数据结构,其中可以存储相同类型的元素。在 C# 中,创建数组的方式有两种。一种是使用数组初始化器,将元素的值直接传递给数组。…

    C# 2023年5月15日
    00
  • C#过滤sql特殊字符串的方法

    下面是关于“C#过滤SQL特殊字符串的方法”的攻略。 概述 在进行 SQL 查询时,需要注意输入的字符串参数中有特殊字符,可能会导致 SQL 注入攻击。因此在 C# 中,需要对字符串进行过滤,防止出现 SQL 注入攻击。 C#如何过滤特殊字符串 C# 中的字符串过滤可以通过以下两种方式进行: 1. 使用参数化查询 将参数添加到 SQL 查询语句中可以避免出现…

    C# 2023年6月8日
    00
  • C#最简单的字符串加密解密方法

    C#最简单的字符串加密解密方法 介绍 在应用程序开发过程中,加密解密是一个非常重要的操作,特别是在涉及到用户隐私数据时。本文将介绍一种使用C#编程语言实现最简单的字符串加密解密方法。 加密解密方法介绍 在C#中字符串加密解密的方法有很多种,本文将使用Base64算法进行加密解密。Base64算法是一种基于64个字符来表示二进制数据的方法,主要用于在HTTP协…

    C# 2023年6月8日
    00
  • ASP.NET实现基于Forms认证的WebService应用实例

    实现基于Forms认证的WebService应用需要以下几个步骤: 在web.config文件中配置Forms认证和WebService 首先要在web.config文件中配置Forms认证和WebService。示例代码如下: <configuration> <system.web> <authentication mode=…

    C# 2023年6月3日
    00
  • Unity实现粒子光效导出成png序列帧

    我会详细讲解“Unity实现粒子光效导出成png序列帧”的完整攻略。 1. 确定粒子光效和导出路径 首先,在Unity中打开需要导出的场景,在Hierarchy中找到对应的粒子光效,并确保它已经在场景中正常播放,可以通过直接播放或者在Scene视图中预览来确认。 接着,在Unity的菜单栏中选择“Window” -> “Rendering” ->…

    C# 2023年6月3日
    00
  • C#使用BitConverter与BitArray类进行预定义基础类型转换

    下面是“C#使用BitConverter与BitArray类进行预定义基础类型转换”的完整攻略。 什么是BitConverter和BitArray类? 在C#中,我们可以使用BitConverter和BitArray类来进行预定义基础类型的转换。其中,BitConverter类用于在基本数据类型和字节数组之间进行转换,而BitArray类可以对比特位进行操作…

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