我正在尝试开发一个扩展方法,它使用excel interop并将任何给定的输入文件转换为一个新的文件,与另一个xlfileFormat输入参数一致。
到目前为止我发现的问题是SaveAs方法绕过我设置的任意扩展,并根据xlFileFormat选项设置它。
例如:
xlFileFormat = xlCsv,fileName = foo.arbitrary =>将其保存为 foo.arbitrary.csv
xlFileFormat = xlExcel8,fileName = extensionLessFoo =>保存它 作为extensionLessFoo.xls
xlFileFormat = xlOpenWorkbook,fileName = foo.xlsx =>保存为foo.xlsx(这个没问题)
我已经能够通过指定基于GUID的随机文件名并将此名称作为SaveAs FileName 参数引入来解决此问题。稍后,我将阅读最终输入工作簿 fullName ,并返回最近创建的FileInfo
我不想依赖临时文件,但允许指定文件名 AND 扩展名。到目前为止,SaveCopyAs和SaveAs也没有为我提供适当的解决方案。
到目前为止,这种方法一直在发展:
public static FileInfo InteropConvertTo(this FileInfo inputFile, XlFileFormat format)
{
var outputFileName = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Random SaveAs File -" + System.Guid.NewGuid().ToString());
var outputFile = new FileInfo(outputFileName);
try
{
//creation of a new, silent application
var hiddenApp = new Application();
hiddenApp.Visible = false;
hiddenApp.ScreenUpdating = false;
hiddenApp.DisplayAlerts = false;
//adding workbook, saving as new format, closing
var inputWorkbook = hiddenApp.Workbooks.Add(inputFile);
inputWorkbook.DoNotPromptForConvert = true;
inputWorkbook.SaveAs(Filename: outputFileName,
FileFormat: format , AccessMode:XlSaveAsAccessMode.xlNoChange, CreateBackup: false);
outputFile = new FileInfo(inputWorkbook.FullName);
outputFile.IsReadOnly = false;
xlWorkBook.Close(false);
xlApp.Quit();
releaseObject(hiddenApp );
releaseObject(inputWorkbook);
}
finally
{
GC.Collect();
}
return outputFile;
}
private static void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
}
catch (Exception ex)
{
}
finally
{
obj = null;
GC.Collect();
}
}
有没有办法使用SaveAs强制你自己的输出文件扩展名?