为了让C# Excel导入导出支持不同版本Office,我们需要使用Microsoft.Office.Interop.Excel库。但是不同版本的Office对Interop.Excel库的引用稍有不同,导致在使用Interop.Excel时可能会出现错误。
因此,我们需要先根据传递给我们的Excel文件的版本来确切地确定Interop.Excel的引用版本。以下是实现此目的的完整攻略:
- 确定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格式的文件。
- 确定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库版本后返回正确的版本。
- 使用正确的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技术站