.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7
导出组件 Aspose.Cells for .NET 5.3.1

asp.net core mvc 如果使用Aspose.Cells导出excel时,报错
System.Drawing.Common is not supported on this platform

平台特定实现:
对于Windows平台,System.Drawing.Common 通常是可以正常工作的。
对于非Windows平台,你可能需要寻找替代方案,如使用 SkiaSharp、ImageSharp 或其他跨平台的图形库。
System.Drawing.Common 是一个提供基本图形功能的库,但它并不是在所有平台上都可用。特别是在非Windows平台上(如Linux和macOS),由于底层图形系统的差异,直接使用 System.Drawing.Common 可能会遇到问题

推荐使用不依赖操作系统底层环境的组件来导出excel,这样linux中就不用安装图像组件依赖了,比如libSkiaSharp,这里推荐用 MiniExcel 来导出excel,支持Linux,直接在nuget搜索安装MiniExcel

MiniExcel 组件介绍

MiniExcel 简单高效,避免了 OOM 的 .NET 处理 Excel 工具。
目前大多数流行的框架都需要将所有数据加载到内存中以方便操作,但这会引起内存消耗问题。MiniExcel 尝试使用流中的算法将原来的 1000 MB 占用减少到几 MB,以避免 OOM(内存不足)。

特征

  • 低内存消耗,避免 OOM(内存不足)和全量 GC
  • 支持每行数据的实时操作
  • 支持 LINQ 延迟执行,可以做低消耗、快速分页等复杂查询
  • 轻量级,未安装 Microsoft Office,无 COM+,DLL 大小小于 150KB
  • 简单的 API 样式来读/写/填充 excel
    在这里插入图片描述

MiniExcel 导出excel参考代码:

 public static string ExportExcelFile(Object list, string fileName)
 {
     //检查导出目录是否在 
     string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "export");
     if (!System.IO.Directory.Exists(dir))
     {
         System.IO.Directory.CreateDirectory(dir);
     }

     string filePath = Path.Combine(dir, fileName);
 
     string url = Path.Combine("export", fileName);

//测试数据
     var value = new[] {
         new { id="12",name="武松",createTime="2024-12-17 16:35:41",point=284.7},
         new { id="23",name="李斯",createTime="2024-12-11 16:35:41",point=184.5},
         new { id="31",name="欧阳楠",createTime="2024-10-14 16:35:41",point=384.1},
         new { id="14",name="范仲淹",createTime="2024-05-24 16:35:41",point=291.2}
     };

     var config = new OpenXmlConfiguration
     {
            /*
      * new DynamicExcelColumn("id"){Name="主键" } , Name设置列中文名称;
       new DynamicExcelColumn("id"){Name="主键" ,Ignore=true} , Ignore表示此列不导出;
       Index设置所在列下标(数字),也可以控制显示顺序; 
      */
         //配置列名
         DynamicColumns = new DynamicExcelColumn[] {
             new DynamicExcelColumn("id"){Name="主键" },
             new DynamicExcelColumn("name"){ Name="姓名",Width=20},
             new DynamicExcelColumn("createTime"){Name="创建时间", Format="yyyy-MM-dd",Width=55},
             new DynamicExcelColumn("point"){ Name="得分"},
         }
     };

     MiniExcel.SaveAs(filePath, value, configuration: config);



     //删除已经过期的文件
     Action<string> delFileAc = (fileDir) =>
     {
         try
         {
             var files = System.IO.Directory.GetFiles(fileDir);
             if (files == null || files.Length == 0) return;
             foreach (var filePath in files)
             {
                 if (File.Exists(filePath))
                 {
                     var fileInfo = new FileInfo(filePath);
                     if ((DateTime.Now - fileInfo.LastWriteTime).TotalHours > 48)
                     {
                         File.Delete(filePath);
                         Console.WriteLine("成功删除导出文件=" + filePath);
                     }
                 }
             }
         }
         catch (Exception)
         {
         }
     };
     delFileAc(dir);

     return url;
 }

导出文件效果

在这里插入图片描述

<think>我们正在解决用户在使用System.Data.OleDb时遇到的PlatformNotSupportedException异常。这个异常通常发生在尝试在不支持OLE DB的平台上使用它时,例如在.NET Core.NET 5+的某些环境中,因为System.Data.OleDb在这些环境中并不是默认被支持的。 根据用户的需求,我们可以提供以下解决方案: 1. **使用其他数据提供程序**:如果目标数据库有特定的.NET Core提供程序,建议使用它。例如: - 对于SQL Server:使用`System.Data.SqlClient`或`Microsoft.Data.SqlClient`。 - 对于Oracle:使用`Oracle.ManagedDataAccess.Core`。 - 对于ODBC:使用`System.Data.Odbc`(这个在.NET Core中是支持的)。 - 对于其他数据库,寻找对应的ADO.NET Core提供程序。 2. **使用ODBC作为替代**:如果数据库有ODBC驱动程序,可以使用ODBC连接来代替OLE DB。在.NET Core中,`System.Data.Odbc`是支持的。 3. **升级到支持OLE DB的.NET版本**:在.NET Framework中,OLE DB是支持的。如果应用可以运行在.NET Framework上,那么不会出现此问题。但是,如果应用需要跨平台,则不建议此方法。 4. **使用第三方库**:有一些第三方库提供了对OLE DB的支持,但需要注意兼容性和稳定性。 5. **迁移到Entity Framework Core**:如果应用使用OLE DB访问数据库,可以考虑迁移到Entity Framework Core,它支持多种数据库,并且可以避免直接使用底层提供程序。 6. **检查目标平台**:确保在支持OLE DB的平台上运行。例如,在Windows上,.NET Core 3.0及以上版本重新引入了对OLE DB的支持(通过`System.Data.OleDb`包),但仅限于Windows平台。因此,如果运行在Windows平台(如Linux或macOS),则无法使用。 因此,具体步骤: - 如果运行在Windows上,并且使用的是.NET Core 3.0或更高版本,可以通过NuGet安装`System.Data.OleDb`包: ```bash Install-Package System.Data.OleDb ``` 然后在代码中使用`OleDbConnection`等类。 - 如果运行在Windows平台,那么必须使用其他替代方案(如ODBC或特定数据库提供程序)。 用户需要根据自己使用的数据库类型和运行环境选择合适的方案。 下面是一个使用ODBC连接Access数据库的示例(因为用户可能在使用Access数据库,而Access通常使用OLE DB,但也可以通过ODBC连接): 使用ODBC连接Access(需要安装Access的ODBC驱动程序): ```csharp using System.Data.Odbc; string connectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\path\\to\\database.accdb;"; using (var connection = new OdbcConnection(connectionString)) { connection.Open(); // 执行命令等 } ``` 注意:在Windows平台上,可能没有Access的ODBC驱动程序,所以Access数据库通常只能在Windows上使用。如果用户使用的是其他数据库(如SQL Server),则可以使用对应的ODBC驱动程序。 因此,总结解决方案: - 如果是Windows平台,且使用.NET Core 3.0+,安装`System.Data.OleDb`包。 - 否则,使用ODBC(如果数据库有ODBC驱动程序)或数据库特定的提供程序。 - 考虑迁移到其他数据库访问技术(如Entity Framework Core)并使用支持的提供程序。 根据用户引用的内容,我们注意到引用的内容是关于System.Data.OleDb.OleDbTransaction等类的,这说明用户在使用OLE DB进行事务处理。在替代方案中,如果使用ODBC,则可以使用`OdbcTransaction`;如果使用SqlClient,则使用`SqlTransaction`,以此类推。 因此,我们建议用户根据实际情况选择替代方案。 下面我们生成相关问题:</think>### 解决 System.PlatformNotSupportedExceptionSystem.Data.OleDb 不受支持的错误 当在 .NET Core/.NET 5+ 环境中使用 `System.Data.OleDb` 时,会遇到此错误,因为该组件 Windows 平台或新框架版本中不再默认支持。以下是解决方案: --- #### 1. **确认运行环境** - **仅 Windows 支持**:OleDb 仅在 **Windows 平台**的 .NET Core 3.0+ 中可用 - 检查项目目标框架: ```xml <!-- 项目文件 (.csproj) 需包含 --> <TargetFramework>net6.0-windows</TargetFramework> <!-- 或 netcoreapp3.1-windows --> ``` --- #### 2. **添加 NuGet 包显式引用** 通过 NuGet 安装官方包: ```bash Install-Package System.Data.OleDb ``` 或在 `.csproj` 中添加: ```xml <ItemGroup> <PackageReference Include="System.Data.OleDb" Version="6.0.0" /> </ItemGroup> ``` --- #### 3. **替代方案(跨平台推荐)** | 数据库类型 | 替代方案 | |------------------|--------------------------------------------------------------------------| | **SQL Server** | 使用 `Microsoft.Data.SqlClient` | | **Excel/Access** | 改用 [NPOI](https://github.com/nissl-lab/npoi) 或 [ClosedXML](https://github.com/ClosedXML/ClosedXML) | | **ODBC 数据源** | 使用 `System.Data.Odbc` | | **通用方案** | 迁移到 Entity Framework Core + 数据库专用提供程序 | **示例:ODBC 替代 OleDb** ```csharp // 原 OleDb 连接 // var conn = new OleDbConnection("Provider=SQLOLEDB;..."); // 改用 ODBC using var conn = new OdbcConnection("Driver={SQL Server};Server=..."); conn.Open(); ``` --- #### 4. **平台兼容性处理** 添加运行时条件检查: ```csharp if (!OperatingSystem.IsWindows()) { throw new NotSupportedException("OleDb requires Windows"); } // 否则正常使用 OleDb ``` --- #### 5. **迁移到 Entity Framework Core** 长期解决方案(支持跨平台): ```bash Install-Package Microsoft.EntityFrameworkCore.SqlServer ``` ```csharp services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default"))); ``` > **关键原因**:OleDb 依赖 Windows 的 COM 组件,在 Linux/macOS 或 .NET 5+ 的轻量化运行时中不可用[^1]。微软官方建议在新项目中避免使用 OleDb。 --- ### 相关问题 1. 如何在 Linux 上连接 Access 数据库? 2. Entity Framework Core 与 ADO.NET 的性能对比? 3. 如何迁移 OleDb 代码到 ODBC? 4. .NET 7 中是否支持 Jet OLEDB 驱动? 5. 使用 NPOI 操作 Excel 的最佳实践? [^1]: 微软官方文档指出:`System.Data.OleDb` 在 .NET Core 中仅限 Windows 平台使用,且部分功能(如 Jet OLEDB)已弃用。详见 [OleDb 平台兼容性说明](https://docs.microsoft.com/en-us/dotnet/api/system.data.oledb)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值