步骤:

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

<!--导出Excel-->
<script type="text/javascript">
//导出Excel
function exportExcel() {
var data = "";
$("#divRptTable").find("table").find("tr").each(function () {
var tr = $(this);
tr.find("td").each(function () {
var td = $(this);
var rowspan = td.attr("rowspan") ? td.attr("rowspan") : 1;
var colspan = td.attr("colspan") ? td.attr("colspan") : 1;
data = data + td.text() + "#{valueSeparater}" + rowspan + "#{valueSeparater}" + colspan + "#{columnSeparater}";
});
data = data + "#{rowSeparater}";
});
$("#hidTableData").val(data); var year = $("select[name='year']").find("option[value='" + $("select[name='year']").val() + "']").text();
var sem = $("select[name='sem']").find("option[value='" + $("select[name='sem']").val() + "']").text();
var scl = $("select[name='school']").find("option[value='" + $("select[name='school']").val() + "']").text();
var grade = $("select[name='grade']").find("option[value='" + $("select[name='grade']").val() + "']").text();
var exam = $("select[name='exam']").find("option[value='" + $("select[name='exam']").val() + "']").text();
$("#hidTitle").val(scl + " " + grade + " " + year + " " + sem + " " + exam); $("#frm").submit();
}
</script>

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

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Web.UI.HtmlControls; // 2014年4月2日 namespace QuaEdu.Controller.Core.Utils
{
/// <summary>
/// HtmlTable工具类
/// 提供字符串转换成HtmlTable,HtmlTable转换成DataTable
/// </summary>
public class HtmlTableUtil
{
#region 变量
/// <summary>
/// 行分隔
/// </summary>
public static readonly string rowSeparater = "|||||";
/// <summary>
/// 列分隔
/// </summary>
public static readonly string columnSeparater = "@@@@@";
/// <summary>
/// 值分隔
/// </summary>
public static readonly string valueSeparater = "$$$$$";
/// <summary>
/// 空值标识
/// </summary>
public static readonly string nullFlag = "HtmlTableUtil_NULL_FLAG";
#endregion #region 字符串转换成HtmlTable
/// <summary>
/// 字符串转换成HtmlTable
/// </summary>
public static HtmlTable String2HtmlTable(string data)
{
HtmlTable htmlTable = new HtmlTable(); string[] rowArray = data.Split(new string[] { rowSeparater }, StringSplitOptions.RemoveEmptyEntries);
foreach (string row in rowArray)//遍历行
{
HtmlTableRow htmlTableRow = new HtmlTableRow(); string[] colArray = row.Split(new string[] { columnSeparater }, StringSplitOptions.RemoveEmptyEntries);
foreach (string col in colArray)//遍历列
{
HtmlTableCell htmlTableCell = new HtmlTableCell(); string[] valArr = col.Split(new string[] { valueSeparater }, StringSplitOptions.None);
string val = valArr[];
int rowspan = int.Parse(valArr[]);
int colspan = int.Parse(valArr[]); htmlTableCell.InnerText = val;
htmlTableCell.RowSpan = rowspan;
htmlTableCell.ColSpan = colspan;
htmlTableRow.Cells.Add(htmlTableCell);
}
htmlTable.Rows.Add(htmlTableRow);
} return htmlTable;
}
#endregion #region HtmlTable转换成DataTable
/// <summary>
/// HtmlTable转换成DataTable
/// </summary>
public static DataTable HtmlTable2DataTable(HtmlTable htmlTable)
{
DataTable dataTable = new DataTable(); #region DataTable列数
int colCount = ;
if (htmlTable.Rows.Count > )
{
foreach (HtmlTableCell htmlTableCell in htmlTable.Rows[].Cells)
{
colCount += htmlTableCell.ColSpan;
}
}
#endregion #region DataTable行数
int rowCount = htmlTable.Rows.Count;
#endregion #region 给DataTable添加列
for (int i = ; i < colCount; i++)
{
dataTable.Columns.Add();
}
#endregion #region 给DataTable添加行
for (int i = ; i < rowCount; i++)//遍历行
{
DataRow dataRow = dataTable.NewRow();
for (int j = ; j < colCount; j++)//遍历列
{
dataRow[j] = null;
}
dataTable.Rows.Add(dataRow);
}
#endregion #region 转换
for (int i = ; i < htmlTable.Rows.Count; i++)//遍历HtmlTable行
{
HtmlTableRow htmlTableRow = htmlTable.Rows[i];
int delta = ;//列增量 for (int j = ; j < htmlTableRow.Cells.Count; j++)//遍历HtmlTable列
{
HtmlTableCell htmlTableCell = htmlTableRow.Cells[j]; #region 计算delta
for (int k = j + delta; k < colCount; k++)
{
string cellValue = dataTable.Rows[i][k].ToString();
if (cellValue != null)
{
if (cellValue.IndexOf(nullFlag) == )
{
delta++;
continue;
}
}
break;
}
#endregion #region 填充DataTable
dataTable.Rows[i][j + delta] = htmlTableCell.InnerText + valueSeparater + htmlTableCell.RowSpan + valueSeparater + htmlTableCell.ColSpan;
if (htmlTableCell.RowSpan > || htmlTableCell.ColSpan > )
{
for (int m = ; m < htmlTableCell.RowSpan; m++)
{
for (int n = ; n < htmlTableCell.ColSpan; n++)
{
if (!(m == && n == ))
{
int ii = i + m;
int jj = j + delta + n;
dataTable.Rows[ii][jj] = nullFlag + valueSeparater + "" + valueSeparater + "";
}
}
}
}
#endregion }
}
#endregion return dataTable;
}
#endregion }
}

三、将DataTable导出到Excel

using System;
using System.Collections.Generic;
using System.Text;
using NPOI.HSSF.UserModel;
using System.Data;
using System.IO;
using NPOI.SS.UserModel;
using QuaEdu.Helper; // 2014年4月2日 namespace QuaEdu.Controller.Core.Utils
{
/// <summary>
/// Excel工具类
/// 利用NPOI生成Excel
/// </summary>
public class ExcelUtil
{
#region 生成Excel
/// <summary>
/// 生成Excel
/// DataTable必须使用HtmlTableUtil.HtmlTable2DataTable生成
/// </summary>
public static void CreateExcel(DataTable dataTable, string path)
{
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = string.IsNullOrEmpty(dataTable.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dataTable.TableName);//创建工作表 #region 标题
if (!string.IsNullOrEmpty(dataTable.TableName))
{
dataTable.Rows.InsertAt(dataTable.NewRow(), );
if (dataTable.Columns.Count > )
{
dataTable.Rows[][] = dataTable.TableName + HtmlTableUtil.valueSeparater + "" + HtmlTableUtil.valueSeparater + dataTable.Columns.Count;
}
for (int i = ; i < dataTable.Columns.Count; i++)
{
dataTable.Rows[][i] = HtmlTableUtil.nullFlag + HtmlTableUtil.valueSeparater + "" + HtmlTableUtil.valueSeparater + "";
}
}
#endregion #region 填充数据
for (int i = ; i < dataTable.Rows.Count; i++)//遍历DataTable行
{
DataRow dataRow = dataTable.Rows[i];
IRow row = sheet.CreateRow(i);//在工作表中添加一行
row.HeightInPoints = ; for (int j = ; j < dataTable.Columns.Count; j++)//遍历DataTable列
{
string cellValue = dataRow[j].ToString();
ICell cell = row.CreateCell(j);//在行中添加一列
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.VerticalAlignment = VerticalAlignment.Top;
cell.CellStyle = cellStyle; string[] valArr = cellValue.Split(new string[] { HtmlTableUtil.valueSeparater }, StringSplitOptions.None);
if (valArr[] != HtmlTableUtil.nullFlag)
{
double d;
if (double.TryParse(valArr[], out d))
{
cell.SetCellType(CellType.Numeric);
cell.SetCellValue(d);//设置列的内容
}
else
{
cell.SetCellValue(valArr[]);//设置列的内容
if (i != ) cellStyle.Alignment = HorizontalAlignment.Center;
}
if (i != )
{
int unitWidth = ;
int oldWidth = sheet.GetColumnWidth(j);
int width = (int)Math.Round(CommonHelper.GetWidthUnitCount(valArr[])) * unitWidth;
width = width > unitWidth * ? unitWidth * : width;
width = width < unitWidth * ? unitWidth * : width;
if (width > oldWidth)
{
sheet.SetColumnWidth(j, width);
}
}
}
}
}
#endregion #region 合并单元格
for (int i = ; i < dataTable.Rows.Count; i++)//遍历DataTable行
{
DataRow dataRow = dataTable.Rows[i]; for (int j = ; j < dataTable.Columns.Count; j++)//遍历DataTable列
{
string cellValue = dataRow[j].ToString();
string[] valArr = cellValue.Split(new string[] { HtmlTableUtil.valueSeparater }, StringSplitOptions.None); int rowSpan = int.Parse(valArr[]);
int colSpan = int.Parse(valArr[]);
if (rowSpan > || colSpan > )
{
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(i, i + rowSpan - , j, j + colSpan - ));
}
}
}
#endregion #region 输出到Excel
MemoryStream ms = new MemoryStream();
workbook.Write(ms); using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
byte[] bArr = ms.ToArray();
fs.Write(bArr, , bArr.Length);
fs.Flush();
}
#endregion }
#endregion }
}

带复杂表头合并单元格的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. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  2. mediawiki的管理与使用

    本文主要讲述搭建好私有的mediawiki之后,管理员可能需要用到的几个功能.   维基百科的设计思路与我以往使用的系统不太一样,以管理员模式进入之后,并没有我预想的添加wiki页面入口,和侧边栏导航 ...

  3. 准备开源一套异形UI控件

    今天整理磁盘,发现在一个以前加密过的一个磁盘文件中发现了一些以前做的UI代码.平时都没怎么去用,放着放着只会慢慢的去遗忘,所以打算慢慢的将一些UI代码整理整理,然后开源出来,集合广大Delphier的 ...

  4. mac os x 安装mysql遇到 Access denied for user 'root'@'localhost' (using password: YES)的解决方法

    最近把开发环境迁移到macbook上,装上mysql启动之后,连接,总是报这个错误.5.5的版本默认密码为空.其实这个错误是root未授权的问题.解决方法如下: 未给localhost root用户授 ...

  5. openssl 学习之从证书中提取RSA公钥N 和 E

    原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息,其中N和E值即我们称为的公钥.如何从PEM 或者DER格式 ...

  6. Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法

    Spring3系列10- Spring AOP——Pointcut,Advisor 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都 ...

  7. git 在提交之前撤销add操作

    问题 在使用git时,在未添加.ignore文件前使用 git add . 将所有文件添加到库中,不小心将一些不需要加入版本库的文件加到了版本库中.由于此时还没有提交所以不存在HEAD版本,不能使用 ...

  8. 深入浅出MySQL 数据库开发、优化与管理维护(第2版) -- 读书笔记 -- 基础篇

      1.切换数据库 use blog; 2.显示当前数据库 所有的表. show tables; +----------------+ | Tables_in_blog | +------------ ...

  9. yii2 [行为] behaviors 拦截器

    yii2 拦截器 在控制器中可以自定义对action的拦截器,拦截器需要继承 \yii\base\ActionFilter 参考代码: class BaseUserAuthorizeFilter ex ...

  10. 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)

    对于滑动菜单栏SlidingMenu,大家应该都不陌生,在市场上的一些APP应用里经常可以见到,比如人人网,FaceBook等. 前段时间QQ5.0版本出来后也采用了这种设计风格:(下面是效果图) 之 ...