Microsoft.Office.Interop.Excel命名空间要添加什么引用
首先:Microsoft.Office.Interop.Excel命名空间要添加什么引用 //这一步我自己做了,但是还是不好使,好使是在更新excel的对.net支持后好的就是下面的图形说明 在visual Studio 2005命令提示工具中,定位到Excel安装目录,运行“TlbImp EXCEL.EXE”命令,把Excel.exe编译为Excel.dll。这一步会在你的机器上面的安装Office的目录下面的 Office11(office2003)目录下生成Excell.dll,所以在引用的时候要到这个目录下面来找Excel.dll。 在项目的引用节点单击右键,在弹出的菜单中单击添加引用...在弹出的对话框中单击COM项,找到Microsoft Excel 11.0 Object Library并单击选中,然后单击选择按钮,如图“引用Excel2003”。从中我们可以看出是引用的Excel.Exe文件,这是 Excel2003版。Excel2000及Excel2002即Excel XP COM项见“Excel版本对照表”。 打开Visual Studio .Net2003命令提示,运行 TlbImp Excel.EXE Interop.Excel.dll 如果是Excel2000,则 TlbImp Excel9.olb Interop.Excel.dll 当 然,第一参数Excel.EXE(Excel9.olb)要指定目录(Office2000安装目录),如果不指定,需要把它拷贝到VS.Net安装路径 下如C:/Visual Studio.Net/SDK/v1.1/Bin;同理,第二参数Interop.Excel.dll是生成的对应的动态库,如果不指定目录,默认生成在 VS.Net安装路径BIN下 ,你可以用你自己喜欢的名字取Interop.Excel.dll,生成之后你就可以在VS.Net开发环境项目中添加对它的引用了。 Tlbimp.exe为类型库导入程序,它将 COM 类型库中的类型定义转换为公共语言运行库程序集中的等效定义,关于它的详细使用参见MSDN。 用第一种方法和第二种方法引用的库和默认文件目录为分别如下: Excel 2000是 Microsoft Excel 9.0 Object Library C:/Program Files/Microsoft Office/Office/EXCEL9.OLB Excel 2002(XP)是 Microsoft Excel 10.0 Object Library C:/Program Files/Microsoft Office/OFFICE10/EXCEL.EXE Excel 2003是 Microsoft Excel 11.0 Object Library C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE
|
C#操作Excel:不存在类型或命名空间名称“Interop”
在实际开发过程中,我们经常会对Excel表进行操作。相信大家都都已经很熟悉C#操作Excel的步骤:添加引用->COM->Microsoft Office Excel 11 Object。
但是,最近我按照上述步骤添加完引用后,出现了·命名空间“Microsoft.Office” 中不存在类型或命名空间名称“Interop”(是缺少程序集引用吗?)·的错误,查也很多资料,都没有解决,给开发过程造成了障碍。
问题原因
导致这个问题的原因是安装Office时没有安装“.Net可编程性支持”组件。
解决方法
1、打开控制面板,更改Office的安装,选中下图中的红色方框内:选择应用程序的高级定义;
2、下一步之后,按照下图选中安装选项中的“.Net可编程性支持”项,一路“下上步”至安装完毕;
3、重新添加引用。
OK!问题解决!
c# datagridview 导出excel 收藏
准备工作就是可以分页的DataGridView,和两个按钮,一个用来导出当前页数据到Excel,一个用来导出全部数据到Excel
没有使用SaveFileDialog,但却可以弹出保存对话框来
先做导出当前页数据到Excel的
DataGridView命名为dataGridView1
C#代码
#region 导出当前页到Excel中
//按下导出按钮
private void button7_Click(object sender, EventArgs e)
{
print(dataGridView1);
}
public void print(DataGridView dataGridView1)
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dataGridView1.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//让后台执行设置为不可见,为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 - 1; 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;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
}
#endregion
public void printAll(System.Data.DataTable dt)
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dt.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Applicatio();
//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
excel.Application.Workbooks.Add(true);
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
excel.Visible = false;
//生成Excel中列头名称
for (int i = 0; i < dt.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;//输出DataGridView列头名
}
//把DataGridView当前页的数据保存在Excel中
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)//控制Excel中行,上下的距离,就是可以到Excel最下的行数,比数据长了报错,比数据短了会显示不完
{
for (int j = 0; j < dt.Columns.Count; j++)//控制Excel中列,左右的距离,就是可以到Excel最右的列数,比数据长了报错,比数据短了会显示不完
{
string str = dt.Rows[i][j].ToString();
excel.Cells[i + 2, j + 1] = "'" + str;//i控制行,从Excel中第2行开始输出第一行数据,j控制列,从Excel中第1列输出第1列数据,"'" +是以string形式保存,所以遇到数字不会转成16进制
}
}
}
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false;
//保存工作簿,值为false会报错
excel.Application.Workbooks.Add(true).Save();
//保存excel文件
excel.Save("D:" + "//KKHMD.xls");
//确保Excel进程关闭
excel.Quit();
excel = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
}
private void button1_Click(object sender, EventArgs e)
{
printAll(dt);
}
#endregion
这不是最好的版本,无论是功能上还是效率上,至少没用SaveFileDialog的话,控制不到取消保存按钮,一旦点击了取消保存,则软件重起之前一直都不能再使用导出功能,只能是手动杀掉进程中的Excel.exe,进程中的Excel.exe也是没有在程序里进行关闭的,所以是使用一次导出功能,就会在进程中多生成一次Excel.exe
彻底关闭excel进程的方法
using System.Diagnostics;
private void KillProcess(string processName)
{
//获得进程对象,以用来操作
System.Diagnostics.Process myproc = new System.Diagnostics.Process();
//得到所有打开的进程
try
{
//获得需要杀死的进程名
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
//立即杀死进程
thisproc.Kill();
}
}
catch (Exception Exc)
{
throw new Exception("", Exc);
}
}
方法一:添加dll引用 右击选择你所在的项目的“引用”,选择“添加引用”。 弹出“添加引用”对话框。 选择“COM”选项卡。 选择“Microsoft Excel 11.0 Object Library” 单击“确定”按钮。 代码 public static bool ExportForDataGridview(DataGridView gridView, string fileName, bool isShowExcle) //建立Excel对象 Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
//数据 } 方法二 用流保存成xls文件. 这种方法比较好,不用引用Excel组件. 下面是具体例子,可以参考 using System.IO;
/// <summary> /// 另存新档按钮 /// </summary> private void SaveAs() //另存新档按钮 导出成Excel { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.RestoreDirectory = true; saveFileDialog.CreatePrompt = true; saveFileDialog.Title = "Export Excel File To";
saveFileDialog.ShowDialog();
Stream myStream; myStream = saveFileDialog.OpenFile(); //StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312")); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string str = ""; try { //写标题 for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++) { if (i > 0) { str += "/t"; } str += dgvAgeWeekSex.Columns[i].HeaderText; }
sw.WriteLine(str);
//写内容 for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++) { string tempStr = ""; for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++) { if (k > 0) { tempStr += "/t"; } tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString(); }
sw.WriteLine(tempStr); } sw.Close(); myStream.Close(); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { sw.Close(); myStream.Close(); } } |