微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

步骤:

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

<!--导出Excel-->
<script type="text/javascript">
    //导出Excel
    function exportExcel() {
        var data = "";
        $("#divRptTable").find("table").find("tr").each( () {
            var tr = $(this);
            tr.find("td").each( () {
                var td = $();
                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() + "']"var scl = $("select[name='school']").find("option[value='" + $("select[name='school']").val() + "']"var grade = $("select[name='grade']").find("option[value='" + $("select[name='grade']").val() + "']"var exam = $("select[name='exam']").find("option[value='" + $("select[name='exam']").val() + "']").text();
        $("#hidTitle").val(scl + " " + grade + " " + year + " " + sem + " " + exam);

        $("#frm").submit();
    }
</script>
View Code

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

using System;
 System.Collections.Generic;
 System.Text;
 System.Data;
 System.Web.UI.HtmlControls;

 2014年4月2日

namespace QuaEdu.Controller.Core.Utils
{
    /// <summary>
    /// HtmlTable工具类
     提供字符串转换成HtmlTable,HtmlTable转换成DataTable
    </summary>
    public class HtmlTableutil
    {
        #region 变量
        <summary>
         行分隔
        </summary>
        static readonly string rowSeparater = "|||||";
         列分隔
        string columnSeparater = @@@@@ 值分隔
        string valueSeparater = $$$$$ 空值标识
        string nullFlag = HtmlTableutil_NULL_FLAG;
        #endregion

        #region 字符串转换成HtmlTable
         字符串转换成HtmlTable
        static HtmlTable String2HtmlTable(string data)
        {
            HtmlTable htmlTable = new HtmlTable();

            string[] rowArray = data.Split(new [] { rowSeparater },StringSplitOptions.RemoveEmptyEntries);
            foreach (string row in rowArray)遍历行
            {
                HtmlTableRow htmlTableRow =  HtmlTableRow();

                string[] colArray = row.Split([] { columnSeparater },StringSplitOptions.RemoveEmptyEntries);
                string col in colArray)遍历列
                {
                    HtmlTableCell htmlTableCell =  HtmlTableCell();

                    string[] valArr = col.Split([] { valueSeparater },StringSplitOptions.None);
                    string val = valArr[0];
                    int rowspan = int.Parse(valArr[1]);
                    int colspan = 2]);

                    htmlTableCell.InnerText = val;
                    htmlTableCell.RowSpan = rowspan;
                    htmlTableCell.ColSpan = colspan;
                    htmlTableRow.Cells.Add(htmlTableCell);
                }
                htmlTable.Rows.Add(htmlTableRow);
            }

            return htmlTable;
        }
        #region HtmlTable转换成DataTable
         HtmlTable转换成DataTable
        static DataTable HtmlTable2DataTable(HtmlTable htmlTable)
        {
            DataTable dataTable =  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;
            #region 给DataTable添加for (int i = 0; i < colCount; i++)
            {
                dataTable.Columns.Add();
            }
            #region 给DataTable添加0; i < rowCount; i++)            {
                DaTarow daTarow = dataTable.NewRow();
                int j = 0; j < colCount; j++)                {
                    daTarow[j] = null;
                }
                dataTable.Rows.Add(daTarow);
            }
            #region 转换
            0; i < htmlTable.Rows.Count; i++)遍历HtmlTable行
            {
                HtmlTableRow htmlTableRow = htmlTable.Rows[i];
                int delta = 0;列增量

                0; j < htmlTableRow.Cells.Count; j++)遍历HtmlTable列
                {
                    HtmlTableCell htmlTableCell = htmlTableRow.Cells[j];

                    #region 计算delta
                    int k = j + delta; k < colCount; k++)
                    {
                        string cellValue = dataTable.Rows[i][k].ToString();
                        if (cellValue != )
                        {
                            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 > 1 || htmlTableCell.ColSpan > int m = 0; m < htmlTableCell.RowSpan; m++int n = 0; n < htmlTableCell.ColSpan; n++)
                            {
                                if (!(m == 0 && n == ))
                                {
                                    int ii = i + m;
                                    int jj = j + delta + n;
                                    dataTable.Rows[ii][jj] = nullFlag + valueSeparater + 1" + valueSeparater + ;
                                }
                            }
                        }
                    }
                    #endregion

                }
            }
             dataTable;
        }
        

    }
}
View Code

 三、将DataTable导出到Excel

 NPOI.hssf.usermodel;
 System.IO;
 NPOI.SS.usermodel;
 QuaEdu.Helper;

 Excel工具类
     利用NPOI生成Excel
     ExcelUtil
    {
        #region 生成Excel
         生成Excel
         DataTable必须使用HtmlTableutil.HtmlTable2DataTable生成
        void CreateExcel(DataTable dataTable, path)
        {
            hssfWorkbook workbook =  hssfWorkbook();
            ISheet sheet = string.IsNullOrEmpty(dataTable.TableName) ? workbook.CreateSheet(Sheet1") : workbook.CreateSheet(dataTable.TableName);创建工作表

            #region 标题
            if (!.IsNullOrEmpty(dataTable.TableName))
            {
                dataTable.Rows.InsertAt(dataTable.NewRow(),if (dataTable.Columns.Count > )
                {
                    dataTable.Rows[0][0] = dataTable.TableName + HtmlTableutil.valueSeparater + " + HtmlTableutil.valueSeparater + dataTable.Columns.Count;
                }
                1; i < dataTable.Columns.Count; i++0][i] = HtmlTableutil.nullFlag + HtmlTableutil.valueSeparater + " + HtmlTableutil.valueSeparater + ;
                }
            }
            #region 填充数据
            0; i < dataTable.Rows.Count; i++)遍历DataTable行
 dataTable.Rows[i];
                IRow row = sheet.CreateRow(i);在工作表中添加一行
                row.HeightInPoints = 20;

                0; j < dataTable.Columns.Count; j++)遍历DataTable列
                {
                     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([] { HtmlTableutil.valueSeparater },1)">if (valArr[0] != HtmlTableutil.nullFlag)
                    {
                        double d;
                        if (double.TryParse(valArr[0],1)">out d))
                        {
                            cell.SetCellType(CellType.Numeric);
                            cell.SetCellValue(d);设置列的内容              
                        }
                        else
                        {
                            cell.SetCellValue(valArr[0]);设置列的内容
                            if (i != 0) cellStyle.Alignment = HorizontalAlignment.Center;
                        }
                        int unitWidth = 400;
                            int oldWidth = sheet.GetColumnWidth(j);
                            int width = (int)Math.Round(CommonHelper.GetWidthUnitCount(valArr[0])) * unitWidth;
                            width = width > unitWidth * 30 ? unitWidth * 30 : width;
                            width = width < unitWidth * 2 ? unitWidth *  : width;
                            if (width > oldWidth)
                            {
                                sheet.SetColumnWidth(j,width);
                            }
                        }
                    }
                }
            }
            #region 合并单元格
             dataTable.Rows[i];

                 daTarow[j].ToString();
                    int rowSpan = int colSpan = if (rowSpan > 1 || colSpan > )
                    {
                        sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(i,i + rowSpan - 1,j,j + colSpan - ));
                    }
                }
            }
            #region 输出到Excel
            MemoryStream ms =  MemoryStream();
            workbook.Write(ms);

            using (FileStream fs =  FileStream(path,FileMode.Create,FileAccess.Write))
            {
                byte[] bArr = ms.ToArray();
                fs.Write(bArr,1)">,bArr.Length);
                fs.Flush();
            }
            

        }
        

    }
}
View Code

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐