我正在尝试打开(或创建一个新的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 ();
}
答案 0 :(得分:8)
此处使用File.Create
并不合适。它返回一个(空白)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 =&gt; C#是正确的!)
在您的SaveAs方法中,如果要创建特定版本的Excel文件,则必须设置正确的FileFormat
(再次设置.xls路径还不够......)
可选对象。保存文件时使用的文件格式。为一个 有效选择列表,请参阅FileFormat属性。对于现有的 文件,默认格式是指定的最后一种文件格式; 换一个新的 file,默认为正在使用的Excel版本的格式。
希望这有帮助。
答案 1 :(得分: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();
}