从数据库批量导出Excel文件时需要这样的类,仍然使用了office的接口,不装office不给用。
using System;
using System.Data;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Microsoft.Win32;
using System.IO;
public class DataBasetoExcel
{
/// <summary>
/// 判断本机是否安装Excel文件方法
/// </summary>
/// <returns></returns>
static private bool isExcelInstalled()
{
Type type = Type.GetTypeFromProgID("Excel.Application");
return type != null;
}
/// <summary>
/// 查询注册表某个键值是否存在,这里查询的是Excel2003/2007版本的键值
/// </summary>
/// <returns></returns>
static private bool exists03Regedit()
{
bool ifused = false;
RegistryKey rk = Registry.LocalMachine;
RegistryKey akey = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\11.0\\Word\\InstallRoot\\");
//RegistryKey akeytwo = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\12.0\\Word\\InstallRoot\\");
//检查本机是否安装Office2003
if (akey != null)
{
string file03 = akey.GetValue("Path").ToString();
if (File.Exists(file03 + "Excel.exe"))
{
ifused = true;
}
}
检查本机是否安装Office2007
//if (akeytwo != null)
//{
// string file07 = akeytwo.GetValue("Path").ToString();
// if (File.Exists(file07 + "Excel.exe"))
// {
// ifused = true;
// }
//}
return ifused;
}
static private bool ExcelNewerThan03()
{
bool newer = false;
_Application tmp = new Microsoft.Office.Interop.Excel.Application();
newer = double.Parse(tmp.Version) > 11.0;
tmp.Quit();
tmp = null;
return newer;
}
/// <summary>
/// 用指定数据集中的第一个表选择路径生成Excel文件
/// </summary>
/// <param name="ds"></param>
/// <param name="表名"></param>
/// <param name="打开电子表格"></param>
static public void DataSetToExcel(DataSet ds , string 表名 , bool 打开电子表格 )
{
if (ds == null)
{
MessageBox.Show("没能从数据集中取得数据,无法创建电子表格。");
return;
}
if (!isExcelInstalled())
{
MessageBox.Show("无法创建Excel对象,请确认已安装Excel。");
return;
}
string saveFileName = "";
bool fileSaved = false;
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
if (ExcelNewerThan03())
{
saveDialog.DefaultExt = "xlsx";
saveDialog.FilterIndex = 2;
}
saveDialog.Filter = "Excel文件|*.xls|Excel文件|*.xlsx";
saveDialog.FileName = 表名;
if (saveDialog.ShowDialog() != DialogResult.OK)
{
return;
}
saveFileName = saveDialog.FileName;
_Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
_Workbook 工作簿 = excel.ActiveWorkbook; //工作簿赋值为excel中的已激活工作簿
_Worksheet 工作表 = (_Worksheet)工作簿.ActiveSheet; //工作表赋值为工作簿中已激活的工作表
工作表.Name = 表名; //给工作表取名字
System.Data.DataTable dt = ds.Tables[0];
//向工作表填写列名
for( int i = 0 ; i < dt.Columns.Count ; i++ )
{
工作表.Cells[1, 1 + i] = dt.Columns[i].ColumnName;
}
//向工作表填写数值
for (int i = 0; i < dt.Columns.Count; i++)
{
for( int j = 0 ; j < dt.Rows.Count ; j++ )
{
工作表.Cells[2 + j, 1 + i] = dt.Rows[j][i];
}
}
//将工作簿另存为
if (saveFileName != "")
{
try
{
工作簿.Saved = true;
工作簿.SaveCopyAs(saveFileName);
fileSaved = true;
MessageBox.Show("成功创建电子表格。");
}
catch (Exception ex)
{
fileSaved = false;
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
return;
}
}
else
{
fileSaved = false;
}
工作簿.Close(null, null, null); //关闭工作簿
excel.Quit(); //退出excel
excel = null; //赋值为NULL
GC.Collect();//强行销毁
if ( 打开电子表格 && fileSaved && File.Exists(saveFileName))
{
System.Diagnostics.Process.Start(saveFileName); //打开EXCEL
}
}
/// <summary>
/// 用指定表选择路径生成Excel文件
/// </summary>
/// <param name="dt"></param>
/// <param name="表名"></param>
/// <param name="打开电子表格"></param>
static public void DataTableToExcel(System.Data.DataTable dt, string 表名, bool 打开电子表格)
{
if (dt == null)
{
MessageBox.Show("没能从表中取得数据,无法创建电子表格。");
return;
}
if (!isExcelInstalled())
{
MessageBox.Show("无法创建Excel对象,请确认已安装Excel。");
return;
}
string saveFileName = "";
bool fileSaved = false;
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
if (ExcelNewerThan03())
{
saveDialog.DefaultExt = "xlsx";
saveDialog.FilterIndex = 2;
}
saveDialog.Filter = "Excel文件|*.xls|Excel文件|*.xlsx";
saveDialog.FileName = 表名;
if (saveDialog.ShowDialog() != DialogResult.OK)
{
return;
}
saveFileName = saveDialog.FileName;
_Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
_Workbook 工作簿 = excel.ActiveWorkbook; //工作簿赋值为excel中的已激活工作簿
_Worksheet 工作表 = (_Worksheet)工作簿.ActiveSheet; //工作表赋值为工作簿中已激活的工作表
工作表.Name = 表名; //给工作表取名字
//向工作表填写列名
for (int i = 0; i < dt.Columns.Count; i++)
{
工作表.Cells[1, 1 + i] = dt.Columns[i].ColumnName;
}
//向工作表填写数值
for (int i = 0; i < dt.Columns.Count; i++)
{
for( int j = 0 ; j < dt.Rows.Count ; j++ )
{
工作表.Cells[2 + j, 1 + i] = dt.Rows[j][i];
}
}
//将工作簿另存为
if (saveFileName != "")
{
try
{
工作簿.Saved = true;
工作簿.SaveCopyAs(saveFileName);
fileSaved = true;
MessageBox.Show("成功创建电子表格。");
}
catch (Exception ex)
{
fileSaved = false;
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
return;
}
}
else
{
fileSaved = false;
}
工作簿.Close(null, null, null); //关闭工作簿
excel.Quit(); //退出excel
excel = null; //赋值为NULL
GC.Collect();//强行销毁
if (打开电子表格 && fileSaved && File.Exists(saveFileName))
{
System.Diagnostics.Process.Start(saveFileName); //打开EXCEL
}
}
}
中文变量名的问题,还是请多包涵。