zoukankan      html  css  js  c++  java
  • NPOI简述与运用

    最近想把项目中Excel中的操作部分改成NPOI ,由于2.0版本已经支持office07/10格式,但还处于测试版不稳定,于是封装如下代码

    • 1.支持1.25版本
    • 2.支持B/S与C/S导入导出
    • 3.知道Excel数据导入数据库

       需要合并单元格等需求的功能没有 自己添加吧!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.IO;
    using System.Text;
    using NPOI.HSSF.UserModel;
    using NPOI.HPSF;
    using NPOI.SS.UserModel;
    using System.Data.SqlClient;
    /*
     Vesion: 适用于 NPOI 1.25版本
     Author: Irving
     Description: Execl操作
     Date:2012年6月25日16:17:06
     UpdateDate:2012年9月26日13:03:31 修正日期与导入数据库中的性能
     * 
     * 
     * 
     *          //必须与数据源中的列一致
                Dictionary<string, string> dtDictText = new Dictionary<string, string>();
                dtDictText.Add("ProductID", "唯一号");
                dtDictText.Add("ProductNo", "编号");
                dtDictText.Add("ProductName", "姓名");
                dtDictText.Add("Price", "价格");
                dtDictText.Add("Memo", "备注");
    
                NPOIHelper.ExportByWeb(dtDictText, "sheet1", "测试啦", HttpContext.Current, BLL.ProductBLL.LoadDataByDataSet());
                NPOIHelper.ExportByWin(dtDictText, "sheet1", "测试啦", AppDomain.CurrentDomain.BaseDirectory, BLL.ProductBLL.LoadDataByDataSet());
     *          NPOIHelper.Import(Server.MapPath("/Files/" + "测试啦.xls"));
     * 
     * 
     * 
     */
    namespace Common
    {
        public class NPOIHelper
        {
            /// <summary>
            /// 读取Excel
            /// </summary>
            /// <param name="filePath">文件路径</param>
            /// <param name="sheetNo">Sheet编号(默认为0,即sheet1,可选参数)</param>
            /// <returns></returns>
            public static DataTable Import(string filePath, params int[] sheetNo)
            {
                int sheetNO;
                if (sheetNo.Length != 0)
                    sheetNO = sheetNo[0];
                else
                    sheetNO = 0;
                DataTable dt = new DataTable();
                HSSFWorkbook hssfworkbook;
                using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    hssfworkbook = new HSSFWorkbook(file);
                }
                HSSFSheet sheet = hssfworkbook.GetSheetAt(sheetNO) as HSSFSheet;
                System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
                HSSFRow headerRow = sheet.GetRow(0) as HSSFRow;
                int cellCount = headerRow.LastCellNum;
                for (int j = 0; j < cellCount; j++)
                {
                    HSSFCell cell = headerRow.GetCell(j) as HSSFCell;
                    dt.Columns.Add(cell.ToString());
                }
                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    HSSFRow row = sheet.GetRow(i) as HSSFRow;
                    DataRow dataRow = dt.NewRow();
    
                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        if (row.GetCell(j) != null)
                        {
                            if (row.GetCell(j).CellType.ToString() != "NUMERIC")//处理时间格式化问题
                            {
                                dataRow[j] = row.GetCell(j).ToString();
                            }
                            else
                            {
                                dataRow[j] = row.GetCell(j).DateCellValue.Date.ToString();
                            }
                        }
                    }
    
                    dt.Rows.Add(dataRow);
                }
                return dt;
            }
    
            /// <summary>
            /// 导出Excel数据(Win)
            /// </summary>
            /// <param name="dtDictHeadText">表头数据(字段必须与数据源一致)</param>
            /// <param name="sheetName">纸张名</param>
            /// <param name="fileName">文件名称</param>
            /// <param name="filePath">路径</param>
            /// <param name="dtSource">数据源</param>
            public static void ExportByWin(Dictionary<string, string> dtDictHeadText, string sheetName, string fileName, string filePath, DataTable dtSource)
            {
                HSSFWorkbook hssfworkbook = Export(dtDictHeadText, sheetName, fileName, dtSource);
                try
                {
                    using (Stream stream = File.Create(String.Format("{0}{1}.xls", filePath, fileName)))
                    {
                        hssfworkbook.Write(stream);
                        stream.Flush();
                    }
                }
                catch (Exception ex)
                {
                    //Log4记录
                    throw new Exception("操作失败: " + ex.Message);
                }
            }
            /// <summary>
            /// 导出Excel数据(Web)
            /// </summary>
            /// <param name="dtDictHeadText">表头数据(字段必须与数据源一致)</param>
            /// <param name="sheetName">纸张名</param>
            /// <param name="fileName">文件名</param>
            /// <param name="context">上下文对象</param>
            /// <param name="dtSource">数据源</param>
            public static void ExportByWeb(Dictionary<string, string> dtDictHeadText, string sheetName, string fileName, HttpContext context, DataTable dtSource)
            {
                HSSFWorkbook hssfworkbook = Export(dtDictHeadText, sheetName, fileName, dtSource);
                try
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        hssfworkbook.Write(ms);
                        ms.Flush();
                        ms.Position = 0;
                        context.Response.ContentType = "application/vnd.ms-excel";
                        context.Response.ContentEncoding = Encoding.UTF8;
                        context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName + ".xls", Encoding.UTF8));
                        context.Response.BinaryWrite(ms.ToArray());
                    }
                }
                catch (Exception ex)
                {
                    //Log4记录
                    throw new Exception("操作失败: " + ex.Message);
                }
            }
    
            /// <summary>
            /// 读取Execl数据到数据库中
            /// </summary>
            /// <param name="conText">连接字符串</param>
            /// <param name="tabeName">表名</param>
            /// <param name="ipDict">字典(SourceColumn(数据源列名称)  DestinationColumn(目标列名称))</param>
            /// <param name="filePath">路径(只支持xls格式)</param>
            /// <param name="sheetNo">纸张页</param>
            public static void ImportExcelDBSourceIntoTable(string conText, string tabeName, Dictionary<string, string> ipDict, string filePath, params int[] sheetNo)
            {
                int sheetNO;
                if (sheetNo.Length != 0)
                    sheetNO = sheetNo[0];
                else
                    sheetNO = 0;
                using (SqlConnection conn = new SqlConnection(conText))
                {
                    conn.Open();
                    SqlTransaction tran = conn.BeginTransaction();
                    DataTable dt = NPOIHSSFHelper.Import(filePath, sheetNO);
                    SqlBulkCopy blkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran) { BatchSize = dt.Rows.Count, DestinationTableName = tabeName };
                    foreach (KeyValuePair<string, string> item in ipDict)
                    {
                        blkCopy.ColumnMappings.Add(item.Key, item.Value).ToString().Trim();
                    }
                    try
                    {
                        blkCopy.WriteToServer(dt);
                        tran.Commit();
                        conn.Close();
                        blkCopy.Close();
                    }
                    catch (Exception ex)
                    {   //Log4
                        tran.Rollback();
                        conn.Close();
                        blkCopy.Close();
                        throw new Exception(ex.Message);
                    }
                }
            }
            #region  操作
            /// <summary>
            /// 填充数据
            /// </summary>
            /// <param name="dtDictHeadText">表头字典</param>
            /// <param name="sheetName">名称</param>
            /// <param name="fileName">文件名称</param>
            /// <param name="dtSource">数据源</param>
            /// <returns></returns>
            private static HSSFWorkbook Export(Dictionary<string, string> dtDictHeadText, string sheetName, string fileName, DataTable dtSource)
            {
                HSSFWorkbook hssfworkbook = new HSSFWorkbook();
                SetSummaryData(hssfworkbook, fileName);                       //版权信息
                ISheet sheet = hssfworkbook.CreateSheet(sheetName);
                SetHeadData(dtSource, dtDictHeadText, hssfworkbook, sheet);   //创建表头
                int rowIndex = 1;
                foreach (DataRow row in dtSource.Rows)
                {
                    HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
                    SetContentData(dtSource, dtDictHeadText, row, dataRow, hssfworkbook);//填充数据集
                    rowIndex++;
                }
                return hssfworkbook;
            }
            /// <summary>
            /// 属性信息
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="fileName"></param>
            private static void SetSummaryData(HSSFWorkbook workbook, string fileName)
            {
                DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
                dsi.Company = "NPOI";
                workbook.DocumentSummaryInformation = dsi;
                SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
                si.Author = "Irving"; //填加xls文件作者信息
                si.Title = fileName; //填加xls文件标题信息
                si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
                si.Comments = "作者信息"; //填加xls文件作者信息
                si.Subject = "主题信息";//填加文件主题信息
                si.CreateDateTime = DateTime.Now;
                workbook.SummaryInformation = si;
            }
            /// <summary>
            /// 填充表头数据
            /// </summary>
            /// <param name="dtSource"></param>
            /// <param name="dtDictHeadText"></param>
            /// <param name="workbook"></param>
            /// <param name="sheet"></param>
            private static void SetHeadData(DataTable dtSource, Dictionary<string, string> dtDictHeadText, HSSFWorkbook workbook, ISheet sheet)
            {
                HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
                int index = 0;
                foreach (KeyValuePair<string, string> item in dtDictHeadText)
                {
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        if (column.ColumnName.Contains(item.Key))
                        {
                            headerRow.CreateCell(index).SetCellValue(item.Value);
                            index++;
                            break;
                        }
                    }
                }
            }
            /// <summary>
            /// 填充表数据
            /// </summary>
            /// <param name="dtSource"></param>
            /// <param name="dtDictHeadText"></param>
            /// <param name="row"></param>
            /// <param name="dataRow"></param>
            /// <param name="workbook"></param>
            private static void SetContentData(DataTable dtSource, Dictionary<string, string> dtDictHeadText, DataRow row, HSSFRow dataRow, HSSFWorkbook workbook)
            {
                int index = 0;
                foreach (KeyValuePair<string, string> item in dtDictHeadText)
                {
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        if (item.Key.ToLower() == column.ColumnName.ToLower())
                        {
                            HSSFCell newCell = dataRow.CreateCell(index) as HSSFCell;
                            string drValue = row[column].ToString();
    
                            switch (column.DataType.ToString())
                            {
                                case "System.String"://字符串类型
                                    newCell.SetCellValue(drValue);
                                    break;
                                case "System.DateTime"://日期类型
                                    DateTime dateV;
                                    DateTime.TryParse(drValue, out dateV);
                                    if (drValue.Contains("上午 12:00:00"))
                                    {
                                        drValue = dateV.ToString("yyyy/MM/dd");
                                    }
                                    else
                                    {
                                        if (!string.IsNullOrEmpty(drValue))
                                        {
                                            drValue = dateV.ToString();
                                        }
                                    }
                                    newCell.SetCellValue(drValue);
                                    break;
                                case "System.Boolean"://布尔型
                                    bool boolV = false;
                                    bool.TryParse(drValue, out boolV);
                                    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.SetCellValue(intV);
                                    break;
                                case "System.Decimal"://浮点型
                                case "System.Double":
                                    double doubV = 0;
                                    double.TryParse(drValue, out doubV);
                                    newCell.SetCellValue(doubV);
                                    break;
                                case "System.Guid"://GUID
                                    Guid guid = Guid.Empty;
                                    Guid.TryParse(drValue, out guid);
                                    newCell.SetCellValue(guid.ToString());
                                    break;
                                case "System.DBNull"://空值处理
                                    newCell.SetCellValue("");
                                    break;
                                default:
                                    newCell.SetCellValue("");
                                    break;
                            }
                            index++;
                            break;
                        }
                    }
                }
            }
            #endregion
        }
    }
  • 相关阅读:
    数据结构之线段树
    数据结构之线段树
    数据结构之树状数组
    codevs1073 家族
    codevs1069 关押罪犯
    codevs1001 舒适的路线
    codevs1282 约瑟夫问题
    codevs1081 线段树练习 2
    codevs1225 八数码难题
    codevs1080 线段树练习
  • 原文地址:https://www.cnblogs.com/Irving/p/2752061.html
Copyright © 2011-2022 走看看