在 UWP 中使用 OPEN-XML SDK 生成 Doc 文件

Generate Doc file using OPEN-XML SDK in UWP

我想在我的 UWP 应用程序中创建一个 Microsoft Word 文档,并且我已经在应用程序本地文件夹中成功创建了文档文件。但我想在用户选择的特定文件夹位置创建此文档文件。

I mean user browse a location and then create doc file into that location.

这是我在 App 本地路径中创建 Doc 文件的代码:

  string docFileName = "TestDoc.docx";
  Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

  string Filepath = localFolder.Path + "\" + docFileName;

  using (var wordprocessingDocument = WordprocessingDocument.Create(file.Path, DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
  {
      MainDocumentPart mainPart = wordprocessingDocument.AddMainDocumentPart();
      mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document();
      Body body = mainPart.Document.AppendChild(new Body());
      DocumentFormat.OpenXml.Wordprocessing.Paragraph para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph());
      DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
      run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("Hello !!! ."));
      wordprocessingDocument.MainDocumentPart.Document.Save();
  }

尝试在如下特定位置创建 doc 文件时出现以下错误:

错误

Message=The media is write protected : 'D:\Training\TestDoc.docx'

代码

string path = @"D:\Training\TestDoc.docx";

using (var wordprocessingDocument = WordprocessingDocument.Create(path, DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
{
    MainDocumentPart mainPart = wordprocessingDocument.AddMainDocumentPart();
    mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document();
    Body body = mainPart.Document.AppendChild(new Body());
    DocumentFormat.OpenXml.Wordprocessing.Paragraph para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph());
    DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
    run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("Hello !!! ."));
    wordprocessingDocument.MainDocumentPart.Document.Save();
}

因为 UWP 应用程序 运行 在沙箱中,您无法使用经典 APIs 直接访问文件系统路径。但是,您可以使用 Windows.Storage API 来执行此操作。

让用户选择保存文件

如果想让用户选择保存文件,可以使用FileSavePickerAPI。 This Docs page 详细描述了这一点。完成后,API 会给你一个 StorageFile 实例,你可以使用它。

写入文件

由于您不能使用将文件路径作为参数的 Create 方法,因此您需要使用基于 Stream 的方法。

要从文件中获取 Stream 实例,请将 using System.IO; 添加到代码文件的顶部,然后执行:

using(var stream = await file.OpenStreamForWriteAsync())

使用此流,您可以执行以下操作:

using (var wordprocessingDocument =
               WordprocessingDocument.Create(
                  stream, WordprocessingDocumentType.Document))
{
      //... your code
}

注意:广泛的文件系统访问

如果您确实需要在任意(不是用户选择的)位置创建文件,您可以使用 broadFileSystemAccess capability。然而,这仅适用于真正需要它的应用程序。请注意,即使具有此功能,您仍然需要使用 StorageFileStorageFolder API 执行所有文件操作。