2017-02-16 71 views
0

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

谢谢

回答

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在完整阅读样品可以参考。更详细的功能请自行开发。

+0

谢谢您的建议,我已经尝试过WinRT解决方案,但问题是我需要触发Excel文件中的公式和宏,读取或写入zip内的xml不会触发任何东西... – BitFlow