DataTable转Excel

几经波折终于转出来了   如果你们有好的办法  欢迎指教

我的原始数据

然后转换成下面的图示、

最终得到excel数据

代码如下

public HttpResponseMessage PiceDownLoad(string sTime,string eTime,string model)
        {
            List<string> li2 = new List<string>(); //存放一整列所有的值 
            DataTable datas = HttpContext.Current.Session["Piece"] as DataTable;//原始datatable
            if (datas == null)
                return AssistFun.toJson(new { status = 201, tip = "没有数据" });
            foreach (DataRow drs in datas.Rows)
            {
                li2.Add(drs["CodeName"].ToString());
            }            
            //去重
            for (int i = 0; i < li2.Count; i++)  //外循环是循环的次数
            {
                for (int j = li2.Count - 1; j > i; j--)  //内循环是 外循环一次比较的次数
                {

                    if (li2[i] == li2[j])
                        li2.RemoveAt(j);
                }
            }
            try
            {
                DataTable newTable = new DataTable();
                newTable.Columns.Add(new DataColumn("工号"));
                newTable.Columns.Add(new DataColumn("姓名"));
                DataRow dr = newTable.NewRow();
                for (int i = 0; i < li2.Count; i++)
                {
                    newTable.Columns.Add(new DataColumn(li2[i]));
                }
                newTable.Rows.Add(dr);
                //list分组 
                List<ShowPieceModel> list = AssistFun.DataTableToList<ShowPieceModel>(datas);
                IEnumerable<IGrouping<int, ShowPieceModel>> query = list.GroupBy(pet => pet.UserId, pet => pet);
                foreach (IGrouping<int, ShowPieceModel> info in query)
                {
                    List<ShowPieceModel> pice = info.ToList();//分组后的集  也可循环得到分组后,集合中的对象,可以用info.Key去控制 
                    DataRow dr1 = newTable.NewRow();
                    dr1["工号"] = pice[0].UserId;
                    dr1["姓名"] = pice[0].UserName;
                    for (int i = 0; i < pice.Count; i++)
                    {
                        for (int j = 0; j < li2.Count; j++)
                        {
                            if (pice[i].CodeName == li2[j])
                            {
                                dr1[pice[i].CodeName] = pice[i].SumMoney;
                                break;
                            }
                        }
                    }
                    newTable.Rows.Add(dr1);
                }
                newTable.Rows.Remove(newTable.Rows[0]);
                ChangeExcelDown(newTable, model, Convert.ToDateTime(sTime), Convert.ToDateTime(eTime));
            }
            catch (Exception e)
            {
                return AssistFun.toJson(new { status = 201, tip = e.Message });
            }            
            return AssistFun.toJson(new { status = 200, tip = "成功" });
        }

        /// <summary>
        /// datatable 生成excel并且下载文件
        /// </summary>
        /// <param name="dt">datatable</param>
        /// <param name="type">下载类型</param>
        private void ChangeExcelDown(DataTable dt,string type,DateTime sTime,DateTime eTime)
        {
            string FileName = m_buyiRoot+ "\\buyiUpload\\" + type + ".xls";  //文件存放路径
            if (File.Exists(FileName)) 
                File.Delete(FileName);
            FileStream objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter objStreamWriter = new StreamWriter(objFileStream, Encoding.Unicode);
            string strLine ="     "+ type + "("+Convert.ToDateTime(sTime).ToString("yyyy/MM/dd")+" - "+ Convert.ToDateTime(eTime).ToString("yyyy/MM/dd")+")";
            objStreamWriter.WriteLine(strLine);
            strLine = "";            
            for (int i = 0; i < dt.Columns.Count; i++)
                strLine = strLine + dt.Columns[i].Caption.ToString() + Convert.ToChar(9);      //写列标题
            objStreamWriter.WriteLine(strLine);
            strLine = "";
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    if (dt.Rows[i].ItemArray[j] == null)
                        strLine = strLine + " " + Convert.ToChar(9);                                    //写内容
                    else
                    {
                        string rowstr = "";
                        rowstr = dt.Rows[i].ItemArray[j].ToString();
                        if (rowstr.IndexOf("\r\n") > 0)
                            rowstr = rowstr.Replace("\r\n", " ");
                        if (rowstr.IndexOf("\t") > 0)
                            rowstr = rowstr.Replace("\t", " ");
                        strLine = strLine + rowstr + Convert.ToChar(9);
                    }
                }
                objStreamWriter.WriteLine(strLine);
                strLine = "";
            }
            objStreamWriter.Close();
            objFileStream.Close();
            Download(FileName);
            File.Delete(FileName);
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值