C#导出涉及行列合并的复杂的Excel数据

Posted 潇潇与偕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#导出涉及行列合并的复杂的Excel数据相关的知识,希望对你有一定的参考价值。

一、导出数据格式

技术分享

 

二、实现代码

  1  public ActionResult ExportFundDataToExcel(Guid taskid, string taskname)
  2         {
  3             var dt = ProjectFundCalculateService.getFundDataTabe(taskid);
  4             if (null == dt)
  5             {
  6                 return Fail("当前任务没有要导出的经费数据");
  7             }
  8             if (dt.Rows.Count < 1)
  9             {
 10                 return Fail("当前任务没有要导出的经费数据");
 11             }
 12             var filehtml = new StringBuilder();
 13             fileHtml.Append("<table border=\"1\" style=\"table-layout:fixed;\" cellspacing=‘0‘ cellpadding=‘0‘>");
 14             fileHtml.Append("<tr>");
 15             fileHtml.Append("<td colspan=\"10\" style=\"font-size: 16px; font-family: 宋体; text-align: center; height: 30px;\">");
 16             fileHtml.AppendFormat(" <strong> {0}经费概算</strong>", taskname);
 17             fileHtml.Append("</td>");
 18             fileHtml.Append(" </tr>");
 19             fileHtml.Append("<tr>");
 20             fileHtml.Append(" <td colspan=\"10\" style=\"font-size: 16px; text-align: center; height: 30px;\">");
 21             fileHtml.Append(" 计费依据:四川省物价局、四川省财政厅《关于调整环境监测服务收费标准的函》(川价函〔2007〕6号)附件“四川省环境监测服务收费标准”。");
 22             fileHtml.Append(" </td>");
 23             fileHtml.Append(" </tr>");
 24             fileHtml.Append(" <tr>");
 25             fileHtml.Append(" <td colspan=\"8\"></td>");
 26             fileHtml.Append(" <td colspan=\"2\" style=\"text-align: center;font-size: 12px;\">单位:元</td>");
 27             fileHtml.Append(" </tr>");
 28             fileHtml.Append("<tr>");
 29             for (int i = 0; i < dt.Columns.Count; i++)
 30             {
 31                 fileHtml.AppendFormat("<td>{0}</td>", dt.Columns[i].ColumnName);
 32             }
 33             fileHtml.Append(" </tr>");
 34             int rowspan = 1;//要合并的列数
 35             string flag = "";//rowspan="$flag"的初始值,后面用rowspan替换
 36             for (var j = 0; j < dt.Rows.Count; j++)
 37             {
 38                 fileHtml.Append("<tr>");
 39                 if (dt.Rows[j][0].ToString() == "小计" || dt.Rows[j][0].ToString() == "监测费用合计" || dt.Rows[j][0].ToString() == "总计")
 40                 {
 41                     fileHtml.AppendFormat("<td colspan=\"2\" style=\"text-align: center;\">{0}</td>", dt.Rows[j][0]);
 42                     var sumtotal = dt.Rows[j][2].ToString();
 43                     if (dt.Rows[j][0].ToString() == "总计")
 44                     {
 45                         sumtotal = new EcanRMB().CmycurD(sumtotal) + "(¥" + sumtotal + "元)";
 46                     }
 47                     fileHtml.AppendFormat("<td colspan=\"8\" style=\"text-align: center;\"><strong>{0}</strong></td>", sumtotal);
 48                 }
 49                 else if (dt.Rows[j][0].ToString() == "报告编制费" || dt.Rows[j][0].ToString() == "车船费")
 50                 {
 51                     fileHtml.AppendFormat("<td colspan=\"2\" style=\"text-align: center;\">{0}</td>", dt.Rows[j][0]);
 52                     fileHtml.AppendFormat("<td colspan=\"7\" style=\"text-align: center;\">{0}</td>", dt.Rows[j][2]);
 53                     fileHtml.AppendFormat("<td style=\"text-align: center;\"><strong>{0}</strong></td>", dt.Rows[j][dt.Columns.Count - 1]);
 54                 }
 55                 else if (dt.Rows[j][1].ToString() == "人工费")
 56                 {
 57 
 58                     rowspan++;
 59                     //人工费第一列默认合并
 60                     fileHtml.AppendFormat("<td style=\"text-align: center;\">{0}</td>", dt.Rows[j][1]);
 61                     fileHtml.AppendFormat("<td colspan=\"7\" style=\"text-align: center;\">{0}</td>", dt.Rows[j][2]);
 62                     fileHtml.AppendFormat("<td style=\"text-align: center;\">{0}</td>", dt.Rows[j][dt.Columns.Count - 1]);
 63 
 64                     fileHtml.Replace("$" + flag, rowspan.ToString());
 65                     rowspan = 1;
 66                     flag = "";
 67 
 68                 }
 69                 else
 70                 {
 71                     if (j > 0)
 72                     {
 73                         //如果当前列与上一列的值相等则合并,否则初始化rowspan和flag
 74                         if (dt.Rows[j][0].ToString() == dt.Rows[j - 1][0].ToString())
 75                         {
 76                             rowspan++;
 77                         }
 78                         else
 79                         {
 80                             fileHtml.Replace("$" + flag, rowspan.ToString());
 81                             if (rowspan > 1)
 82                             {
 83                                 rowspan = 1;
 84                                 flag = "";
 85                             }
 86                         }
 87                     }
 88                     for (var k = 0; k < dt.Columns.Count; k++)
 89                     {
 90                         if (k == 0 && rowspan == 1)
 91                         {
 92                             flag = dt.Rows[j][0].ToString();
 93                             fileHtml.AppendFormat("<td rowspan=\"${0}\" style=\"text-align: center;\">{1}</td>", flag, dt.Rows[j][k]);
 94                         }
 95                         else if (k == 0 && rowspan > 1)
 96                         {
 97                             fileHtml.Append("");
 98                         }
 99                         else
100                         {
101                             fileHtml.AppendFormat("<td style=\"text-align: center;\">{1}</td>", j, dt.Rows[j][k]);
102                         }
103                     }
104 
105                 }
106                 fileHtml.Append("</tr>");
107 
108             }
109             fileHtml.Append("</table>");
110             byte[] fileContents = Encoding.Default.GetBytes(fileHtml.ToString());
111             return File(fileContents, "application/ms-excel", taskname + ".xls");
112 
113         }

 

以上是关于C#导出涉及行列合并的复杂的Excel数据的主要内容,如果未能解决你的问题,请参考以下文章

POI 导出 Excel:字体颜色行列自适应锁住合并单元格一文搞定……

c#导出EXCEL合并单元格代码

java导出合并excel单元格时,导出的第一行可以显示出标题,第二行就先不出来是怎么回事?

poi 导出word,导出表格(复杂表格合并行列)解决方法

记录解析具有合并单元格的Excel

Java Excel导出复杂excel表格样式之ExcelUtil工具类