UWP OpenXML 未将更改写入电子表格文档

我有一个 UWP 应用程序。我从 SharePoint 驱动器中取出一个 excel 文件,将其更改为字节数组,然后将其保存到我的硬盘驱动器中。


编辑

所以我意识到此时我已经打开了文件,因此无需再次打开它。所以我做了一些修改(这次是全班):


class FileHelper

{

    public static string saveLocation;

    public static SpreadsheetDocument spreadsheetDoc;


    public static async void GetFileAsync()

    {

        var (authResult, message) = await Authentication.AquireTokenAsync();

        var httpClient = new HttpClient();

        HttpResponseMessage response;

        var request = new HttpRequestMessage(HttpMethod.Get, MainPage.fileurl);

        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);

        response = await httpClient.SendAsync(request);

        byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();

        StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);

        string saveFolder = videoLibrary.SaveFolder.Path;

        string saveFileName = App.Date + "-" + App.StartTime + "-" + App.IBX + "-" + App.Generator + ".xlsx";

        saveLocation = saveFolder + "\\" + saveFileName;


        using (MemoryStream stream = new MemoryStream())

        {

            stream.Write(fileBytes, 0, (int)fileBytes.Length);

            using (spreadsheetDoc = SpreadsheetDocument.Open(stream, true))

            {

                UpdateCell(spreadsheetDoc, App.Date, 2, "D");


                await Task.Run(() =>

                {

                    File.WriteAllBytes(saveLocation, stream.ToArray());

                });

            }

        }           

    }


写入文件,但不使用 UpdateCell() 调用的数据输入更新文件。


紫衣仙女
浏览 162回答 1
1回答

元芳怎么了

好的....这就是我最终的结果。它可能不漂亮,但它确实有效。首先,我更改了单击事件以将更新与模板文件的传输分开。&nbsp; &nbsp; private async void FileButton_Click(object sender, RoutedEventArgs e)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await FileHelper.GetFileAsync();&nbsp; &nbsp; &nbsp; &nbsp; await FileHelper.UpdateCell(FileHelper.saveLocation, App.Date, 2, "D");&nbsp; &nbsp; &nbsp; &nbsp; await FileHelper.UpdateCell(FileHelper.saveLocation, App.Maximo, 3, "D");&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; await FileHelper.UpdateCell(FileHelper.saveLocation, App.StopHours, 26, "J");&nbsp; &nbsp; }然后我将 GetFileAsync() 和 UpdateCell() 都更新为 Task 而不是 void。然后,当我得到 await Task.Run 时,我添加了一个返回 TaskStatus.RanToCompletion。class FileHelper{&nbsp; &nbsp; public static string saveLocation;&nbsp; &nbsp; public static SpreadsheetDocument spreadsheetDoc;&nbsp; &nbsp; public static async Task GetFileAsync()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var (authResult, message) = await Authentication.AquireTokenAsync();&nbsp; &nbsp; &nbsp; &nbsp; var httpClient = new HttpClient();&nbsp; &nbsp; &nbsp; &nbsp; HttpResponseMessage response;&nbsp; &nbsp; &nbsp; &nbsp; var request = new HttpRequestMessage(HttpMethod.Get, MainPage.fileurl);&nbsp; &nbsp; &nbsp; &nbsp; request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);&nbsp; &nbsp; &nbsp; &nbsp; response = await httpClient.SendAsync(request);&nbsp; &nbsp; &nbsp; &nbsp; byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();&nbsp; &nbsp; &nbsp; &nbsp; StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);&nbsp; &nbsp; &nbsp; &nbsp; string saveFolder = videoLibrary.SaveFolder.Path;&nbsp; &nbsp; &nbsp; &nbsp; string saveFileName = App.Date + "-" + App.StartTime + "-" + App.IBX + "-" + App.Generator + ".xlsx";&nbsp; &nbsp; &nbsp; &nbsp; saveLocation = saveFolder + "\\" + saveFileName;&nbsp; &nbsp; &nbsp; &nbsp; using (MemoryStream stream = new MemoryStream())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stream.Write(fileBytes, 0, (int)fileBytes.Length);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; using (spreadsheetDoc = SpreadsheetDocument.Open(stream, true))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await Task.Run(() =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File.WriteAllBytes(saveLocation, stream.ToArray());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return TaskStatus.RanToCompletion;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; public async static Task UpdateCell(string docName, string text,&nbsp; &nbsp; &nbsp; &nbsp; uint rowIndex, string columnName)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);&nbsp; &nbsp; &nbsp; &nbsp; string saveFolder = videoLibrary.SaveFolder.Path;&nbsp; &nbsp; &nbsp; &nbsp; string saveFileName = App.Date + "-" + App.StartTime + "-" + App.IBX + "-" + App.Generator + ".xlsx";&nbsp; &nbsp; &nbsp; &nbsp; saveLocation = saveFolder + "\\" + saveFileName;&nbsp; &nbsp; &nbsp; &nbsp; await Task.Run(() =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; using (spreadsheetDoc = SpreadsheetDocument.Open(saveLocation, true))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WorksheetPart worksheetPart =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetWorksheetPartByName(spreadsheetDoc, "GenRun");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (worksheetPart != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cell cell = GetCell(worksheetPart.Worksheet,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; columnName, rowIndex);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cell.CellValue = new CellValue(text);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cell.DataType =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new EnumValue<CellValues>(CellValues.String);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worksheetPart.Worksheet.Save();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return TaskStatus.RanToCompletion;&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; private static WorksheetPart&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetWorksheetPartByName(SpreadsheetDocument document,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;string sheetName)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; IEnumerable<Sheet> sheets =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.WorkbookPart.Workbook.GetFirstChild<Sheets>().&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Elements<Sheet>().Where(s => s.Name == sheetName);&nbsp; &nbsp; &nbsp; &nbsp; if (sheets.Count() == 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; string relationshipId = sheets.First().Id.Value;&nbsp; &nbsp; &nbsp; &nbsp; WorksheetPart worksheetPart = (WorksheetPart)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.WorkbookPart.GetPartById(relationshipId);&nbsp; &nbsp; &nbsp; &nbsp; return worksheetPart;&nbsp; &nbsp; }&nbsp; &nbsp; private static Cell GetCell(Worksheet worksheet,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string columnName, uint rowIndex)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Row row = GetRow(worksheet, rowIndex);&nbsp; &nbsp; &nbsp; &nbsp; if (row == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; &nbsp; return row.Elements<Cell>().Where(c => string.Compare&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(c.CellReference.Value, columnName +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rowIndex, true) == 0).First();&nbsp; &nbsp; }&nbsp; &nbsp; private static Row GetRow(Worksheet worksheet, uint rowIndex)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return worksheet.GetFirstChild<SheetData>().&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Elements<Row>().Where(r => r.RowIndex == rowIndex).First();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP