Excel.Workbook.SaveAs()在C#中单击“否”进行文件替换时抛出异常

问题描述 投票:0回答:1

我的小型控制台工具尝试读取excel文件并根据设置标准创建新文件。

问题:当存在文件名冲突(文件已存在且具有相同名称)时,程序应生成具有唯一名称的文件。但现在一条消息出现“是/否/取消”消息框以保存文件。如果用户单击否则抛出异常。消息如下:

A file named 'D:\sample.xls' already exists in this location. Do you want to replace it? 

例外:

A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in ExcelSplitter.exe

Additional information: Exception from HRESULT: 0x800A03EC

以下行抛出异常

xlWorkBook.SaveAs(fileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 

代码如下:

    private bool WriteToExcel(String fileName, List<RowEntity> headerRowObj, List<RowEntity> dataRowObj)
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook = null;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.ApplicationClass();

        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        int headerRowTotal = 0;

        for (int i = 0; i < headerRowObj.Count; i++)
        {
            for (int j = 0; j < headerRowObj[i].ColumnValues.Count; j++)
            {
                xlWorkSheet.Cells[i + 1, j + 1] = headerRowObj[i].ColumnValues[j].ToString();
            }
            headerRowTotal++;
        }

        for (int i = 0; i < dataRowObj.Count; i++)
        {
            for (int j = 0; j < dataRowObj[i].ColumnValues.Count; j++)
            {
                xlWorkSheet.Cells[headerRowTotal + i + 1, j + 1] = dataRowObj[i].ColumnValues[j].ToString();
            }
        }

        if (IsExcelFileOpen(xlWorkBook))
        {
            errorList.Add(Error.GetError(-7));
            return false;
        }
        else
        {
            xlWorkBook.SaveAs(fileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

        }

        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        ReleaseObject(xlWorkSheet);
        ReleaseObject(xlWorkBook);
        ReleaseObject(xlApp);

        return true;
    }

以下方法调用上述方法:

 private int SeparateExcleFiles(int headerLines, int groupOnColumn, string outputPath, string inputFile, FileEntity fileObj, RowEntity rowObj)
    {
        List<RowEntity> headerRowObj = fileObj.RowValues.GetRange(0, headerLines);
        if (rowObj.ColumnValues.Count < groupOnColumn)
        {
            errorList.Add(Error.GetError(-6));
            return -6;
        }
        else
        {
            var dataRows = fileObj.RowValues.GetRange(headerLines, fileObj.RowValues.Count - (headerLines)).GroupBy(re => re.ColumnValues[groupOnColumn - 1]).ToList();

            for (int i = 0; i < dataRows.Count; i++)
            {
                var fileName = String.Format("{0}-{1}{2}", Path.GetFileNameWithoutExtension(inputFile), dataRows[i].Key.ToString(), Path.GetExtension(inputFile));
                var filePath = Path.Combine(outputPath, fileName);

                if (File.Exists(filePath))
                {
                    fileName = GetUniqueFilename(fileName);
                }

                if (WriteToExcel(filePath, headerRowObj, dataRows[i].ToList() as List<RowEntity>))
                {
                    System.Console.WriteLine("Wrote {0}", fileName);
                }
            }
            return 0;
        }
    }


 private bool IsExcelFileOpen(Workbook wBook)
    {
        Excel.Application exApp;
        exApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
        try
        {
            exApp.Workbooks.get_Item(wBook);
            return true;
        }
        catch (Exception)
        {
            return false;
        }

    }    

我在哪里做错了?

c# excel excel-interop comobject
1个回答
1
投票

你可以在saveas部分尝试这个吗?

try
{
    xlWorkBook.SaveAs(fileName, Excel.XlFileFormat.xlWorkbookNormal, misValue,     misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
}
catch(Exception e)
{
//BLANK (do nothing)
}

这将允许您处理异常,但如果您不想执行任何操作而只是不覆盖,则只需将处理过程留空即可。

拥有异常处理程序将让系统认为您已确认该事件并将让程序继续。

© www.soinside.com 2019 - 2024. All rights reserved.