c#,提示未将对象引用到对象的实例。怎么回事?
[DllImport("User32.dll",CharSet=CharSet.Auto)]usingSystem.Runtime.InteropServices;pub...
[DllImport("User32.dll", CharSet = CharSet.Auto)]
using System.Runtime.InteropServices;
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private void button3_Click(object sender, EventArgs e)
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dataGridView1.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//Excel.Application app = new Excel.ApplicationClass();
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
excel.Visible = false;
//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
excel.Application.Workbooks.Add(true);
//生成Excel中列头名称
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
}
//把DataGridView当前页的数据保存在Excel中
for (int i = 0; i < dataGridView1.Rows.Count ; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
if (dataGridView1[j, i].ValueType == typeof(string))
{
excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();
}
else
{
excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();
}
}
}
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false;
//保存工作簿
excel.Application.Workbooks.Add(true).Save();
//保存excel文件
excel.Save("D:" + "\\KKHMD.xls");
//确保Excel进程关闭
excel.Quit();
excel = null;
System.Diagnostics.Process.GetProcessesByName("excel");
IntPtr t = new IntPtr(excel.Hwnd);
int k = 0;
GetWindowThreadProcessId(t, out k);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();
}
第一行和第二行写反了。
排除后5行后,问题消失,不过就没法关闭excel进程了 展开
using System.Runtime.InteropServices;
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private void button3_Click(object sender, EventArgs e)
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dataGridView1.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//Excel.Application app = new Excel.ApplicationClass();
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
excel.Visible = false;
//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
excel.Application.Workbooks.Add(true);
//生成Excel中列头名称
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
}
//把DataGridView当前页的数据保存在Excel中
for (int i = 0; i < dataGridView1.Rows.Count ; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
if (dataGridView1[j, i].ValueType == typeof(string))
{
excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();
}
else
{
excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();
}
}
}
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false;
//保存工作簿
excel.Application.Workbooks.Add(true).Save();
//保存excel文件
excel.Save("D:" + "\\KKHMD.xls");
//确保Excel进程关闭
excel.Quit();
excel = null;
System.Diagnostics.Process.GetProcessesByName("excel");
IntPtr t = new IntPtr(excel.Hwnd);
int k = 0;
GetWindowThreadProcessId(t, out k);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();
}
第一行和第二行写反了。
排除后5行后,问题消失,不过就没法关闭excel进程了 展开
4个回答
展开全部
同意楼上的说法,你打一下断点,一步一步执行看那个值是空的,肯定是某个值没拿到,就为空了,才会出现这样的问题!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最后一个结束进程的时候不加判断吗?如果没有获取到这个进程话下面就报错了。
if(p!=null)
{
p.kill();
p.dispose();
}
试一下,我没试你这个代码。
if(p!=null)
{
p.kill();
p.dispose();
}
试一下,我没试你这个代码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
dataGridView1[j, i].Value 可能为null,无法转换为toString()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
引用了一个空对象并对这个空对象操作。
你用vs调试的时候不是会弹出来提示的么?看看具体哪一行除了问题。再看哪个对象是null的
你用vs调试的时候不是会弹出来提示的么?看看具体哪一行除了问题。再看哪个对象是null的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询