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. Python -类型提示 Type Hints

    为什么会有类型提示 Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,运行时不需要指定变量类型 但是与此同时 IDE 无法像静态类型语言那样分析代码,及时给我们相应的提示,比如字符 ...

  2. 【笔记】jupyter notebook基础使用

    jupyter notebook基础使用 执行代码 添加格子 在输出结果的同时添加一行 run cells and insert below 输出结果,若后续没有新的代码行了,则会在后面添加一行 查看 ...

  3. 从零开始实现简单 RPC 框架 3:配置总线 URL

    URL 的定义 URL 对于大部分程序猿来说都是很熟悉的,其全称是 Uniform Resource Locator (统一资源定位器).它是互联网的统一资源定位标志,也就是指网络地址. 一个标准的 ...

  4. noip模拟8

    T1 星际旅行 题目描述 一个图存在欧拉路的条件是有\(2/0\)个点有奇数个出度,把一条无向边拆成两条,所以可以选择拆两个自环.一个自环一条边.连接同一个点的边. 先判断图是否是边联通,不联通则输出 ...

  5. 【设计模式】装饰者模式(DecoratorMode0

    From: https://liudongdong1.github.io/ 装饰者模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,增加对象功能来说,装饰模式比生成子类实 ...

  6. node 报错 throw er; // Unhandled 'error' event 解决办法

    node 报错 Starting child process with 'node web.js' events.js:183 throw er; // Unhandled 'error' event ...

  7. Win10下安装SVN出现2503/2502解决方法

    出现错误的原因是权限不够 在win10的开始按钮上,右键点击,选择"命令提示符(管理员)(A)",弹出管理员身份运行模式的命令行的窗口,输入如下的命令: msiexec /pack ...

  8. tcp为什么要三次握手,tcp为什么可靠

    转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...

  9. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  10. 让div占据父元素剩下的所有位置

    场景模拟: 现在有一个父容器,里面有俩个div,左边的要给一个固定的200px的宽度,父容器剩下的宽度都归右边的div该怎么完成?HTML代码: <div class="wrap&qu ...