Daoting / dt

利用 C# + XAML 进行快速业务开发的跨平台框架(搬运工)
https://github.com/daoting/dt
54 stars 12 forks source link

IsLegal WASM打开Excel文件失败 #75

Open sunl158 opened 1 year ago

sunl158 commented 1 year ago

Dt.Xls\Biff\CompoundFile.cs public static bool IsLegal(Stream stream) { bool flag = false; BinaryReader reader = new BinaryReader(stream); try { ulong num = reader.ReadUInt64(); if (num == 16220472316735377360L) flag = true; } catch(Exception ex) { This stream is asynchronous-only' } reader.BaseStream.Seek(0L, (SeekOrigin) SeekOrigin.Begin); return flag; }

Daoting commented 1 year ago

在wasm上StorageFile由uno实现

        async void OpenFile(object sender, RoutedEventArgs e)
        {
            var filePicker = Kit.GetFileOpenPicker();
            filePicker.FileTypeFilter.Add(".xls");
            filePicker.FileTypeFilter.Add(".xlsx");
            filePicker.FileTypeFilter.Add(".xml");
            StorageFile storageFile = await filePicker.PickSingleFileAsync();
            if (storageFile != null)
            {
                var stream = await storageFile.OpenStreamForReadAsync();
                if (storageFile.FileType.ToLower() == ".xml")
                    await _excel.OpenXml(stream);
                else
                    await _excel.OpenExcel(stream, GetOpenFlag());
                stream.Dispose();
            }
        }

最终提供给IsLegal(Stream stream)的类型为Uno.Storage.Streams.Internal.RentedStream,内部stream类型为Uno.Storage.Streams.Internal.NativeReadStream,参见:https://github.com/unoplatform/uno/blob/4c3f809ed5ebe7837e28b91fca4b0b4cc476a8e8/src/Uno.UWP/Storage/Streams/Internal/NativeReadStream.wasm.cs#L68 未实现Read同步方法,而BinaryReader未提供异步方法! 不只是此一处,后续所有文件流的读取都会出错! Dt.Xls是稳定的不会大调整。

目前要实现该功能只能从选择文件后的Stream类型下手!