dt icon indicating copy to clipboard operation
dt copied to clipboard

IsLegal WASM打开Excel文件失败

Open sunl158 opened this issue 3 years ago • 1 comments

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; }

sunl158 avatar Oct 08 '22 02:10 sunl158

在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类型下手!

Daoting avatar Oct 09 '22 08:10 Daoting