在实际开发过程中,有时候服务器端没安装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 }
在实际应用中可以合并第三步和第四步,根据自己的实际需求可以组织自己的代码,这里只是提供了一个思路,希望大伙有意见提出来。。。。。。。