我刚刚开始在VisualStudio2022预览版中使用Xamarin开发。我正在开发一个读取Excel或CSV文件的应用程序,为此我选择使用ExcelDataReader。
尽管遵循了按照文档添加对CodePages的支持的指导方针,但我仍然收到1252编码的"NotSupportedException“。我已经尝试了很多方法,但仍然无法解决这个问题,有人看到了这个问题并设法找到了解决方案吗?
从Visual中提供的Xamarin窗体模板开始我的项目,我添加了一个页面,顶部有一个按钮,下面有一个列表的空间。按钮启动一个文件选择器,允许用户选择他们的excel文件。然后,filepath被传递给数据服务对象,该对象将打开文件并将其读取到dataset中,直到读取该文件为止。我可能补充说,我尝试过.xlsx和.csv文件,并使用Xamarin.Essentials FilePicker来选择存储在Google上的文件(现在本地存储在Android仿真文件中)。
使用Nuget包管理器控制台,我添加了对ExcelDatareader、ExcelDataReader.Dataset扩展和System.Text.Encoding.CodePages (版本6)的引用。这反映在项目依赖项中。

我已经将注册行添加到App构造函数中。
public App()
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
InitializeComponent();
DependencyService.Register<MockDataStore>();
DependencyService.Register<WasteDataStore>(); // My Data store
MainPage = new AppShell();
}这里是我的数据存储区中的文件读取方法。
private async Task<DataSet> ReadXlsx(string filePath)
{
DataSet data = new DataSet();
try
{
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // Uncommenting here has no effect.
using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
{
// Fails here with System.NotSupportedException Encoding 1252 data could not be found.
using (var reader = ExcelReaderFactory.CreateReader(stream, new
ExcelReaderConfiguration(){ FallbackEncoding = Encoding.GetEncoding(1252)}))
{
data = reader.AsDataSet(new ExcelDataSetConfiguration()
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{ UseHeaderRow = true }});
}
}
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
return await Task.FromResult(data);
}我尝试过较早版本的ExcelDataReader和CodePages,并在ReadXlsx函数中放置了注册行。我也尝试使用"dotnet还原“,它运行正常,但没有明显的效果。
我之所以想保留ExcelDataReader,是因为我喜欢使用AsDataSet特性的想法,而不是编写自己的特性。在这方面的任何帮助都将是很棒的,并且提前感谢。
发布于 2022-08-30 14:11:31
来自https://github.com/ExcelDataReader/ExcelDataReader#important-note-on-net-core
若要修复,请向包System.Text.Encoding.CodePages添加依赖项,然后在应用程序初始化期间添加代码以注册代码页提供程序。
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);https://stackoverflow.com/questions/69955620
复制相似问题