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. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

  2. 走心的中级Android工程师跳槽经验分享

    这些经验是我最近四个月,从准备面试到找到合适工作的汗水和泪水,希望对你们能有帮助! define 跳槽 跳槽前要思考的问题 钱不到位怎么办 心委屈怎么办 离职前的思考 确定要走时需要做的准备 行情怎么 ...

  3. Google Breakpad · 基础介绍

    Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合. 三个主要组件 ◆ client 以library的形式内置在你的应用中,当崩溃发生时写 minidump文件 ◆ symbo ...

  4. 适配Android4.4~Android11,调用系统相机,系统相册,系统图片裁剪,转换文件(对图片进行上传等操作)

    前言 最近Android对于文件的许多方法进行了修改,网络上又没有对Android4到Android11关于系统相机.系统相册和系统裁剪的适配方案,我花了几天事件总结了一下,先上源码 DEMO源码 先 ...

  5. 开源中国【面经】Java后台开发

    2021.04.09 直接正文: 开场自我介绍,说一下自己 有没有实习经历?(毕业实习) 毕业实习学了什么?(前端) 有什么大项目吗?(除了课设就是毕设) 能说一下毕设的情况吗?(做了大概,没有开始登 ...

  6. 【AI】PytorchSegmentCode

    From: https://liudongdong1.github.io/ 0. 基础配置 0.1. 设置随机种子 def set_seeds(seed, cuda): ""&qu ...

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

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

  8. C语言 Ubuntu系统 UTF-8 文字处理

    关于UTF-8的规则:https://baike.baidu.com/item/UTF-8/481798?fr=aladdin 使用windows系统下的Ubuntu子系统,实现C语言对UTF-8编码 ...

  9. 关于Ubuntu18.04 linux系统使用搜狗输入法 出现乱码

    解决: 执行下面的命令即可!无需重启系统 killall fcitx

  10. java多线程的一些面试题

    8.callable与fature Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型. Fature保存异步计算的结果.9.执行器 Executor.10. ...