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);
}