在实际开发过程中,有时候服务器端没安装OFFICE,你和服务器管理员去商量安装个OFFICE的时候,管理员很倔犟的不给你安装的时候,这个时候就可以考虑我这个方法是实现导出EXCEL了。如果你导出的EXCEL是OFFICE2003的版本,可以选择其它的方式实现了,如果是OFFICE 2003之后的版本,就选择这个比较好,如果大伙有更好的方法,可以提出来一起研究学习下。
第一步:在服务器上放一个空白的EXCEL文件,里面什么都没有,可以在你本机建好这个文件,然后将这个文件放到服务器上。
如图1:
第二步:调用复制文件的方法,将【如图1】的文件复制一份新的文件,文件名自己取,只要唯一就可以。
第三步:在第二步中复制出的文件中调用如下的方法建立列:
按照你的实际需求可以修改下面的这个方法的实现方式,下面只是一个参考作用。
1 public static void ToExcel(string strPath, string strSheetName) 2 { 3 System.Data.OleDb.OleDbConnection OleDb_Conn = new System.Data.OleDb.OleDbConnection(); 4 // OleDb_Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=No';" + "Data Source=\"" + strPath + "\""; 5 OleDb_Conn.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=0\"", strPath); 6 try 7 { 8 OleDb_Conn.Open(); 9 System.Data.OleDb.OleDbCommand OleDb_Comm = new System.Data.OleDb.OleDbCommand(); 10 OleDb_Comm.Connection = OleDb_Conn; 11 string strCmd; 12 try 13 { 14 strCmd = "drop table [" + strSheetName + "]"; 15 OleDb_Comm.CommandText = strCmd; 16 OleDb_Comm.ExecuteNonQuery(); 17 } 18 catch 19 { 20 21 } 22 strCmd = "create Table [" + strSheetName + "]("; 23 24 //foreach (DataColumn dc in dtSource.Columns) 25 //{ 26 strCmd += "[集] TEXT,"; //此处 TEXT 是为了 防止导出数据的长度大于255而导出异常 27 strCmd += "[场] TEXT,"; 28 strCmd += "[镜头] TEXT,"; 29 strCmd += "[帧数] TEXT,"; 30 strCmd += "[制作人] TEXT,"; 31 strCmd += "[难度系数] TEXT,"; 32 strCmd += "[计划工时] TEXT,"; 33 strCmd += "[实际工时] TEXT,"; 34 strCmd += "[计划开始时间] TEXT,"; 35 strCmd += "[内部最晚通过时间] TEXT,"; 36 strCmd += "[备注] TEXT,"; 37 // } 38 39 strCmd = strCmd.Trim().Substring(0, strCmd.Length - 1); 40 strCmd += ")"; 41 OleDb_Comm.CommandText = strCmd; 42 OleDb_Comm.ExecuteNonQuery(); 43 44 OleDb_Conn.Close(); 45 } 46 catch (Exception ex) 47 { 48 throw ex; 49 } 50 finally 51 { 52 OleDb_Conn.Close(); 53 } 54 }
第四步:调用如下的方法把数据按照【第三步】生成的数据列的顺序写入到EXCEL中。
按照你的实际需求可以修改下面的这个方法的实现方式,下面只是一个参考作用。
1 /// <summary> 2 /// OLEDB导出EXCEL 3 /// </summary> 4 /// <param name="dtrows">数据源</param> 5 /// <param name="filePath">写入的文件路径</param> 6 /// <param name="fileName">写入的文件名</param> 7 /// <param name="colunames">要显示的列数据</param> 8 private void ExportExcelOLEDB(DataRow[] dtrows, string filePath, string fileName, string[] colunames) 9 { 10 clearFile();//清除产生的临时文件 11 string SqlConnStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=0\"", filePath); // 当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。 12 // 当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。 13 // 当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。 14 OleDbConnection con = new OleDbConnection(SqlConnStr); 15 string tablename = ExcelSheetName(filePath); 16 // string CommText = ""; //string.Format("INSERT INTO [" + tablename + "] VALUES(1,'elmer','password',1,'elmer','password',1,'elmer','password')"); 17 StringBuilder CommText = new StringBuilder(); 18 19 con.Open(); 20 try 21 { 22 int col = colunames.Length; 23 foreach (DataRow dr in dtrows) 24 { 25 CommText.Append("INSERT INTO [" + tablename + "] VALUES("); 26 for (int i = 0; i < col; i++) 27 { 28 if (i + 1 == col) 29 { 30 CommText.Append("'" + ReplaceAll(dr[colunames[i]].ToString()) + "'"); 31 } 32 else 33 { 34 CommText.Append("'" + ReplaceAll(dr[colunames[i]].ToString()) + "',"); 35 } 36 } 37 CommText.Append(");"); 38 39 using (OleDbCommand cmd = new OleDbCommand(CommText.ToString().Replace(':', ';').TrimEnd(';'), con)) 40 { 41 42 //导出数据 43 cmd.ExecuteNonQuery(); 44 45 } 46 CommText.Remove(0, CommText.Length); 47 } 48 } 49 catch (Exception err) { Response.Write(err.ToString()); con.Close(); } 50 con.Close(); 51 ////向客户端发送文件... 52 Response.Clear(); 53 Response.Charset = "GB2312"; 54 Response.ContentEncoding = System.Text.Encoding.UTF8; 55 // 添加头信息,为"文件下载/另存为"对话框指定默认文件名 56 Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(fileName) + ".xls"); 57 // 添加头信息,指定文件大小,让浏览器能够显示下载进度 58 //Response.AddHeader("Content-Length", file.Length.ToString()); 59 // 指定返回的是一个不能被客户端读取的流,必须被下载 60 Response.ContentType = "application/ms-excel"; 61 // 把文件流发送到客户端 62 Response.WriteFile(filePath); 63 Response.End(); 64 }
在实际应用中可以合并第三步和第四步,根据自己的实际需求可以组织自己的代码,这里只是提供了一个思路,希望大伙有意见提出来。。。。。。。