从UWP读取和写入Excel

时间:2017-02-16 18:01:10

标签: excel uwp

我需要使用包含宏的现有Excel文件,我需要编写一些数据,激活一些宏,然后从我的UWP应用程序中读取excel文件的结果。 我需要避免使用任何商业库,获得所需结果的最佳方法是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

实际上使用像syncfusion这样的第三方库实现这一点可能是一个好方法。因为你避免使用任何你可能需要自己编写库的库,因为据我所知,目前根据this thread没有开放库。

excel文件格式.xlsx可以是.zip包,您应该能够将其解压缩,并且您会在文件夹中找到大量.xml格式文件。在uwp中,我们有用于读取xml文件的API。因此,您可以使用这些xml文件进行读写操作。

有关如何在uwp应用程序中解压缩文件,您应该可以使用ZipArchive类。例如,解压缩excel文件并获取一张表可能如下:

private async void btnopenfile_Click(object sender, RoutedEventArgs e)
{
    FileOpenPicker opener = new FileOpenPicker();
    opener.ViewMode = PickerViewMode.Thumbnail;
    opener.FileTypeFilter.Add(".xlsx");
    opener.FileTypeFilter.Add(".xlsm");
    StorageFile file = await opener.PickSingleFileAsync();
    if (file != null)
    {             
        using (var fileStream = await file.OpenReadAsync())
        {
            using (ZipArchive archive = new ZipArchive(fileStream.AsStream(), ZipArchiveMode.Read))
            {
                worksheet = this.GetSheet(archive, "sheet1");
            }
        }
    }
}

private XmlDocument GetSheet(ZipArchive archive, string sheetName)
{
    XmlDocument sheet = new XmlDocument();
    ZipArchiveEntry archiveEntry = archive.GetEntry("xl/worksheets/" + sheetName + ".xml");

    using (var archiveEntryStream = archiveEntry.Open())
    {
        using (StreamReader reader = new StreamReader(archiveEntryStream))
        {
            string xml = reader.ReadToEnd();

            txtresult.Text = xml;
            sheet.LoadXml(xml);
        }
    }

    return sheet;
}

有关如何读取和写入xml文件,您可以参考XmlDocument官方样本。例如,您可能需要通过代码读取一个节点,如下所示(此方法不直接读取工作表中的值,而是读取值地址):

  private string ReadCell(XmlDocument worksheet, string cellAddress)
  {
      string value = string.Empty;
      XmlElement row = worksheet.SelectSingleNodeNS("//x:c[@r='" + cellAddress + "']", "xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"") as XmlElement;
      if (row != null)
      {
          value = row.InnerText;
      }
      return value;
  }

您可以参考this thread上的完整阅读样本。更多细节请自行开发。