N张dataTable中的记录想要全部导出到一个excel的不同sheet可以用什么方法.首先将datatable放进dataset中,然后导出dataset到excel中.
首先介绍核心的导出到Excel的代码.
首先要用该方法,要导入
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;(就这么导入),
如果导入
usingMicrosoft.Office.Interop.Excel;
那么虽然他的写法会简单些,
Application excel = new Application();//现在写法
//Excel.Application excel = new Excel.Application();//原来写法
但是他会报这个错,我们用的DataTable引用不明确,因为Excel中也有这个DataTable.
方法的具体代码,我给添了一些注释方便我理解.
#region根据dataset创建Excel
public boolCreatExcelBySet(string strFileName, DataSet ds)
{
try
{
//实例化Excel应用程序,为了验证机器中是否存在Excel程序
Excel.Applicationexcel = new Excel.Application();
//声明工作簿,.xls文件
Excel.WorkbookNowbook;
//判断服务器未安装Excel应用程序
if(excel == null)
{
throw newException("服务器未安装Excel应用程序,此功能无法使用");
}
//SheetsInNewWorkbook,自动插入到新工作簿中的工作表的个数,即dataset中的table的个数
excel.SheetsInNewWorkbook= ds.Tables.Count;
//创建一个新的工作簿,赋给Newbook
Nowbook= excel.Workbooks.Add();
//循环ds的table,导入数据到nowbook的sheet中
for(int i = 1; i <= ds.Tables.Count; i++)
{
DataTable dtCurrent = ds.Tables[i - 1];
Nowbook.Sheets[i].Name =dtCurrent.TableName.ToString();
//循环赋值datable的列数
for (int j = 1; j <= dtCurrent.Columns.Count; j++)
{
//一列一列的把数据从datatable中赋值到sheet中
Nowbook.Sheets[i].Cells[1,j] = dtCurrent.Columns[j - 1].ToString ();
for(int k = 1; k <= dtCurrent.Rows.Count; k++)
{
Nowbook.Sheets[i].Cells[k + 1, j] =dtCurrent.Rows[k - 1][j-1].ToString ();
}
}
}
保存方法1,提示文件替换。
//try
//{
// //设置保存的文件名,以及保存的格式
// Nowbook.SaveAs(Filename: strFileName,FileFormat: 56);
//}
//catch(Exception)
//{
// Nowbook.Close(SaveChanges: false);
// Nowbook = null;
// excel.Quit();
// excel = null;
// return false;
//}
//Nowbook.Close(SaveChanges:false);
//Nowbook= null;
//excel.Quit();
//excel= null;
//保存方法2,这种保存方法不会提示是否有相同的文件,直接保存。
//另存excel文件,strFileName是个路径
//表示工作簿自上次保存以来是否进行了更改,false表示没有更改
Nowbook.Saved= false;
Nowbook.SaveCopyAs(strFileName);
//释放资源
Nowbook.Close(false,Type.Missing, Type.Missing);
Nowbook= null;
excel.Quit();
excel= null;
}
catch (Exception ex)
{
throwex;
}
return true;
}
#endregion
如果要调用这个方法,那么需要参数,strFileName(路径),ds.对于dataset,如果直接是dataset就好了,直接用就可以.如果是datatable,那么就先将datatable放进dataset中.
DataSet dataset =new DataSet();
//给表命名,并且将.copy()放到ds中,直接放dtResult会出现该表属于某个dataset的错,指向导出固定的几列
dtResult =dtResult.DefaultView.ToTable(false, new string[] { "列1","列2", "列3" });
//给表命名,不命名也会报错,而且表名会是导出的sheet的名
dtResult.TableName =strQuestionType;
//将整好的datable添加到ds中
dsExcel.Tables.Add(dtResult.Copy());
然后就是路径了,由于导出Excel的方法,不能处理重名的问题,重名会自动覆盖.所以在strFileName,让它不会重名,最常见的就是加上用时间戳.但是名字中不能输入":"冒号,否则报错.
#region 导出到Excel中
DataTableToExcelexcel = new DataTableToExcel();
//导出的Excel存放的路径,加上时间戳,就不怕重复了
string filePath ="D:\\成绩分析" + DateTime.Now.ToString("yyyyMMddHHmmss") +".xls";
if(excel.CreatExcelBySet(filePath, dsExcel))
{
MessageBox.Show(this, "请在" +filePath + "路径找到您导出的文件!");
}
else
{
MessageBox.Show(this,"亲,不好意思,导出失败!");
}
#endregion
最后的结果就是这样的,先给个提示,然后去D盘找,该文件.
导出的文件效果就是这样.
至此,导出所有题型的功能就完成了.很简单,但是很实用.