2013-02-10 43 views
3

什麼,我都做了,現在,它的工作原理是這樣的:OpenXML文檔,你怎麼知道哪個是哪個,當沒有extention

private string DetermineOpenXML(string file) 
    { 

     try 
     { 
      SpreadsheetDocument doc = SpreadsheetDocument.Open(file, false); 
      doc.Close(); 
      return ".xslx"; 
     } 
     catch 
     { 
      try 
      { 
       WordprocessingDocument doc = WordprocessingDocument.Open(file, false); 
       doc.Close(); 
       return ".docx"; 
      } 
      catch 
      { 
       try 
       { 
        PresentationDocument doc = PresentationDocument.Open(file, false); 
        doc.Close(); 
        return ".pptx"; 
       } 
       catch 
       { 
        return string.Empty; 
       } 
      } 
     } 
    } 

我覺得必須有一個更好的辦法,看看有什麼這種文件不僅僅是試驗和錯誤。事情是,我正在研究一個小程序,它發現哪些文件擴展名文件應該有。我這樣做的原因是因爲我有一個數據庫中的文件,在這些文件中有時沒有擴展名,有時候擴展名不對。

我對這些文件所做的事情是,我發現所有OpenXML文檔都共享相同的文件簽名:「50 4B 03 04 14 00 06 00」,它接近於zip文件的簽名,而我也可以用zip程序打開OpenXML文件並查看其內容。也許這是我應該去的解決方案,我只是希望使用OpenXML SDK會更快/更容易,並且它擁有一個屬性或可以爲我檢查的屬性。

編輯: 我已經添加了答案,我仍然想看看是否有更好的解決方案,即使它適用於我當前的目的。它並沒有考慮到擴展應該是模板文件。

回答

3

我最終使用System.IO.Packaging代替。

private string anotherOpenXmlAttempt(string file) 
    { 
     string ext = string.Empty; 
     Package package = Package.Open(file); 
     if (package.PartExists(new Uri("/word/document.xml", UriKind.Relative))) 
     { 
      ext = ".docx"; 
     } 
     else if (package.PartExists(new Uri("/xl/workbook.xml", UriKind.Relative))) 
     { 
      ext = ".xslx"; 
     }else if (package.PartExists(new Uri("/ppt/presentation.xml", UriKind.Relative))) 
     { 
      ext = ".pptx"; 
     } 

     package.Close(); 
     return ext; 
    } 

havn't沒有做任何廣泛的測試,但已爲我目前的文件工作。

如果有人有一個很好的解決方案,我會留下問題。

+0

這是一個更好的方法來做到這一點。 – 2013-02-12 00:20:07

+0

是啊,也更快,但不考慮它是否是一個模板文件,在我的情況下它並不重要,因爲這些文件現在至少會是,因爲這些文件將在正確的程序中打開,但對於那些可能最終會出現相同的情況,需要模板才能做更多工作。 – 2013-02-12 07:55:10

+0

你有沒有找到比這更好的方法? – Jonah 2017-07-28 16:04:40

0

根據我對OpenXMLSDK2的經驗,它對於處理文檔的xml內部件更有用。如果你只需要擴展類型,那麼爲什麼不直接使用:

string extension = System.IO.Path.GetExtension(filename);

其值得注意的是,嘗試捕捉是剛剛確定的外部細節,因爲它需要所有的異常細節,堆昂貴的方法跟蹤塊等。

還Excel的擴展類型.xslx不.xslt,那就是「可擴展樣式表語言轉換」

希望幫助!

+0

dosn't只是給我我的擴展,從文件基本上filepath.Substring(LastIndexOf('。')),這將無法正常工作,因爲我沒有擴展,我正在尋找。 – 2013-02-10 20:28:31

+0

第二個效果更好,你甚至可以嘗試循環查找字符串「xl」,「word」,「ppt」等字符串中的部分。 'part.Uri.OriginalString.Split('/')[1] ==「ppt」'因爲它們總是以擴展類型開始,一旦擁有它就從循環中斷開。 – JoeKir 2013-02-12 01:12:31

+0

這聽起來像一個創造的想法,我相信第一部分的關鍵字之一是在索引2或3,所以會有非常短的循環 – 2013-02-12 07:57:53

相關問題