Code Bye

C# WorkBooks.Open打开已有excel修改后不能保存

 

采用app.WorkBooks.Open(filePath,missing……);方式打开了,在这之前也杀了excel进程,确实打开了,并在某单元格修改了。

最后使用SaveCopyAs或SaveAs(保存的路径与名称与打开的一样)都会报错:1、某程序正在使用  2、工作薄与当前打开的工作薄同名

名称改成与打开的excel文件不一样就能保存。

请问:想保存一样的excel名称,怎么解决这个问题?

#2

15分

直接save呗,

就是保存和另存为的区别

#3
用save还真解决了。

还提个问题:如何找到excel中已有数据的最后一行?

#4
那要看你用的什么方式读excel了

如果是用oledb,你只能先select出来,变成datatable,然后判断datatable的行数,再返回头去操作excel

如果是用NPOI,有属性直接可以找到,FirstRow,LastRow

#5

5分

此外,excel里的行数,和通常所说的行数,有可能是不一样的

比如你在excel里添加了100行,然后直接删除数据,但并没有删除行

那么读出来的时候,还是会认为里面有100行数据,虽然每个单元格都是空字符串

如果你要判断有效数据的最后一行,只能从最后往前循环,看到哪一行数据不为空

#6
对excel数据转换格式后保存文件

private void btn_Excel_Click(object sender, EventArgs e)

{

if (dgv_Info.Rows.Count == 0)//判断是否有数据

return;//返回

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//实例化Excel对象

excel.Application.Workbooks.Add(true);//在Excel中添加一个工作簿

excel.Visible = true;//设置Excel显示

//生成字段名称

for (int i = 0; i < dgv_Info.ColumnCount; i++)

{

excel.Cells[1, i + 1] = dgv_Info.Columns[i].HeaderText;//将数据表格控件中的列表头填充到Excel中

}

//填充数据

for (int i = 0; i < dgv_Info.RowCount – 1; i++)//遍历数据表格控件的所有行

{

for (int j = 0; j < dgv_Info.ColumnCount; j++)//遍历数据表格控件的所有列

{

if (dgv_Info[j, i].ValueType == typeof(string))//判断遍历到的数据是否是字符串类型

{

excel.Cells[i + 2, j + 1] = ““” + dgv_Info[j, i].Value.ToString().Trim() + “””;//格式化为字符串类型并填充Excel表格

}

else if (dgv_Info[j, i].ValueType == typeof(Int16) || dgv_Info[j, i].ValueType == typeof(Int32))//判断遍历到的数据是否是16位或者32位数字类型

{

excel.Cells[i + 2, j + 1] = Convert.ToInt32(dgv_Info[j, i].Value).ToString(“N”);//格式化为32位数字类型并填充Excel表格

}

else if (dgv_Info[j, i].ValueType == typeof(Int64))//判断遍历到的数据是否是64位数字类型

{

excel.Cells[i + 2, j + 1] = Convert.ToInt64(dgv_Info[j, i].Value).ToString(“N”);//格式化为64位数字类型并填充Excel表格

}

else if (dgv_Info[j, i].ValueType == typeof(DateTime))//判断遍历到的数据是否是日期类型

{

excel.Cells[i + 2, j + 1] = Convert.ToDateTime(dgv_Info[j, i].Value).ToLongDateString();//格式化为长日期形式并填充Excel表格

}

else

{

excel.Cells[i + 2, j + 1] = dgv_Info[j, i].Value.ToString();//填充Excel表格

}

}

}

}

#7
是不是用只读打开的?

请参看下:http://blog.163.com/liuqiuliang_yss.popo/blog/static/4581691020096652816495/

#8
用的下面的语句获得了excel使用了的行数
                    Range range = sheet.UsedRange;
                    

                    int usedRowCount = range.Rows.Count;
                    

#10
你是如何解决的,可否指点一下?excel文件已经被打开了,表示被占用,如果编辑后再打开会提示被占用。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# WorkBooks.Open打开已有excel修改后不能保存