(原创,转载请标明出处)
需求说明: 1.根据所选择条件的不同产生不同的参数,并将这些参数作为列名导出为Excel表(先写入dt_rllxparam)--导入模板.xls
2.然后由用户往 导入模板.xls 插入数据并上传至服务器
需求分析: 1.导出的excel中只有列名,且为动态(已写入dt_rllxparam表中)
2.导入的excel要使用excel标准格式,方可导入,使用html格式无法导入
excel导出方案1--将Gridview控件导出为excel(本质是往html中写入一个gridview,然后再将html response到excel中,即excel是html格式的)
//由于dt_rllxparam表里面只有列名,于是增加一个空行表示数据 DataRow dr_rllxparam = dt_rllxparam.NewRow(); dt_rllxparam.Rows.Add(dr_rllxparam); //gridview导出到excel表中 Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312";//设置类型,中文防止乱码出现,也可以是utf-8 Response.ContentType = "application/vnd.ms-excel";//设置输出类型为excel,也有写application/vnd.ms-excel的 Response.ContentEncoding = System.Text.Encoding.Default; //System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文,感觉可有可无的一项 Response.AppendHeader("Content-Disposition", "attachment;filename=Sheet1.xls");//定义输出文件和文件名,感觉可有可无的一项 this.EnableViewState = false; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); DataGrid dg = new DataGrid();//往文件流中插入一个控件 dg.DataSource = dt_rllxparam; dg.DataBind(); dg.RenderControl(htw); Response.Write(sw.ToString()); Response.End();
excel导出方案2--将dt_rllxparam直接导出为excel(本质是往html中写入一个带格式的string,然后再将html response到excel中,即excel是html格式的)
//将dt导出到excel表中,html格式,逐行导入 public void CreateExcel(System.Data.DataTable dt, string FileName) { HttpResponse resp; resp = Page.Response; resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName); string colHeaders = "", ls_item = ""; DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的 int i = 0; int cl = dt.Columns.Count; for (i = 0; i < cl; i++) { if (i == (cl - 1))//最后一列,加n { //最后一个单元格换行 colHeaders += dt.Columns[i].Caption.ToString() + "\n"; } else { //除最后一个单元格以外的单元格横向换格 colHeaders += dt.Columns[i].Caption.ToString() + "\t"; } } resp.Write(colHeaders); //向HTTP输出流中写入取得的数据信息 //逐行处理数据 foreach (DataRow row in myRow) { //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据 for (i = 0; i < cl; i++) { if (i == (cl - 1))//最后一列,加n { //最后一个单元格换行 ls_item += row.ToString() + "\n"; } else { //除最后一个单元格以外的单元格横向换格 ls_item += row.ToString() + "\t"; } } resp.Write(ls_item); ls_item = ""; } resp.End(); }
excel导出方案2--将dt_rllxparam直接导出为excel
(本质是往一个已有的excel中写入所需要的数据,然后再将这个写好的数据另存出来,优势在于如此导出的excel是标准格式)
切记需要引用
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core; //选择COM里面选择Microft Office 12.0 object Library
using System.Reflection;//定义_open()内参数必须要用它。否则就出现missing未定义的错误。
using System.IO;
并安装一下office.excel
//将dt导出到excel表中,标准excel格式 public void ExportExcel(System.Data.DataTable dt_rllxparam,string filename) { //复制表style到temp文件夹下,(源文件地址,保存文件地址,第三个参数若为true,那么目标位置存在同名文件将被覆盖) //File.Copy(Server.MapPath("style.xls"), Server.MapPath("tempExcel\\" + filename+".xls"), false); //向Excel中写入数据, Microsoft.Office.Interop.Excel.Application excelApp = null;//引用Excel对象 Microsoft.Office.Interop.Excel.Workbook workBook; //引用工作薄 Microsoft.Office.Interop.Excel.Worksheet ws = null; //引用工作表的操作作 try { excelApp = new Microsoft.Office.Interop.Excel.Application(); //_open(),()中的参数必须写完,不然会出现open中至少定义一个参数的错误,没有,就missing.value或者missing。 workBook = excelApp.Workbooks._Open(Server.MapPath("~/PARAMETER_mannager/excelModel/空模板.xls"), Missing.Value, Missing.Value,Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Missing.Value);//连接到目录下的Excel文件 //打开第一张工作表sheet1 ws = (Worksheet)workBook.Worksheets[1]; //Microsoft.Office.Interop.Excel.Worksheet ws = (Worksheet)workBook.Worksheets[1]; for (int i = 0; i < dt_rllxparam.Columns.Count; i++) { //"\'"是定义字符串形式 ws.Cells[1, i + 1] = "\'" + dt_rllxparam.Columns[i].Caption.ToString(); } string tmpPath = Server.MapPath("~/PARAMETER_mannager/excelModel") + "\\" + filename + ".xls";//保存路径 //在保存之前,先删除掉原来的临时模板 FileInfo file = new FileInfo(tmpPath); file.Delete(); //保存Excel ws.SaveAs(tmpPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //关闭Excel excelApp.Quit(); //打开下载对话框下载 string strDownPath = "<script language=\'javascript\'>window.open(\'excelModel/" + filename + ".xls\')</script>";// Response.Write(strDownPath); } //捕捉异常 catch (Exception ex) { throw ex; } return; }
2014-06-29遇到问题:
1.错误 5 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?
解答:
用记事本打开专案资料夹里的 *.csproj
找到<ItemGroup>区段
手动加入
<Reference Include=
"Microsoft.CSharp"
/>
<Reference Include=
"System.Core"
/>
2.错误 1 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Core”。是否缺少程序集引用?
解答:选择COM里面选择Microft Office 12.0 object Library