当EXCEL单元格处于编辑状态时,往单元格赋值会出现 HRESULT: 0x800A03EC 错误,原因是编辑时,EXCEL很多功能被禁用。
如何解决这个问题
方法1:赋值之前,将EXCLE文件保存一下
Excel.Worksheet ws;//excel工作薄中的工作表
Object missing = System.Reflection.Missing.Value;
ws.SaveAs("c://temp.xls", missing, missing, missing, missing, missing, missing, missing, missing, missing);
ws[3,4]="test";
方法2:
Excel中,如何在cell处于编辑状态时,对其用代码赋值
当我们用Winform程序去自动化Excel的时候,常常要实现这样的功能,给一个cell赋值,貌似很简单,得到range以后,设置它的Value2属性就可以了。但是还是会存在一个小问题,当你要赋值的cell正处于编辑状态的时候,针对该cell的所有代码将被忽略,赋值失败。(如当A1格处于编辑状态时,用代码对A1赋值将没有任何效果)
所以如何判断Excel是否处于编辑状态,成为解决这个问题的关键。很多人都曾试图找一个事件能在Excel进入编辑状态的时候触发,让程序能够得到通知。但是Excel至少可以通过四种方法进入编辑状态:
· 双击一个cell
· 按F2
· 选中一个cell,直接输入
· 选中一个cell,单击激活公式栏的输入框
Excel只提供了一个Worksheet. BeforeDoubleClick能够帮助我们检测到第一个事件,对于另外三个,我们无能为力。怎么办?
当时困惑了很久,但是后来突然发现,当Excel处于编辑状态的时候,工具栏上很多很多的按钮都会被禁用。这下问题就简单了,选取一个按钮,获取它的句柄,在我们给cell赋值之前,测试这个按钮的Enabled状态,如果为false,表明Excel正处于编辑状态,调用API将Excel窗口激活,再给程序发送一个ESC键以退出编辑状态,然后实行赋值。整个代码如下:(我选择了Format Painter按钮来测试它的Enable状态。关于如何获得一个按钮的句柄,本blog上有文章详细解释,见 :“无敌的CommandBar和它的Control”)
private Excel.Application app = null;
private object missing = Type.Missing;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
app = Marshal.GetActiveObject("Excel.Application") as Excel.Application;
}
[DllImport("User32.Dll")]
public static extern void SetForegroundWindow(int h);
private void button1_Click(object sender, EventArgs e)
{
try
{
if (!app.CommandBars["Standard"].Controls["&Format Painter"].Enabled)
{
SetForegroundWindow(app.Hwnd);
app.SendKeys("{ESC}", missing);
}
app.get_Range("A1", missing).Value2 = "Test";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
测试以上Demo:关闭电脑中所有Excel的实例,新打开一个Excel,运行本程序。切换回Excel,使A1格处于编辑状态。切换到本程序,点击button1,会看到Excel的窗口被激活,并且A1的值变为“Test”。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/v_jzho/archive/2007/10/09/1817057.aspx