http://blog.csdn.net/heyangyi_19940703/article/details/52292755

http://www.cnblogs.com/zhengjuzhuan/archive/2010/02/01/1661103.html

http://www.cnblogs.com/stone_w/archive/2012/08/02/2620528.html

http://www.cnblogs.com/restran/p/3889479.html

http://blog.csdn.net/zjlovety/article/details/51384857

http://www.xuebuyuan.com/2116725.html

http://www.cnblogs.com/CallmeYhz/p/4997691.html

/// <summary>

/// 使用NPOI操作Excel,无需Office COM组件

/// Created By 囧月 http://lwme.cnblogs.com

/// 部分代码取自http://msdn.microsoft.com/zh-tw/ee818993.aspx

/// NPOI是POI的.NET移植版本,目前稳定版本中仅支持对xls文件(Excel 97-2003)文件格式的读写

/// NPOI官方网站http://npoi.codeplex.com/

/// </summary>

public class ExcelRender

{

    /// <summary>

    /// 根据Excel列类型获取列的值

    /// </summary>

    /// <param name="cell">Excel列</param>

    /// <returns></returns>

    private static string GetCellValue(ICell cell)

    {

        if (cell == null)

            return string.Empty;

        switch (cell.CellType)

        {

            case CellType.BLANK:

                return string.Empty;

            case CellType.BOOLEAN:

                return cell.BooleanCellValue.ToString();

            case CellType.ERROR:

                return cell.ErrorCellValue.ToString();

            case CellType.NUMERIC:

            case CellType.Unknown:

            default:

                return cell.ToString();//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number

            case CellType.STRING:

                return cell.StringCellValue;

            case CellType.FORMULA:

                try

                {

                    HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);

                    e.EvaluateInCell(cell);

                    return cell.ToString();

                }

                catch

                {

                    return cell.NumericCellValue.ToString();

                } 

        }

    }

    /// <summary>

    /// 自动设置Excel列宽

    /// </summary>

    /// <param name="sheet">Excel表</param>

    private static void AutoSizeColumns(ISheet sheet)

    {

        if (sheet.PhysicalNumberOfRows > 0)

        {

            IRow headerRow = sheet.GetRow(0);

            for (int i = 0, l = headerRow.LastCellNum; i < l; i++)

            {

                sheet.AutoSizeColumn(i);

            }

        }

    }

    /// <summary>

    /// 保存Excel文档流到文件

    /// </summary>

    /// <param name="ms">Excel文档流</param>

    /// <param name="fileName">文件名</param>

    private static void SaveToFile(MemoryStream ms, string fileName)

    {

        using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))

        {

            byte[] data = ms.ToArray();

            fs.Write(data, 0, data.Length);

            fs.Flush();

            data = null;

        }

    }

    /// <summary>

    /// 输出文件到浏览器

    /// </summary>

    /// <param name="ms">Excel文档流</param>

    /// <param name="context">HTTP上下文</param>

    /// <param name="fileName">文件名</param>

    private static void RenderToBrowser(MemoryStream ms, HttpContext context, string fileName)

    {

        if (context.Request.Browser.Browser == "IE")

            fileName = HttpUtility.UrlEncode(fileName);

        context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);

        context.Response.BinaryWrite(ms.ToArray());

    }

    /// <summary>

    /// DataReader转换成Excel文档流

    /// </summary>

    /// <param name="reader"></param>

    /// <returns></returns>

    public static MemoryStream RenderToExcel(IDataReader reader)

    {

        MemoryStream ms = new MemoryStream();

        using (reader)

        {

            using (IWorkbook workbook = new HSSFWorkbook())

            {

                using (ISheet sheet = workbook.CreateSheet())

                {

                    IRow headerRow = sheet.CreateRow(0);

                    int cellCount = reader.FieldCount;

                    // handling header.

                    for (int i = 0; i < cellCount; i++)

                    {

                        headerRow.CreateCell(i).SetCellValue(reader.GetName(i));

                    }

                    // handling value.

                    int rowIndex = 1;

                    while (reader.Read())

                    {

                        IRow dataRow = sheet.CreateRow(rowIndex);

                        for (int i = 0; i < cellCount; i++)

                        {

                            dataRow.CreateCell(i).SetCellValue(reader[i].ToString());

                        }

                        rowIndex++;

                    }

                    AutoSizeColumns(sheet);

                    workbook.Write(ms);

                    ms.Flush();

                    ms.Position = 0;

                }

            }

        }

        return ms;

    }

    /// <summary>

    /// DataReader转换成Excel文档流,并保存到文件

    /// </summary>

    /// <param name="reader"></param>

    /// <param name="fileName">保存的路径</param>

    public static void RenderToExcel(IDataReader reader, string fileName)

    {

        using (MemoryStream ms = RenderToExcel(reader))

        {

            SaveToFile(ms, fileName);

        }

    }

    /// <summary>

    /// DataReader转换成Excel文档流,并输出到客户端

    /// </summary>

    /// <param name="reader"></param>

    /// <param name="context">HTTP上下文</param>

    /// <param name="fileName">输出的文件名</param>

    public static void RenderToExcel(IDataReader reader, HttpContext context, string fileName)

    {

        using (MemoryStream ms = RenderToExcel(reader))

        {

            RenderToBrowser(ms, context, fileName);

        }

    }

    /// <summary>

    /// DataTable转换成Excel文档流

    /// </summary>

    /// <param name="table"></param>

    /// <returns></returns>

    public static MemoryStream RenderToExcel(DataTable table)

    {

        MemoryStream ms = new MemoryStream();

        using (table)

        {

            using (IWorkbook workbook = new HSSFWorkbook())

            {

                using (ISheet sheet = workbook.CreateSheet())

                {

                    IRow headerRow = sheet.CreateRow(0);

                    // handling header.

                    foreach (DataColumn column in table.Columns)

                        headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value

                    // handling value.

                    int rowIndex = 1;

                    foreach (DataRow row in table.Rows)

                    {

                        IRow dataRow = sheet.CreateRow(rowIndex);

                        foreach (DataColumn column in table.Columns)

                        {

                            dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());

                        }

                        rowIndex++;

                    }

                    AutoSizeColumns(sheet);

                    workbook.Write(ms);

                    ms.Flush();

                    ms.Position = 0;

                }

            }

        }

        return ms;

    }

    /// <summary>

    /// DataTable转换成Excel文档流,并保存到文件

    /// </summary>

    /// <param name="table"></param>

    /// <param name="fileName">保存的路径</param>

    public static void RenderToExcel(DataTable table, string fileName)

    {

        using (MemoryStream ms = RenderToExcel(table))

        {

            SaveToFile(ms, fileName);

        }

    }

    /// <summary>

    /// DataTable转换成Excel文档流,并输出到客户端

    /// </summary>

    /// <param name="table"></param>

    /// <param name="response"></param>

    /// <param name="fileName">输出的文件名</param>

    public static void RenderToExcel(DataTable table, HttpContext context, string fileName)

    {

        using (MemoryStream ms = RenderToExcel(table))

        {

            RenderToBrowser(ms, context, fileName);

        }

    }

    /// <summary>

    /// Excel文档流是否有数据

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <returns></returns>

    public static bool HasData(Stream excelFileStream)

    {

        return HasData(excelFileStream, 0);

    }

    /// <summary>

    /// Excel文档流是否有数据

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="sheetIndex">表索引号,如第一个表为0</param>

    /// <returns></returns>

    public static bool HasData(Stream excelFileStream, int sheetIndex)

    {

        using (excelFileStream)

        {

            using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))

            {

                if (workbook.NumberOfSheets > 0)

                {

                    if (sheetIndex < workbook.NumberOfSheets)

                    {

                        using (ISheet sheet = workbook.GetSheetAt(sheetIndex))

                        {

                            return sheet.PhysicalNumberOfRows > 0;

                        }

                    }

                }

            }

        }

        return false;

    }

    /// <summary>

    /// Excel文档流转换成DataTable

    /// 第一行必须为标题行

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="sheetName">表名称</param>

    /// <returns></returns>

    public static DataTable RenderFromExcel(Stream excelFileStream, string sheetName)

    {

        return RenderFromExcel(excelFileStream, sheetName, 0);

    }

    /// <summary>

    /// Excel文档流转换成DataTable

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="sheetName">表名称</param>

    /// <param name="headerRowIndex">标题行索引号,如第一行为0</param>

    /// <returns></returns>

    public static DataTable RenderFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex)

    {

        DataTable table = null;

        using (excelFileStream)

        {

            using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))

            {

                using (ISheet sheet = workbook.GetSheet(sheetName))

                {

                    table = RenderFromExcel(sheet, headerRowIndex);

                }

            }

        }

        return table;

    }

    /// <summary>

    /// Excel文档流转换成DataTable

    /// 默认转换Excel的第一个表

    /// 第一行必须为标题行

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <returns></returns>

    public static DataTable RenderFromExcel(Stream excelFileStream)

    {

        return RenderFromExcel(excelFileStream, 0, 0);

    }

    /// <summary>

    /// Excel文档流转换成DataTable

    /// 第一行必须为标题行

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="sheetIndex">表索引号,如第一个表为0</param>

    /// <returns></returns>

    public static DataTable RenderFromExcel(Stream excelFileStream, int sheetIndex)

    {

        return RenderFromExcel(excelFileStream, sheetIndex, 0);

    }

    /// <summary>

    /// Excel文档流转换成DataTable

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="sheetIndex">表索引号,如第一个表为0</param>

    /// <param name="headerRowIndex">标题行索引号,如第一行为0</param>

    /// <returns></returns>

    public static DataTable RenderFromExcel(Stream excelFileStream, int sheetIndex, int headerRowIndex)

    {

        DataTable table = null;

        using (excelFileStream)

        {

            using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))

            {

                using (ISheet sheet = workbook.GetSheetAt(sheetIndex))

                {

                    table = RenderFromExcel(sheet, headerRowIndex);

                }

            }

        }

        return table;

    }

    /// <summary>

    /// Excel表格转换成DataTable

    /// </summary>

    /// <param name="sheet">表格</param>

    /// <param name="headerRowIndex">标题行索引号,如第一行为0</param>

    /// <returns></returns>

    private static DataTable RenderFromExcel(ISheet sheet, int headerRowIndex)

    {

        DataTable table = new DataTable();

        IRow headerRow = sheet.GetRow(headerRowIndex);

        int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells

        int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1

        //handling header.

        for (int i = headerRow.FirstCellNum; i < cellCount; i++)

        {

            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);

            table.Columns.Add(column);

        }

        for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)

        {

            IRow row = sheet.GetRow(i);

            DataRow dataRow = table.NewRow();

            if (row != null)

            {

                for (int j = row.FirstCellNum; j < cellCount; j++)

                {

                    if (row.GetCell(j) != null)

                        dataRow[j] = GetCellValue(row.GetCell(j));

                }

            }

            table.Rows.Add(dataRow);

        }

        return table;

    }

    /// <summary>

    /// Excel文档导入到数据库

    /// 默认取Excel的第一个表

    /// 第一行必须为标题行

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="insertSql">插入语句</param>

    /// <param name="dbAction">更新到数据库的方法</param>

    /// <returns></returns>

    public static int RenderToDb(Stream excelFileStream, string insertSql, DBAction dbAction)

    {

        return RenderToDb(excelFileStream, insertSql, dbAction, 0, 0);

    }

    public delegate int DBAction(string sql, params IDataParameter[] parameters);

    /// <summary>

    /// Excel文档导入到数据库

    /// </summary>

    /// <param name="excelFileStream">Excel文档流</param>

    /// <param name="insertSql">插入语句</param>

    /// <param name="dbAction">更新到数据库的方法</param>

    /// <param name="sheetIndex">表索引号,如第一个表为0</param>

    /// <param name="headerRowIndex">标题行索引号,如第一行为0</param>

    /// <returns></returns>

    public static int RenderToDb(Stream excelFileStream, string insertSql, DBAction dbAction, int sheetIndex, int headerRowIndex)

    {

        int rowAffected = 0;

        using (excelFileStream)

        {

            using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))

            {

                using (ISheet sheet = workbook.GetSheetAt(sheetIndex))

                {

                    StringBuilder builder = new StringBuilder();

                    IRow headerRow = sheet.GetRow(headerRowIndex);

                    int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells

                    int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1

                    for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)

                    {

                        IRow row = sheet.GetRow(i);

                        if (row != null)

                        {

                            builder.Append(insertSql);

                            builder.Append(" values (");

                            for (int j = row.FirstCellNum; j < cellCount; j++)

                            {

                                builder.AppendFormat("'{0}',", GetCellValue(row.GetCell(j)).Replace("'", "''"));

                            }

                            builder.Length = builder.Length - 1;

                            builder.Append(");");

                        }

                        if ((i % 50 == 0 || i == rowCount) && builder.Length > 0)

                        {

                            //每50条记录一次批量插入到数据库

                            rowAffected += dbAction(builder.ToString());

                            builder.Length = 0;

                        }

                    }

                }

            }

        }

        return rowAffected;

    }

}

NPOI相关资料的更多相关文章

  1. 全文检索解决方案(lucene工具类以及sphinx相关资料)

    介绍两种全文检索的技术. 1.  lucene+ 中文分词(IK) 关于lucene的原理,在这里可以得到很好的学习. http://www.blogjava.net/zhyiwww/archive/ ...

  2. React Test相关资料

    karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...

  3. iOS10以及xCode8相关资料收集

    兼容iOS 10 资料整理笔记 源文:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不 ...

  4. Nao 类人机器人 相关资料

    Nao 类人机器人 相关资料: 1.兄妹 PEPPER :在山东烟台生产,http://www.robot-china.com/news/201510/30/26564.html 2.国内机器人领先公 ...

  5. GBrowse配置相关资料

    GBrowse配置相关资料(形状.颜色.配置.gff3) http://gmod.org/wiki/Glyphs_and_Glyph_Optionshttp://gmod.org/wiki/GBrow ...

  6. AssetBundle机制相关资料收集

    原地址:http://www.cnblogs.com/realtimepixels/p/3652075.html AssetBundle机制相关资料收集 最近网友通过网站搜索Unity3D在手机及其他 ...

  7. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  8. smb相关资料

    smb相关资料 看资料就上维基 https://en.wikipedia.org/wiki/Server_Message_Block#Implementation http://www.bing.co ...

  9. Linux命令学习总结之rmdir命令的相关资料可以参考下

    这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...

随机推荐

  1. Vulhub-DC-3靶场

    Vulhub-DC-3靶场 前言 今天把DC-3的靶场打了一遍,可以说这个靶场用到的思路是非常经典的,从信息搜集到漏洞利用包括内核提权.最最重要的是为了下载它的提权EXP,我它喵还花了一块二买了个CS ...

  2. 谷歌内部流出Jetpack Compose最全上手指南,含项目实战演练!

    简介 Jetpack Compose是在2019Google i/O大会上发布的新的库.Compose库是用响应式编程的方式对View进行构建,可以用更少更直观的代码,更强大的功能,能提高开发速度. ...

  3. Java-SpringBoot注解方式实现AOP

    AOP基本总结 连接点(JoinPoint): 连接点是程序运行的某个阶段点,如方法调用.异常抛出等 切入点(Pointcut): 切入点是JoinPoint的集合 是程序中需要注入Advice的位置 ...

  4. Linux文件系统只读 解决方案:

    Linux系统Read-only file system,文件系统只读排查解决方案:文件系统只读机制:当文件系统自身的校验机制发现文件系统存在问题时,为避免文件系统受到进一步的损坏,系统会把文件系统设 ...

  5. 003 TCP/IP协议详解(二)

    一.ping ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障. 例如:当我们某一 ...

  6. 题解 Merchant

    传送门 可以发现如果我们最终选择的物品集合已经确定,就很好求了 \(\sum k*t+\sum b \geqslant s\) ,二分即可 但现在我们无法确定该选哪些物品 因此我们只需要check一下 ...

  7. RHEL 7 “There are no enabled repos” 的解决方法

    RHEL 7 "There are no enabled repos"  的解决方法 [root@system1 Desktop]# yum install squidLoaded ...

  8. 【springcloud】模拟RPC调用(Feign)

    转自:https://blog.csdn.net/pengjunlee/article/details/86615408 Feign简介 Feign是一个声明式的Web Service客户端,它能够让 ...

  9. windows通过pfx文件生成key、crt文件

    nginx代理的时候,需要填写证书的crt跟rsa文件路径,通过iis导出的证书是pfx文件(不知道nginx能不能直接用pfx文件,没有查看过相关资料),所以要通过pfx文件生成crt.rsa文件. ...

  10. ArrayPool 源码解读之 byte[] 也能池化?

    一:背景 1. 讲故事 最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数 ...