zoukankan      html  css  js  c++  java
  • NPOI导出EXCEL数据量大,分多个sheet显示数据

    //NPOIHelper  类关键代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.IO;
    using NPOI.HSSF.UserModel;
    using System.Collections;
    using System.Web;

    namespace Yikeba_htmlConverter
    {
        public class NPOIHelper
        {
            /// <summary>
            /// 列名集合
            /// </summary>
            public static System.Collections.SortedList ListColumnsName;
            /// <summary>
            /// 导出Excel通过文件路径
            /// </summary>
            /// <param name="dtSource">DataTable数据源</param>
            /// <param name="filePath">文件路径</param>
            public static void ExportExcel(DataTable dtSource, string filePath)
            {
                if (ListColumnsName == null || ListColumnsName.Count == 0)
                    throw (new Exception("请对ListColumnsName设置要导出的列名!"));

                HSSFWorkbook excelWorkbook = CreateExcelFile();
                InsertRow(dtSource, excelWorkbook);
                SaveExcelFile(excelWorkbook, filePath);
            }

            /// <summary>
            /// 导出Excel通过流
            /// </summary>
            /// <param name="dtSource">DataTable数据源</param>
            /// <param name="excelStream">流操作</param>
            public static void ExportExcel(DataTable dtSource, Stream excelStream)
            {
                if (ListColumnsName == null || ListColumnsName.Count == 0)
                    throw (new Exception("请对ListColumnsName设置要导出的列明!"));

                HSSFWorkbook excelWorkbook = CreateExcelFile(); //新建一个工作区域
                InsertRow(dtSource, excelWorkbook);//导入数据的方法
                SaveExcelFile(excelWorkbook, excelStream);//保存excel
            }

            /// <summary>
            /// 保存Excel文件通过路径
            /// </summary>
            /// <param name="excelWorkBook"></param>
            /// <param name="filePath"></param>
            protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, string filePath)
            {
                FileStream file = null;
                try
                {
                    file = new FileStream(filePath, FileMode.Create);
                    excelWorkBook.Write(file);
                }
                finally
                {
                    if (file != null)
                    {
                        file.Close();
                    }
                }
            }
            /// <summary>
            /// 保存Excel文件
            /// </summary>
            /// <param name="excelWorkBook"></param>
            /// <param name="filePath"></param>
            protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, Stream excelStream)
            {
                try
                {
                    excelWorkBook.Write(excelStream);
                }
                finally
                {

                }
            }

            /// <summary>
            /// 创建Excel文件
            /// </summary>
            /// <param name="filePath"></param>
            protected static HSSFWorkbook CreateExcelFile()
            {
                HSSFWorkbook hssfworkbook = new HSSFWorkbook();
                return hssfworkbook;
            }

            /// <summary>
            /// 创建excel表头
            /// </summary>
            /// <param name="dgv"></param>
            /// <param name="excelSheet"></param>
            protected static void CreateHeader(HSSFSheet excelSheet)
            {
                int cellIndex = 0;
                //循环导出列
                foreach (System.Collections.DictionaryEntry de in ListColumnsName)
                {
                    HSSFRow newRow = excelSheet.CreateRow(0);
                    HSSFCell newCell = newRow.CreateCell(cellIndex);
                    newCell.SetCellValue(de.Value.ToString());
                    cellIndex++;
                }
            }

            /// <summary>
            /// 插入数据行
            /// </summary>
            protected static void InsertRow(DataTable dtSource, HSSFWorkbook excelWorkbook)
            {
                int rowCount = 0;
                int sheetCount = 1;
                HSSFSheet newsheet = null;

                //循环数据源导出数据集
                newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); //创建第一个sheet
                CreateHeader(newsheet);//加载sheet的头信息
                foreach (DataRow dr in dtSource.Rows)  //循环DataTable里面的数据行
                {
                    rowCount++;
                    //超出10000条数据 创建新的工作簿
                    if (rowCount == 10000)   //超过10000行数据就新建一个sheet
                    {
                        rowCount = 1;
                        sheetCount++;
                        newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); //新建sheet
                        CreateHeader(newsheet);//新建sheet的头信息
                    }

                    HSSFRow newRow = newsheet.CreateRow(rowCount);//创建sheet的当前行
                    InsertCell(dtSource, dr, newRow, newsheet, excelWorkbook);  //往当前行里面的每一列循环添加数据
                }
            }

            /// <summary>
            /// 导出数据行
            /// </summary>
            /// <param name="dtSource"></param>
            /// <param name="drSource"></param>
            /// <param name="currentExcelRow"></param>
            /// <param name="excelSheet"></param>
            /// <param name="excelWorkBook"></param>
            protected static void InsertCell(DataTable dtSource, DataRow drSource, HSSFRow currentExcelRow, HSSFSheet excelSheet, HSSFWorkbook excelWorkBook)
            {
                for (int cellIndex = 0; cellIndex < ListColumnsName.Count; cellIndex++)
                {
                    //列名称
                    string columnsName = ListColumnsName.GetKey(cellIndex).ToString();
                    HSSFCell newCell = null;
                    System.Type rowType = drSource[cellIndex].GetType();
                    string drValue = drSource[cellIndex].ToString().Trim();
                    switch (rowType.ToString())
                    {
                        case "System.String"://字符串类型
                            drValue = drValue.Replace("&", "&");
                            drValue = drValue.Replace(">", ">");
                            drValue = drValue.Replace("<", "<");
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue(drValue);
                            break;
                        case "System.DateTime"://日期类型
                            DateTime dateV;
                            DateTime.TryParse(drValue, out dateV);
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue(dateV);

                            //格式化显示
                            HSSFCellStyle cellStyle = excelWorkBook.CreateCellStyle();
                            HSSFDataFormat format = excelWorkBook.CreateDataFormat();
                            cellStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss");
                            newCell.CellStyle = cellStyle;

                            break;
                        case "System.Boolean"://布尔型
                            bool boolV = false;
                            bool.TryParse(drValue, out boolV);
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue(boolV);
                            break;
                        case "System.Int16"://整型
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            int intV = 0;
                            int.TryParse(drValue, out intV);
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue(intV.ToString());
                            break;
                        case "System.Decimal"://浮点型
                        case "System.Double":
                            double doubV = 0;
                            double.TryParse(drValue, out doubV);
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue(doubV);
                            break;
                        case "System.DBNull"://空值处理
                            newCell = currentExcelRow.CreateCell(cellIndex);
                            newCell.SetCellValue("");
                            break;
                        default:
                            throw (new Exception(rowType.ToString() + ":类型数据无法处理!"));
                    }
                }
            }
        }

        //排序实现接口 不进行排序 根据添加顺序导出
       
        public class NoSort : System.Collections.IComparer
        {
            public int Compare(object x, object y)
            {
                return -1;
            }
        }
    }

    //新建一个WebForm1页面测试

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using Yikeba_htmlConverter;
    using System.Xml;
    using System.IO;

    namespace WebApplication1
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                //导出数据列 实现根据添加顺序导出列
                NPOIHelper.ListColumnsName = new SortedList(new NoSort());
                NPOIHelper.ListColumnsName.Add("MemberName", "姓名");
                NPOIHelper.ListColumnsName.Add("username", "账号");
                NPOIHelper.ListColumnsName.Add("starttime", "登陆时间");
                NPOIHelper.ListColumnsName.Add("lasttime", "在线到期时间");
                NPOIHelper.ListColumnsName.Add("state", "状态");
                Response.Clear();
                Response.BufferOutput = false;
                Response.ContentEncoding = System.Text.Encoding.UTF8;
                string filename = HttpUtility.UrlEncode(DateTime.Now.ToString("在线用户yyyyMMdd"));
                Response.AddHeader("Content-Disposition", "attachment;filename=DownExcel" + ".xls");
                Response.ContentType = "application/ms-excel";

                string str = "<table><tr><td>CSBT-120906-TG6</td><td>廖建军</td><td>LIAO</td><td>JIANJUN</td><td>男</td></tr><tr><td>CSBT-120906-TG7</td><td>王汉刚</td><td>WANG</td><td>HANGANG</td><td>男</td></tr></table>";
                str = "<?xml version=\"1.0\" standalone=\"yes\"?>" + str;

                //清洗
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(str);

                XmlNodeList nodes = doc.SelectNodes("table/tr");
                foreach (XmlElement node in nodes)
                {
                    node.Attributes.RemoveAll(); //这里把Tr所有的属性都去掉

                    for (int i = 0; i < node.ChildNodes.Count; i++) //列的循环,为每个列指定名称
                    {
                        XmlNode n = doc.CreateNode(XmlNodeType.Element, "col" + i.ToString(), "");
                        n.InnerXml = node.ChildNodes[i].InnerXml;
                        node.ReplaceChild(n, node.ChildNodes[i]);
                    }
                }
                //导入Dataset
                StringReader tr = new StringReader(doc.InnerXml);
                DataSet ds = new DataSet();
                ds.ReadXml(tr);
                DataTable dtSource = ds.Tables[0];
               // DataTable dtSource = new DataTable();
                NPOIHelper.ExportExcel(dtSource, Response.OutputStream);
                Response.Close();
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //辅助

    http://www.cnblogs.com/atao/archive/2009/09/24/1572980.html  生成下拉列表

    http://www.cnblogs.com/tonyqus/category/182110.html    更多更详细的execl用法 
    http://www.cnblogs.com/atao/archive/2009/09/13/1565644.html  处理日期函数
    http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html  NPOI使用Excel公式、 单元格操作、创建图形等高级功能

  • 相关阅读:
    模拟扑克的洗发牌
    结构体 枚举类型
    return、break和continue
    clipboard.js操作剪贴版——一些移动端交互和兼容经验
    国外主机如何ICP备案
    js文件操作之——导出Excel (js-xlsx)
    深入浅出写一个多级异步回调从基础到Promise实现的Demo
    一个考察闭包的最基础的面试题
    shell常用命令及正则辅助日志分析统计
    node-webkit笔记
  • 原文地址:https://www.cnblogs.com/ITanyx/p/NPOI.html
Copyright © 2011-2022 走看看