步骤:

一、前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来

  1. <!--导出Excel-->
  2. <script type="text/javascript">
  3. //导出Excel
  4. function exportExcel() {
  5. var data = "";
  6. $("#divRptTable").find("table").find("tr").each(function () {
  7. var tr = $(this);
  8. tr.find("td").each(function () {
  9. var td = $(this);
  10. var rowspan = td.attr("rowspan") ? td.attr("rowspan") : 1;
  11. var colspan = td.attr("colspan") ? td.attr("colspan") : 1;
  12. data = data + td.text() + "#{valueSeparater}" + rowspan + "#{valueSeparater}" + colspan + "#{columnSeparater}";
  13. });
  14. data = data + "#{rowSeparater}";
  15. });
  16. $("#hidTableData").val(data);
  17.  
  18. var year = $("select[name='year']").find("option[value='" + $("select[name='year']").val() + "']").text();
  19. var sem = $("select[name='sem']").find("option[value='" + $("select[name='sem']").val() + "']").text();
  20. var scl = $("select[name='school']").find("option[value='" + $("select[name='school']").val() + "']").text();
  21. var grade = $("select[name='grade']").find("option[value='" + $("select[name='grade']").val() + "']").text();
  22. var exam = $("select[name='exam']").find("option[value='" + $("select[name='exam']").val() + "']").text();
  23. $("#hidTitle").val(scl + " " + grade + " " + year + " " + sem + " " + exam);
  24.  
  25. $("#frm").submit();
  26. }
  27. </script>

二、后台先把前台传过来的字符串转换成HtmlTable实体,然后再转换成DataTable实体

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data;
  5. using System.Web.UI.HtmlControls;
  6.  
  7. // 2014年4月2日
  8.  
  9. namespace QuaEdu.Controller.Core.Utils
  10. {
  11. /// <summary>
  12. /// HtmlTable工具类
  13. /// 提供字符串转换成HtmlTable,HtmlTable转换成DataTable
  14. /// </summary>
  15. public class HtmlTableUtil
  16. {
  17. #region 变量
  18. /// <summary>
  19. /// 行分隔
  20. /// </summary>
  21. public static readonly string rowSeparater = "|||||";
  22. /// <summary>
  23. /// 列分隔
  24. /// </summary>
  25. public static readonly string columnSeparater = "@@@@@";
  26. /// <summary>
  27. /// 值分隔
  28. /// </summary>
  29. public static readonly string valueSeparater = "$$$$$";
  30. /// <summary>
  31. /// 空值标识
  32. /// </summary>
  33. public static readonly string nullFlag = "HtmlTableUtil_NULL_FLAG";
  34. #endregion
  35.  
  36. #region 字符串转换成HtmlTable
  37. /// <summary>
  38. /// 字符串转换成HtmlTable
  39. /// </summary>
  40. public static HtmlTable String2HtmlTable(string data)
  41. {
  42. HtmlTable htmlTable = new HtmlTable();
  43.  
  44. string[] rowArray = data.Split(new string[] { rowSeparater }, StringSplitOptions.RemoveEmptyEntries);
  45. foreach (string row in rowArray)//遍历行
  46. {
  47. HtmlTableRow htmlTableRow = new HtmlTableRow();
  48.  
  49. string[] colArray = row.Split(new string[] { columnSeparater }, StringSplitOptions.RemoveEmptyEntries);
  50. foreach (string col in colArray)//遍历列
  51. {
  52. HtmlTableCell htmlTableCell = new HtmlTableCell();
  53.  
  54. string[] valArr = col.Split(new string[] { valueSeparater }, StringSplitOptions.None);
  55. string val = valArr[];
  56. int rowspan = int.Parse(valArr[]);
  57. int colspan = int.Parse(valArr[]);
  58.  
  59. htmlTableCell.InnerText = val;
  60. htmlTableCell.RowSpan = rowspan;
  61. htmlTableCell.ColSpan = colspan;
  62. htmlTableRow.Cells.Add(htmlTableCell);
  63. }
  64. htmlTable.Rows.Add(htmlTableRow);
  65. }
  66.  
  67. return htmlTable;
  68. }
  69. #endregion
  70.  
  71. #region HtmlTable转换成DataTable
  72. /// <summary>
  73. /// HtmlTable转换成DataTable
  74. /// </summary>
  75. public static DataTable HtmlTable2DataTable(HtmlTable htmlTable)
  76. {
  77. DataTable dataTable = new DataTable();
  78.  
  79. #region DataTable列数
  80. int colCount = ;
  81. if (htmlTable.Rows.Count > )
  82. {
  83. foreach (HtmlTableCell htmlTableCell in htmlTable.Rows[].Cells)
  84. {
  85. colCount += htmlTableCell.ColSpan;
  86. }
  87. }
  88. #endregion
  89.  
  90. #region DataTable行数
  91. int rowCount = htmlTable.Rows.Count;
  92. #endregion
  93.  
  94. #region 给DataTable添加列
  95. for (int i = ; i < colCount; i++)
  96. {
  97. dataTable.Columns.Add();
  98. }
  99. #endregion
  100.  
  101. #region 给DataTable添加行
  102. for (int i = ; i < rowCount; i++)//遍历行
  103. {
  104. DataRow dataRow = dataTable.NewRow();
  105. for (int j = ; j < colCount; j++)//遍历列
  106. {
  107. dataRow[j] = null;
  108. }
  109. dataTable.Rows.Add(dataRow);
  110. }
  111. #endregion
  112.  
  113. #region 转换
  114. for (int i = ; i < htmlTable.Rows.Count; i++)//遍历HtmlTable行
  115. {
  116. HtmlTableRow htmlTableRow = htmlTable.Rows[i];
  117. int delta = ;//列增量
  118.  
  119. for (int j = ; j < htmlTableRow.Cells.Count; j++)//遍历HtmlTable列
  120. {
  121. HtmlTableCell htmlTableCell = htmlTableRow.Cells[j];
  122.  
  123. #region 计算delta
  124. for (int k = j + delta; k < colCount; k++)
  125. {
  126. string cellValue = dataTable.Rows[i][k].ToString();
  127. if (cellValue != null)
  128. {
  129. if (cellValue.IndexOf(nullFlag) == )
  130. {
  131. delta++;
  132. continue;
  133. }
  134. }
  135. break;
  136. }
  137. #endregion
  138.  
  139. #region 填充DataTable
  140. dataTable.Rows[i][j + delta] = htmlTableCell.InnerText + valueSeparater + htmlTableCell.RowSpan + valueSeparater + htmlTableCell.ColSpan;
  141. if (htmlTableCell.RowSpan > || htmlTableCell.ColSpan > )
  142. {
  143. for (int m = ; m < htmlTableCell.RowSpan; m++)
  144. {
  145. for (int n = ; n < htmlTableCell.ColSpan; n++)
  146. {
  147. if (!(m == && n == ))
  148. {
  149. int ii = i + m;
  150. int jj = j + delta + n;
  151. dataTable.Rows[ii][jj] = nullFlag + valueSeparater + "" + valueSeparater + "";
  152. }
  153. }
  154. }
  155. }
  156. #endregion
  157.  
  158. }
  159. }
  160. #endregion
  161.  
  162. return dataTable;
  163. }
  164. #endregion
  165.  
  166. }
  167. }

三、将DataTable导出到Excel

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using NPOI.HSSF.UserModel;
  5. using System.Data;
  6. using System.IO;
  7. using NPOI.SS.UserModel;
  8. using QuaEdu.Helper;
  9.  
  10. // 2014年4月2日
  11.  
  12. namespace QuaEdu.Controller.Core.Utils
  13. {
  14. /// <summary>
  15. /// Excel工具类
  16. /// 利用NPOI生成Excel
  17. /// </summary>
  18. public class ExcelUtil
  19. {
  20. #region 生成Excel
  21. /// <summary>
  22. /// 生成Excel
  23. /// DataTable必须使用HtmlTableUtil.HtmlTable2DataTable生成
  24. /// </summary>
  25. public static void CreateExcel(DataTable dataTable, string path)
  26. {
  27. HSSFWorkbook workbook = new HSSFWorkbook();
  28. ISheet sheet = string.IsNullOrEmpty(dataTable.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dataTable.TableName);//创建工作表
  29.  
  30. #region 标题
  31. if (!string.IsNullOrEmpty(dataTable.TableName))
  32. {
  33. dataTable.Rows.InsertAt(dataTable.NewRow(), );
  34. if (dataTable.Columns.Count > )
  35. {
  36. dataTable.Rows[][] = dataTable.TableName + HtmlTableUtil.valueSeparater + "" + HtmlTableUtil.valueSeparater + dataTable.Columns.Count;
  37. }
  38. for (int i = ; i < dataTable.Columns.Count; i++)
  39. {
  40. dataTable.Rows[][i] = HtmlTableUtil.nullFlag + HtmlTableUtil.valueSeparater + "" + HtmlTableUtil.valueSeparater + "";
  41. }
  42. }
  43. #endregion
  44.  
  45. #region 填充数据
  46. for (int i = ; i < dataTable.Rows.Count; i++)//遍历DataTable行
  47. {
  48. DataRow dataRow = dataTable.Rows[i];
  49. IRow row = sheet.CreateRow(i);//在工作表中添加一行
  50. row.HeightInPoints = ;
  51.  
  52. for (int j = ; j < dataTable.Columns.Count; j++)//遍历DataTable列
  53. {
  54. string cellValue = dataRow[j].ToString();
  55. ICell cell = row.CreateCell(j);//在行中添加一列
  56. ICellStyle cellStyle = workbook.CreateCellStyle();
  57. cellStyle.BorderBottom = BorderStyle.Thin;
  58. cellStyle.BorderLeft = BorderStyle.Thin;
  59. cellStyle.BorderRight = BorderStyle.Thin;
  60. cellStyle.BorderTop = BorderStyle.Thin;
  61. cellStyle.VerticalAlignment = VerticalAlignment.Top;
  62. cell.CellStyle = cellStyle;
  63.  
  64. string[] valArr = cellValue.Split(new string[] { HtmlTableUtil.valueSeparater }, StringSplitOptions.None);
  65. if (valArr[] != HtmlTableUtil.nullFlag)
  66. {
  67. double d;
  68. if (double.TryParse(valArr[], out d))
  69. {
  70. cell.SetCellType(CellType.Numeric);
  71. cell.SetCellValue(d);//设置列的内容
  72. }
  73. else
  74. {
  75. cell.SetCellValue(valArr[]);//设置列的内容
  76. if (i != ) cellStyle.Alignment = HorizontalAlignment.Center;
  77. }
  78. if (i != )
  79. {
  80. int unitWidth = ;
  81. int oldWidth = sheet.GetColumnWidth(j);
  82. int width = (int)Math.Round(CommonHelper.GetWidthUnitCount(valArr[])) * unitWidth;
  83. width = width > unitWidth * ? unitWidth * : width;
  84. width = width < unitWidth * ? unitWidth * : width;
  85. if (width > oldWidth)
  86. {
  87. sheet.SetColumnWidth(j, width);
  88. }
  89. }
  90. }
  91. }
  92. }
  93. #endregion
  94.  
  95. #region 合并单元格
  96. for (int i = ; i < dataTable.Rows.Count; i++)//遍历DataTable行
  97. {
  98. DataRow dataRow = dataTable.Rows[i];
  99.  
  100. for (int j = ; j < dataTable.Columns.Count; j++)//遍历DataTable列
  101. {
  102. string cellValue = dataRow[j].ToString();
  103. string[] valArr = cellValue.Split(new string[] { HtmlTableUtil.valueSeparater }, StringSplitOptions.None);
  104.  
  105. int rowSpan = int.Parse(valArr[]);
  106. int colSpan = int.Parse(valArr[]);
  107. if (rowSpan > || colSpan > )
  108. {
  109. sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(i, i + rowSpan - , j, j + colSpan - ));
  110. }
  111. }
  112. }
  113. #endregion
  114.  
  115. #region 输出到Excel
  116. MemoryStream ms = new MemoryStream();
  117. workbook.Write(ms);
  118.  
  119. using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
  120. {
  121. byte[] bArr = ms.ToArray();
  122. fs.Write(bArr, , bArr.Length);
  123. fs.Flush();
  124. }
  125. #endregion
  126.  
  127. }
  128. #endregion
  129.  
  130. }
  131. }

带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel的更多相关文章

  1. Datatables js 复杂表头 合并单元格

    x →Datatables官网← x 项目中用到的Table都是用Datatables插件来搞得: 以前都是生成一般性的table: 近期要生成一些复杂表头,合并单元格之类的: 研究了一下. x 去官 ...

  2. layui table+复杂表头+合并单元格

    效果图: 问题:行hover效果感觉错乱  所以改为透明色 代码: <!DOCTYPE html> <html lang="en"> <head> ...

  3. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  4. 让我头疼一下午的Excel合并单元格

    Excel导出常见问题 excel导出其实不算什么难事 在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了. 但是,凡事都有例外,截止今天,excel导出 ...

  5. poi导出Excel报表多表头双层表头、合并单元格

    效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @ ...

  6. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

  7. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  8. vue中 表头th 合并单元格,且表格列数不定的动态渲染方法

    吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头的单元格,且合并单元格的那列还是动态数据,也就是说你不知道会有多少组要合并起来,哎,我也有点说不清楚,废话不多说了,看代码把: 代码示例 da ...

  9. 【转】C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码

    本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行. 本例子是上一篇 DataTable 导出 Excel 的进 ...

随机推荐

  1. nginx location 的配置

    一.基本语法:location [=|~|~*|^~] /uri/ { … } 二.分类: 1.基本location:以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/ 2.正则locat ...

  2. EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据

    ---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据  ...

  3. 无须任何软件配置iis+ftp服务器图文说明

    1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...

  4. 使用ueditor小结

    1. 导入 js: ueditor.config.js ueditor.all.js css/images/plugin: themes lang dialog(可选) third-party(可选) ...

  5. 99 Lisp Problems 二叉树(P54~P69)

    P54A (*) Check whether a given term represents a binary tree Write a predicate istree which returns ...

  6. Linux下php5.3编译oracle客户端

    因项目需要在linux下进行php5.3的oracle客户端编译,简要介绍一下步骤及走过的弯路. 1.下载Oracle客户端程序包,其中包含OCI.OCCI和JDBC-OCI等相关文件. 1.1下载文 ...

  7. 【Android】如何快速构建Android Demo

    [Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...

  8. CLR via C#深解笔记一 - CLR & C# 基础概念

    写在前言   .Net Framework并不是Win 32 API 和COM上的一个抽象层.   某种程度上,它是自己的操作系统,有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理 ...

  9. 精确计算TFS中新增以及更改的代码行数

    <configuration> <configSections> <section name="LOCTargets" type="Cons ...

  10. CentOS 6上安装xfce桌面环境

    [日期:2012-01-30]   在新的CentOS 6上默认没有包含xfce的桌面环境,使用yum也找不到这些包,但是自己又喜欢这种简单的桌面环境,此时可以使用下面的方法来安装 [plain] $ ...