Interop SaveAs绕过输入文件扩展名

时间:2015-03-26 15:20:03

标签: c# .net excel excel-interop

我正在尝试开发一个扩展方法,它使用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强制你自己的输出文件扩展名?

0 个答案:

没有答案