DataTable to Excel

作者:

在

        public HttpResponseMessage Get(string obj, string pars, string mappingRule)
        {

            try
            {
                string cmdtext = "Get" + obj;
                DataTable dt = exeSP(cmdtext, pars);
                mappingExcelCol(dt, mappingRule);
               //return WriteExcel(dt, "");
               // return DataTable2Excel(dt);
                //return StreamExport(dt, "doooo.xls");
                String dir = ConfigurationManager.AppSettings["ImportFileFolder"];
                String tmpExcel =  dir + "\\" + Guid.NewGuid().ToString() + ".xls";
                return TableToExcelFile(dt, tmpExcel, HttpContext.Current.Server.MapPath("~\\Files\\Blank.xls"));
            }
            catch (IOException)
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }

        }

        //dt为数据源(数据表)
        //ExcelFileName 为要导出的Excle文件
        //ModelFile为模板文件,该文件与数据源中的表一致。否则数据会导出失败。
        //ModelFile文件里,需要有一张 与 dt.TableName 一致的表,而且字段也要一致。
        //注明:如果不用ModelFile的话,可以用一个空白Excel文件,不过,要去掉下面创建表的注释,让OleDb自己创建一个空白表。
        public HttpResponseMessage TableToExcelFile(DataTable dt, string ExcelFileName, string ModelFile)
        {
            dt.TableName = "Sheet1";
            File.Copy(ModelFile, ExcelFileName);  //复制一个空文件,提供写入数据用

            if (File.Exists(ExcelFileName) == false)
            {
                throw new Exception( "系统创建临时文件失败,请与系统管理员联系!");
            }
            if (dt == null)
            {
                throw new Exception( "DataTable不能为空");
            }
            int rows = dt.Rows.Count;
            int cols = dt.Columns.Count;
            StringBuilder sb;
            string connString;
            if (rows == 0)
            {
                throw new Exception( "没有数据");
            }
            sb = new StringBuilder();
            connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";

            //生成创建表的脚本
            //sb.AppendLine("DROP TABLE " + dt.TableName + "\r\n");

             sb.Append("CREATE TABLE ");
             sb.Append(dt.TableName + " ( ");
             for(int i=0;i<cols;i++)
             {
                 if(i < cols - 1)
                 sb.Append(string.Format("[{0}] varchar,",dt.Columns[i].ColumnName));
                 else
                 sb.Append(string.Format("[{0}] varchar)",dt.Columns[i].ColumnName));
             }    

            //return sb.ToString();
            OleDbConnection objConn = new OleDbConnection(connString);
            OleDbCommand objCmd = new OleDbCommand();
            objCmd.Connection = objConn;
            //del

            try
            {

                objConn.Open();

                objCmd.CommandText = "DROP TABLE " + dt.TableName;

                objCmd.ExecuteNonQuery();

                objCmd.CommandText = sb.ToString();

                objCmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                throw new Exception( "在Excel中创建表失败,错误信息:" + e.Message);
            }
            sb.Remove(0, sb.Length);
            sb.Append("INSERT INTO ");
            sb.Append(dt.TableName + " ( ");
            for (int i = 0; i < cols; i++)
            {
                if (i < cols - 1)
                    sb.Append(dt.Columns[i].ColumnName + ",");
                else
                    sb.Append(dt.Columns[i].ColumnName + ") values (");
            }
            for (int i = 0; i < cols; i++)
            {
                if (i < cols - 1)
                    sb.Append("
@" + dt.Columns[i].ColumnName + ",");
                else
                    sb.Append("
@" + dt.Columns[i].ColumnName + ")");
            }
            //建立插入动作的Command
            objCmd.CommandText = sb.ToString();
            OleDbParameterCollection param = objCmd.Parameters;
            for (int i = 0; i < cols; i++)
            {
                param.Add(new OleDbParameter("
@" + dt.Columns[i].ColumnName, OleDbType.VarChar));
            }
            //遍历DataTable将数据插入新建的Excel文件中
            foreach (DataRow row in dt.Rows)
            {
                for (int i = 0; i < param.Count; i++)
                {
                    param[i].Value = row[i];
                }
                objCmd.ExecuteNonQuery();
            }
           // return "数据已成功导入Excel";
            objConn.Close();

            HttpResponseMessage response = new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.OK;
            response.Content = new StreamContent(File.OpenRead(ExcelFileName));
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "foo.xls"
            };
            return response;
        }

        public HttpResponseMessage WriteExcel(DataTable dt, string fileName) {
            dt.TableName = "Excel";
            HttpResponseMessage response = new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.OK;
            MemoryStream ms = new MemoryStream();
            dt.WriteXml(ms, XmlWriteMode.WriteSchema);
            response.Content = new StreamContent(ms);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "foo.xls"
            };
            return response;
     }

        /// 
        /// DataTable通过流导出Excel
        /// 
        /// <param name="ds">数据源DataSet
        /// <param name="columns">DataTable中列对应的列名(可以是中文),若为null则取DataTable中的字段名
        /// <param name="fileName">保存文件名(例如:a.xls)
        /// 
        public HttpResponseMessage StreamExport(DataTable dt, string fileName)
        {
            if (dt.Rows.Count > 65535) //总行数大于Excel的行数 
            {
                throw new Exception("预导出的数据总行数大于excel的行数");
            }
            //if (string.IsNullOrEmpty(fileName)) return false;

            StringBuilder content = new StringBuilder();
            StringBuilder strtitle = new StringBuilder();
            content.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>");
            content.Append("<meta http-equiv='Content-Type' content=\"text/html; charset=gb2312\">");
            //注意:[if gte mso 9]到[endif]之间的代码,用于显示Excel的网格线,若不想显示Excel的网格线,可以去掉此代码
            content.Append("");
            content.Append("");
            content.Append(" ");
            content.Append("  ");
            content.Append("   ");
            content.Append("    Sheet1");
            content.Append("    ");
            content.Append("      ");
            content.Append("       ");
            content.Append("      ");
            content.Append("    ");
            content.Append("   ");
            content.Append("  ");
            content.Append("");
            content.Append("");
            content.Append("");
            content.Append("");

            for (int j = 0; j < dt.Columns.Count; j++)
            {
                content.Append("");
            }
            content.Append("\n");

            for (int j = 0; j < dt.Rows.Count; j++)
            {
                content.Append("");
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    object obj = dt.Rows[j][k];
                    Type type = obj.GetType();
                    if (type.Name == "Int32" || type.Name == "Single" || type.Name == "Double" || type.Name == "Decimal")
                    {
                        double d = obj == DBNull.Value ? 0.0d : Convert.ToDouble(obj);
                        if (type.Name == "Int32" || (d - Math.Truncate(d) == 0))
                            content.AppendFormat("", obj);
                        else
                            content.AppendFormat("", obj);
                    }
                    else
                        content.AppendFormat("", obj);
                }
                content.Append("\n");
            }
            content.Append("
" + dt.Columns[j].ColumnName + "
{0}{0}{0}
"
); content.Replace(" ", ""); byte[] fileContents = Encoding.Default.GetBytes(content.ToString()); var fileStream = new MemoryStream(fileContents); HttpResponseMessage response = new HttpResponseMessage(); response.StatusCode = HttpStatusCode.OK; response.Content = new StreamContent(fileStream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "foo.xls" }; return response; //pages.Response.Clear(); //pages.Response.Buffer = true; //pages.Response.ContentType = "application/ms-excel"; //"application/ms-excel"; //pages.Response.Charset = "UTF-8"; //pages.Response.ContentEncoding = System.Text.Encoding.UTF7; //fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); //pages.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); //pages.Response.Write(content.ToString()); ////pages.Response.End(); //注意,若使用此代码结束响应可能会出现“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。”的异常。 //HttpContext.Current.ApplicationInstance.CompleteRequest(); //用此行代码代替上一行代码,则不会出现上面所说的异常。 //return true; } /// /// 这种方式导出来的Excel,会提示格式不匹配,但是能正常查看 /// /// /// private HttpResponseMessage DataTable2Excel(DataTable dt) { var sbHtml = new StringBuilder(); sbHtml.Append(""); sbHtml.Append(""); foreach (DataColumn item in dt.Columns) { sbHtml.AppendFormat("", item.ColumnName); } sbHtml.Append(""); foreach (DataRow dr in dt.Rows) { sbHtml.Append(""); foreach (DataColumn dc in dt.Columns) { sbHtml.AppendFormat("", dr[dc]); } sbHtml.Append(""); } sbHtml.Append("
{0}
{0}
"
); byte[] fileContents = Encoding.Default.GetBytes(sbHtml.ToString()); var fileStream = new MemoryStream(fileContents); HttpResponseMessage response = new HttpResponseMessage(); response.StatusCode = HttpStatusCode.OK; response.Content = new StreamContent(fileStream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "foo.xls" }; return response; }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

评论

发表回复