4

我正在尝试打开(或创建新的 xls)Excel 文件并向其中写入一些值。虽然,如果我只是创建一个新的 xls 文件,下面的程序就可以正常工作,但我遇到了一些问题

**mWorkBook = oXL.Workbooks.Open (path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);**

这是错误:无法访问“LOG.xls”。该文件可能已损坏、位于没有响应的服务器上或只读。它不是只读的,也没有损坏(因为有时文件是在运行时创建的)。那有什么问题呢?

private static Microsoft.Office.Interop.Excel.Workbook mWorkBook;
    private static Microsoft.Office.Interop.Excel.Sheets mWorkSheets;
    private static Microsoft.Office.Interop.Excel.Worksheet mWSheet1;
    private static Microsoft.Office.Interop.Excel.Application oXL;

    private void btnSignIn_Click ( object sender, EventArgs e )
    {

        string path = "D:\\LOG.xls";
        if(!File.Exists(path))
        {
            File.Create (path);
        }


        oXL = new Microsoft.Office.Interop.Excel.Application ();
        oXL.Visible = true;
        oXL.DisplayAlerts = false;
        //error on this line
        mWorkBook = oXL.Workbooks.Open (path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

        //Get all the sheets in the workbook
        mWorkSheets = mWorkBook.Worksheets;

        //Get the allready exists sheet
        mWSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)mWorkSheets.get_Item ("Sheet1");

        Microsoft.Office.Interop.Excel.Range range = mWSheet1.UsedRange;

        int colCount = range.Columns.Count;
        int rowCount = range.Rows.Count;

        for ( int index = 1; index < 15; index++ )
        {
            mWSheet1.Cells [rowCount + index, 1] = rowCount + index;
            mWSheet1.Cells [rowCount + index, 2] = "New Item" + index;
        }

        mWorkBook.SaveAs (path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
        Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value);

        mWorkBook.Close (Missing.Value, Missing.Value, Missing.Value);
        mWSheet1 = null;

        mWorkBook = null;

        oXL.Quit ();
        GC.WaitForPendingFinalizers ();
        GC.Collect ();
        GC.WaitForPendingFinalizers ();
        GC.Collect ();
    }
4

2 回答 2

8

这里的使用File.Create不合适。它返回 (Blank) FileStream,而不是 Excel 文件(使用 .xls 定义路径不会创建 Excel 文件...)。

而且由于您没有关闭并处置它,因此当您尝试打开它时会出现异常,因为它已经在使用中(即使您释放它也会以任何方式出现异常,因为您尚未创建 Excel 文件在这个阶段)。

因此,如果工作簿存在,您可以使用oXL.Workbooks.Open. 如果工作簿不存在,必须使用 : oXL.Workbooks.Add() 创建它,然后调用mWorkBook.SaveAs(...)方法来真正创建它。

oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = true;
oXL.DisplayAlerts = false;

string path = "D:\\LOG.xls";
if (!File.Exists(path)) 
{
    mWorkBook = oXL.Workbooks.Add;
} 
else
{
    mWorkBook = oXL.Workbooks.Open(path, 0, false, 5, "", "", false,    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true,
        false, 0, true, false, false);
}

(希望 VB=>C# 是正确的!)

在您的SaveAs方法中,如果要创建特定版本的 Excel 文件,则必须设置正确FileFormat(再次在路径中设置 .xls 是不够的......)

可选对象。保存文件时使用的文件格式。有关有效选项的列表,请参阅 FileFormat 属性。对于现有文件,默认格式是最后指定的文件格式;对于新文件,默认为正在使用的 Excel 版本的格式

希望这可以帮助。

于 2013-06-04T22:41:58.307 回答
1

如果工作簿不存在,创建一个更好的方法是:

Excel.Workbook newWorkbook = excelApplication.Workbooks.Add();

File.Create() 返回一个 FileStream 的实例,如果你想访问该文件,你需要关闭它。你可以改变..

    if(!File.Exists(path))
    {
        File.Create (path);
    }

    if(!File.Exists(path))
    {
        File.Create (path).Close();
    }
于 2013-05-23T19:36:58.180 回答