Linux下执行C# SpreadsheetGear AutoFit报错System.Drawing.Common不支持
解决方案
方法1:启用System.Drawing.Common跨平台支持(仅适用于.NET 6及更早版本)
报错核心原因是AutoFit()依赖System.Drawing.Common库,该库在.NET Core/.NET 5+的非Windows平台默认禁用。对于.NET 6及更早版本,可通过项目配置重新启用:
在你的项目文件(.csproj)中添加以下配置:
<PropertyGroup> <!-- 指定目标Linux运行时 --> <RuntimeIdentifier>linux-x64</RuntimeIdentifier> <!-- 启用Unix平台的System.Drawing支持 --> <System.Drawing.EnableUnixSupport>true</System.Drawing.EnableUnixSupport> </PropertyGroup>
注意:.NET 7及以上版本已彻底移除该配置选项,此方法不再适用。
方法2:手动实现列宽自适应(跨平台通用)
绕过依赖Windows GDI+的AutoFit(),手动计算每列最大内容宽度并设置列宽:
using SpreadsheetGear; // 假设worksheet是你的IWorksheet实例 IRange usedRange = worksheet.UsedRange; // 遍历每一列 for (int colIndex = usedRange.Column; colIndex <= usedRange.Column + usedRange.ColumnCount - 1; colIndex++) { double maxColumnWidth = 8.43; // 默认列宽 IRange column = worksheet.Columns[colIndex]; IRange columnCells = usedRange.Columns[colIndex - usedRange.Column + 1]; foreach (IRange cell in columnCells) { if (cell.Value == null) continue; string cellText = cell.Text; if (string.IsNullOrWhiteSpace(cellText)) continue; // 近似计算文本宽度:以常规11号字体为例,每个字符约占1.2个宽度单位,加边距 double calculatedWidth = cellText.Length * 1.2 + 2; if (calculatedWidth > maxColumnWidth) { maxColumnWidth = calculatedWidth; } } // 设置最终列宽 column.Width = maxColumnWidth; }
若需更精确的宽度计算,可引入跨平台字体渲染库(如SixLabors.Fonts),加载对应字体后测量文本实际像素宽度,再转换为SpreadsheetGear的列宽单位(1单位≈1/72英寸)。
方法3:尝试SpreadsheetGear的SkiaSharp兼容配置(针对2023版本)
部分新版本SpreadsheetGear支持用SkiaSharp替代System.Drawing作为渲染后端,可尝试以下步骤:
- 在项目中安装SkiaSharp NuGet包:
dotnet add package SkiaSharp
- 初始化SpreadsheetGear时指定使用SkiaSharp(需确认API支持):
// 检查SpreadsheetGear是否提供相关配置选项 SpreadsheetGear.Configuration.SetDefaultGraphicsEngine(typeof(SkiaSharpGraphicsEngine));
注意:此功能需确认你的SpreadsheetGear 2023版本是否支持,若官方文档未提及,可联系技术支持确认。
内容的提问来源于stack exchange,提问作者Robin Jackson
相关产品推荐
相关产品推荐

