我现在做了什么,哪个有效:
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更快/更容易,并且它有一个属性或可以为我检查它的东西。
编辑: 我已经添加了一个答案,我仍然想知道是否有更好的解决方案,即使它适用于我目前的目的。它不会考虑扩展应该是模板文件。
答案 0 :(得分: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;
}
没有做过任何广泛的测试,但已经为我当前的文件工作了。
如果有人有一个很好的解决方案,我会将问题保持打开状态。
答案 1 :(得分:0)
根据我对OpenXMLSDK2的体验,它对于操作文档的xml内部更有用。如果您只需要扩展类型,那么为什么不使用:
string extension = System.IO.Path.GetExtension(filename);
值得注意的是try catch对于确定外部细节来说是一种昂贵的方法,因为它需要所有异常细节,堆栈跟踪以及catch块。
Excel的扩展类型是.xslx而不是.xslt,即“可扩展样式表语言转换”
希望有所帮助!