带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel
步骤:
一、前台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的更多相关文章
- Datatables js 复杂表头 合并单元格
x →Datatables官网← x 项目中用到的Table都是用Datatables插件来搞得: 以前都是生成一般性的table: 近期要生成一些复杂表头,合并单元格之类的: 研究了一下. x 去官 ...
- layui table+复杂表头+合并单元格
效果图: 问题:行hover效果感觉错乱 所以改为透明色 代码: <!DOCTYPE html> <html lang="en"> <head> ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- 让我头疼一下午的Excel合并单元格
Excel导出常见问题 excel导出其实不算什么难事 在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了. 但是,凡事都有例外,截止今天,excel导出 ...
- poi导出Excel报表多表头双层表头、合并单元格
效果图: controller层方法: /** * * 导出Excel报表 * @param request * @return * */ @ ...
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
- NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析
我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...
- vue中 表头th 合并单元格,且表格列数不定的动态渲染方法
吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头的单元格,且合并单元格的那列还是动态数据,也就是说你不知道会有多少组要合并起来,哎,我也有点说不清楚,废话不多说了,看代码把: 代码示例 da ...
- 【转】C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码
本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行. 本例子是上一篇 DataTable 导出 Excel 的进 ...
随机推荐
- nginx location 的配置
一.基本语法:location [=|~|~*|^~] /uri/ { … } 二.分类: 1.基本location:以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/ 2.正则locat ...
- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据
---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据 ...
- 无须任何软件配置iis+ftp服务器图文说明
1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...
- 使用ueditor小结
1. 导入 js: ueditor.config.js ueditor.all.js css/images/plugin: themes lang dialog(可选) third-party(可选) ...
- 99 Lisp Problems 二叉树(P54~P69)
P54A (*) Check whether a given term represents a binary tree Write a predicate istree which returns ...
- Linux下php5.3编译oracle客户端
因项目需要在linux下进行php5.3的oracle客户端编译,简要介绍一下步骤及走过的弯路. 1.下载Oracle客户端程序包,其中包含OCI.OCCI和JDBC-OCI等相关文件. 1.1下载文 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- CLR via C#深解笔记一 - CLR & C# 基础概念
写在前言 .Net Framework并不是Win 32 API 和COM上的一个抽象层. 某种程度上,它是自己的操作系统,有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理 ...
- 精确计算TFS中新增以及更改的代码行数
<configuration> <configSections> <section name="LOCTargets" type="Cons ...
- CentOS 6上安装xfce桌面环境
[日期:2012-01-30] 在新的CentOS 6上默认没有包含xfce的桌面环境,使用yum也找不到这些包,但是自己又喜欢这种简单的桌面环境,此时可以使用下面的方法来安装 [plain] $ ...