xamarin ExcelDataReader使用1252编码时出现问题

doinxwow  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(161)

我刚刚开始在Visual Studio 2022 Preview中开发Xamarin。我正在开发一个读取Excel或CSV文件的应用程序,为此我选择使用ExcelDataReader。
尽管按照文档中的指导方针添加了对CodePages的支持,但我仍然收到了1252编码的"NotSupportedException"。我尝试了很多方法,但仍然无法解决这个问题,有人看到过这个问题并设法找到了解决方案吗?
从Visual Studio提供的Xamarin Forms模板开始我的项目,我添加了一个页面,页面顶部有一个按钮,下面有一个列表空间,按钮启动一个文件选择器,允许用户选择他们的excel文件,然后将文件路径传递给一个数据服务对象,该对象打开文件并将其读入数据集,一切都很顺利,直到读取文件。我可能会补充说,我已经尝试了. xlsx和. csv文件,并使用Xamarin. Essentials FilePicker选择一个存储在我的Google Drive上的文件(现在在Android模拟器文件本地)。
使用Nuget包管理器控制台,我添加了对ExcelDataareader、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 Restore",它运行正常,但没有可见的效果。
我希望保留ExcelDataReader的原因是,我喜欢使用AsDataSet功能而不是自己编写功能的想法。如果能在这方面得到任何帮助,我将不胜感激。

8cdiaqws

8cdiaqws1#

来自https://github.com/ExcelDataReader/ExcelDataReader#important-note-on-net-core
若要修复此问题,请将依赖项添加到System.Text.Encoding.CodePages包,然后添加代码以在应用程序初始化期间注册代码页提供程序

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

相关问题