【问题标题】:Why does the supposedly-saved file not really get saved?为什么应该保存的文件没有真正保存?
【发布时间】:2015-10-27 17:35:20
【问题描述】:

以下代码取自this tutorial,用于使用 C# 创建和保存 Excel 文件:

using Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsAppExcelTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonCreateExcelFile_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;
            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
            xlWorkBook.SaveAs("csharp-Excel.xls",
                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);
            MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls"); 
        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        } 
    } // class
} // namespace

它似乎运行良好——我看到了 MessageBox 消息,我可以单步执行它而没有任何问题的迹象。但是该文件没有按原样保存到硬盘驱动器中。为什么不呢?

【问题讨论】:

  • 消息说什么?你想在哪里保存? Windows 默认设置将阻止您保存到 C 的根目录,除非您以管理员身份运行 Visual Studio。
  • 一切尽在代码中;消息是“Excel 文件已创建,您可以找到文件 c:\\csharp-Excel.xls”;它将它保存到根目录,因为在 SaveAs() 调用中没有给出文件夹。无论如何,它应该是,除非我错过了什么。
  • 我误会了,我以为catch中的消息框正在显示。尝试右键单击 Visual Studio 并说以管理员身份运行,看看是否有帮助。或者指定一个路径,比如你的桌面。

标签: c# excel office-interop excel-interop ole-automation


【解决方案1】:

保存到特定的非根位置(子文件夹)有效,例如这个:

String savefullpath = @"C:\misc\csharpExcelTest.xls";
    xlWorkBook.SaveAs(savefullpath,
        Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue,
        Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

文件确实保存到了那个位置。

显然唯一的问题是试图保存到 C/root。甚至尝试显式保存到 root,如下所示:

String savefullpath = @"C:\csharpExcelTest.xls";

...(而不是简单地提供一个裸文件名)失败了,告诉我:

System.Runtime.InteropServices.COMException was unhandled
  HelpLink=C:\Program Files (x86)\Microsoft Office\Office12\1033\XLMAIN11.CHM
  HResult=-2146827284
  Message=Microsoft Office Excel cannot access the file 'C:'. There are several possible reasons:

• The file name or path does not exist.
• The file is being used by another program.
• The workbook you are trying to save has the same name as a currently open workbook.
    . . .

所以:保存到 root 以外的其他地方以避免这个问题。

更新

另外,当我没有提供文件夹/完整路径时,它似乎被保存到我的“文档库”中,并假设它将它保存到 C:。我今天早上碰巧查看了那个文件夹,并在那里看到了文件。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2014-01-07
    • 2022-01-09
    • 2017-02-11
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多