数据导出到Excel不一定要用Office的COM,利用ODBC也可以做到!
定义一个连接Excel文件的连接字符串:
String excelSql = @"Driver={Microsoft Excel Driver (*.xls)};READONLY=FALSE;DriverId=790;Dbq={0};DefaultDir=c:\;" ;
其中的{0}要实际替换为目标文件的路径和全名.
this.saveFileDialog1.Filter = "Excel文件.xls | *.xls";
string saveFileName = "";
DialogResult dr = this.saveFileDialog1.ShowDialog();
if(dr != DialogResult.Cancel)
{
saveFileName = saveFileDialog1.FileName;
if(File.Exists(saveFileName))
{
File.Delete(saveFileName);//删除目标文件
}
File.Copy("Book1.xls",saveFileName,true);//复制母板文件为目标文件
}
else
{
return;//保存文件对话框中选择了'取消'
}
String conSql =excelSql.Replace("{0}",saveFileName);//替换连接字符串中的占位符
OdbcConnection cnn = new OdbcConnection(conSql);
try{
cnn.Open();//打开连接
}
catch
{
return;//打开连接失败,退出
}
///下面在Excel文件中创建一个sheet
String sql = @"CREATE TABLE [新增Sheet] (
[姓名] varchar(32),
[单位名称] varchar(200)
)";
OdbcCommand cmd = new OdbcCommand(sql,cnn);
try
{
cmd.ExecuteNonQuery();
}
catch
{
cnn.Close();
cmd.Dispose();
MessageBox.Show("导出失败!",this.title);
return;
}
cmd.Dispose();
sql = @"Select * from [新增Sheet]";
cmd = new OdbcCommand(sql,cnn);
DataSet newDs = new DataSet();
OdbcDataAdapter adp = new OdbcDataAdapter(cmd);//生成DataAdapter
try
{
adp.Fill(newDs);//生成一个空的数据集
}
catch
{
adp.Dispose();
newDs.Dispose();
cnn.Close();
cmd.Dispose();
MessageBox.Show("导出失败!",this.title);
return;
}
DataSet ds = (DataSet)this.listView1.Tag;//listView1.Tag中保存的是要导出的dataset
foreach(DataRow row in ds.Tables[0].Rows)//往目标数据集复制数据
{
DataRow newRow = newDs.Tables[0].NewRow();
newRow["姓名"] = row["姓名"];
newRow["单位名称"] = row["单位名称"];
newDs.Tables[0].Rows.Add(newRow);
}
OdbcCommandBuilder cb = new OdbcCommandBuilder(adp);//生成插入数据需要的Command
int k = adp.Update(newDs);//插入数据到Excel中
adp.Dispose();
cnn.Close();
cmd.Dispose();
cb.Dispose();
MessageBox.Show("导出成功,共导出" + k.ToString() + "条数据,文件保存在:" + saveFileName,
this.title);