zoukankan      html  css  js  c++  java
  • NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    原文地址:http://www.3fwork.com/b103/000335MYM028130/

    由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案。

    注意:若直接使用在WinForm项目中,必需先下载并在项目中引用NPOI2.0或以上版本的组件才可以正常使用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Data;
    using System.Windows.Forms;
    using NPOI.SS.UserModel;
    using NPOI.HSSF.UserModel;
    using NPOI.XSSF.UserModel;
    using Zwj.TEMS.Common;
    
    namespace TEMS.Service
    {
        public static class ExcelHelperForCs
        {
            #region 私有方法
    
            /// <summary>
            /// 获取要保存的文件名称(含完整路径)
            /// </summary>
            /// <returns></returns>
            private static string GetSaveFilePath()
            {
                SaveFileDialog saveFileDig = new SaveFileDialog();
                saveFileDig.Filter = "Excel Office97-2003(*.xls)|.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";
                saveFileDig.FilterIndex = 0;
                saveFileDig.OverwritePrompt = true;
                saveFileDig.InitialDirectory = Common.DesktopDirectory;
                string filePath = null;
                if (saveFileDig.ShowDialog() == DialogResult.OK)
                {
                    filePath = saveFileDig.FileName;
                }
    
                return filePath;
            }
    
            /// <summary>
            /// 判断是否为兼容模式
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            private static bool GetIsCompatible(string filePath)
            {
                return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);
            }
    
    
    
            /// <summary>
            /// 创建工作薄
            /// </summary>
            /// <param name="isCompatible"></param>
            /// <returns></returns>
            private static IWorkbook CreateWorkbook(bool isCompatible)
            {
                if (isCompatible)
                {
                    return new HSSFWorkbook();
                }
                else
                {
                    return new XSSFWorkbook();
                }
            }
    
            /// <summary>
            /// 创建工作薄(依据文件流)
            /// </summary>
            /// <param name="isCompatible"></param>
            /// <param name="stream"></param>
            /// <returns></returns>
            private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream)
            {
                if (isCompatible)
                {
                    return new HSSFWorkbook(stream);
                }
                else
                {
                    return new XSSFWorkbook(stream);
                }
            }
    
            /// <summary>
            /// 创建表格头单元格
            /// </summary>
            /// <param name="sheet"></param>
            /// <returns></returns>
            private static ICellStyle GetCellStyle(IWorkbook workbook)
            {
                ICellStyle style = workbook.CreateCellStyle();
                style.FillPattern = FillPattern.SolidForeground;
                style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
    
                return style;
            }
    
    
            /// <summary>
            /// 从工作表中生成DataTable
            /// </summary>
            /// <param name="sheet"></param>
            /// <param name="headerRowIndex"></param>
            /// <returns></returns>
            private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex)
            {
                DataTable table = new DataTable();
    
                IRow headerRow = sheet.GetRow(headerRowIndex);
                int cellCount = headerRow.LastCellNum;
    
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
                    {
                        // 如果遇到第一个空列,则不再继续向后读取
                        cellCount = i + 1;
                        break;
                    }
                    DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                    table.Columns.Add(column);
                }
    
                for (int i = (headerRowIndex + 1); i <= sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i);
    
                    if (row != null && !string.IsNullOrEmpty(row.Cells[0].StringCellValue))
                    {
                        DataRow dataRow = table.NewRow();
    
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            if (row.GetCell(j) != null)
                            {
                                dataRow[j] = row.GetCell(j).ToString();
                            }
                        }
    
                        table.Rows.Add(dataRow);
                    }
                }
    
                return table;
            }
    
            #endregion
    
            #region 公共导出方法
    
            /// <summary>
            /// 由DataSet导出Excel
            /// </summary>
            /// <param name="sourceTable">要导出数据的DataTable</param>
            /// <returns>Excel工作表</returns>
            public static string ExportToExcel(DataSet sourceDs, string filePath = null)
            {
    
                if (string.IsNullOrEmpty(filePath))
                {
                    filePath = GetSaveFilePath();
                }
    
                if (string.IsNullOrEmpty(filePath)) return null;
    
                bool isCompatible = GetIsCompatible(filePath);
    
                IWorkbook workbook = CreateWorkbook(isCompatible);
                ICellStyle cellStyle = GetCellStyle(workbook);
    
                for (int i = 0; i < sourceDs.Tables.Count; i++)
                {
                    DataTable table = sourceDs.Tables[i];
                    string sheetName = "result" + i.ToString();
                    ISheet sheet = workbook.CreateSheet(sheetName);
                    IRow headerRow = sheet.CreateRow(0);
                    // handling header.
                    foreach (DataColumn column in table.Columns)
                    {
                        ICell cell = headerRow.CreateCell(column.Ordinal);
                        cell.SetCellValue(column.ColumnName);
                        cell.CellStyle = cellStyle;
                    }
    
                    // 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++;
                    }
                }
    
                FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                workbook.Write(fs);
                fs.Dispose();
                workbook = null;
    
                return filePath;
    
            }
    
    
            /// <summary>
            /// 由DataTable导出Excel
            /// </summary>
            /// <param name="sourceTable">要导出数据的DataTable</param>
            /// <returns>Excel工作表</returns>
            public static string ExportToExcel(DataTable sourceTable, string sheetName = "result", string filePath = null)
            {
                if (sourceTable.Rows.Count <= 0) return null;
    
                if (string.IsNullOrEmpty(filePath))
                {
                    filePath = GetSaveFilePath();
                }
    
                if (string.IsNullOrEmpty(filePath)) return null;
    
                bool isCompatible = GetIsCompatible(filePath);
    
                IWorkbook workbook = CreateWorkbook(isCompatible);
                ICellStyle cellStyle = GetCellStyle(workbook);
    
                ISheet sheet = workbook.CreateSheet(sheetName);
                IRow headerRow = sheet.CreateRow(0);
                // handling header.
                foreach (DataColumn column in sourceTable.Columns)
                {
                    ICell headerCell = headerRow.CreateCell(column.Ordinal);
                    headerCell.SetCellValue(column.ColumnName);
                    headerCell.CellStyle = cellStyle;
                }
    
                // handling value.
                int rowIndex = 1;
    
                foreach (DataRow row in sourceTable.Rows)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);
    
                    foreach (DataColumn column in sourceTable.Columns)
                    {
                        dataRow.CreateCell(column.Ordinal).SetCellValue((row[column]??"").ToString());
                    }
    
                    rowIndex++;
                }
                FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                workbook.Write(fs);
                fs.Dispose();
    
                sheet = null;
                headerRow = null;
                workbook = null;
    
                return filePath;
            }
    
            /// <summary>
            /// 由List导出Excel
            /// </summary>
            /// <typeparam name="T">类型</typeparam>
            /// <param name="data">在导出的List</param>
            /// <param name="sheetName">sheet名称</param>
            /// <returns></returns>
            public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, string sheetName = "result", string filePath = null) where T : class
            {
                if (data.Count <= 0) return null;
    
                if (string.IsNullOrEmpty(filePath))
                {
                    filePath = GetSaveFilePath();
                }
    
                if (string.IsNullOrEmpty(filePath)) return null;
    
                bool isCompatible = GetIsCompatible(filePath);
    
                IWorkbook workbook = CreateWorkbook(isCompatible);
                ICellStyle cellStyle = GetCellStyle(workbook);
                ISheet sheet = workbook.CreateSheet(sheetName);
                IRow headerRow = sheet.CreateRow(0);
    
                for (int i = 0; i < headerNameList.Count; i++)
                {
                    ICell cell = headerRow.CreateCell(i);
                    cell.SetCellValue(headerNameList[i].Value);
                    cell.CellStyle = cellStyle;
                }
    
                Type t = typeof(T);
                int rowIndex = 1;
                foreach (T item in data)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);
                    for (int n = 0; n < headerNameList.Count; n++)
                    {
                        object pValue = t.GetProperty(headerNameList[n].Key).GetValue(item, null);
                        dataRow.CreateCell(n).SetCellValue((pValue ?? "").ToString());
                    }
                    rowIndex++;
                }
                FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                workbook.Write(fs);
                fs.Dispose();
    
                sheet = null;
                headerRow = null;
                workbook = null;
    
                return filePath;
            }
    
            /// <summary>
            /// 由DataGridView导出
            /// </summary>
            /// <param name="grid"></param>
            /// <param name="sheetName"></param>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static string ExportToExcel(DataGridView grid, string sheetName = "result", string filePath = null)
            {
                if (grid.Rows.Count <= 0) return null;
    
                if (string.IsNullOrEmpty(filePath))
                {
                    filePath = GetSaveFilePath();
                }
    
                if (string.IsNullOrEmpty(filePath)) return null;
    
                bool isCompatible = GetIsCompatible(filePath);
    
                IWorkbook workbook = CreateWorkbook(isCompatible);
                ICellStyle cellStyle = GetCellStyle(workbook);
                ISheet sheet = workbook.CreateSheet(sheetName);
    
                IRow headerRow = sheet.CreateRow(0);
    
                for (int i = 0; i < grid.Columns.Count; i++)
                {
                    ICell cell = headerRow.CreateCell(i);
                    cell.SetCellValue(grid.Columns[i].Name);
                    cell.CellStyle = cellStyle;
                }
    
                int rowIndex = 1;
                foreach (DataGridViewRow row in grid.Rows)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);
                    for (int n = 0; n < grid.Columns.Count; n++)
                    {
                        dataRow.CreateCell(n).SetCellValue((row.Cells[n].Value ?? "").ToString());
                    }
                    rowIndex++;
                }
    
                FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                workbook.Write(fs);
                fs.Dispose();
    
                sheet = null;
                headerRow = null;
                workbook = null;
    
                return filePath;
            }
    
            #endregion
    
            #region 公共导入方法
    
            /// <summary>
            /// 由Excel导入DataTable
            /// </summary>
            /// <param name="excelFileStream">Excel文件流</param>
            /// <param name="sheetName">Excel工作表名称</param>
            /// <param name="headerRowIndex">Excel表头行索引</param>
            /// <param name="isCompatible">是否为兼容模式</param>
            /// <returns>DataTable</returns>
            public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible)
            {
                IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
                ISheet sheet = null;
                int sheetIndex = -1;
                if (int.TryParse(sheetName, out sheetIndex))
                {
                    sheet = workbook.GetSheetAt(sheetIndex);
                }
                else
                {
                    sheet = workbook.GetSheet(sheetName);
                }
    
                DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
    
                excelFileStream.Close();
                workbook = null;
                sheet = null;
                return table;
            }
    
            /// <summary>
            /// 由Excel导入DataTable
            /// </summary>
            /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
            /// <param name="sheetName">Excel工作表名称</param>
            /// <param name="headerRowIndex">Excel表头行索引</param>
            /// <returns>DataTable</returns>
            public static DataTable ImportFromExcel(string excelFilePath, string sheetName, int headerRowIndex)
            {
                using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
                {
                    bool isCompatible = GetIsCompatible(excelFilePath);
                    return ImportFromExcel(stream, sheetName, headerRowIndex, isCompatible);
                }
            }
    
            /// <summary>
            /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
            /// </summary>
            /// <param name="excelFileStream">Excel文件流</param>
            /// <param name="headerRowIndex">Excel表头行索引</param>
            /// <param name="isCompatible">是否为兼容模式</param>
            /// <returns>DataSet</returns>
            public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible)
            {
                DataSet ds = new DataSet();
                IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
                for (int i = 0; i < workbook.NumberOfSheets; i++)
                {
                    ISheet sheet = workbook.GetSheetAt(i);
                    DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
                    ds.Tables.Add(table);
                }
    
                excelFileStream.Close();
                workbook = null;
    
                return ds;
            }
    
            /// <summary>
            /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
            /// </summary>
            /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
            /// <param name="headerRowIndex">Excel表头行索引</param>
            /// <returns>DataSet</returns>
            public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex)
            {
                using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
                {
                    bool isCompatible = GetIsCompatible(excelFilePath);
                    return ImportFromExcel(stream, headerRowIndex, isCompatible);
                }
            }
    
            #endregion
    
            #region 公共转换方法
    
            /// <summary>
            /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
            /// </summary>
            /// <param name="index">列索引</param>
            /// <returns>列名,如第0列为A,第1列为B...</returns>
            public static string ConvertColumnIndexToColumnName(int index)
            {
                index = index + 1;
                int system = 26;
                char[] digArray = new char[100];
                int i = 0;
                while (index > 0)
                {
                    int mod = index % system;
                    if (mod == 0) mod = system;
                    digArray[i++] = (char)(mod - 1 + 'A');
                    index = (index - 1) / 26;
                }
                StringBuilder sb = new StringBuilder(i);
                for (int j = i - 1; j >= 0; j--)
                {
                    sb.Append(digArray[j]);
                }
                return sb.ToString();
            }
    
    
            /// <summary>
            /// 转化日期
            /// </summary>
            /// <param name="date">日期</param>
            /// <returns></returns>
            public static DateTime ConvertDate(object date)
            {
                string dtStr = (date ?? "").ToString();
    
                DateTime dt = new DateTime();
    
                if (DateTime.TryParse(dtStr, out dt))
                {
                    return dt;
                }
    
                try
                {
                    string spStr = "";
                    if (dtStr.Contains("-"))
                    {
                        spStr = "-";
                    }
                    else if (dtStr.Contains("/"))
                    {
                        spStr = "/";
                    }
                    string[] time = dtStr.Split(spStr.ToCharArray());
                    int year = Convert.ToInt32(time[2]);
                    int month = Convert.ToInt32(time[0]);
                    int day = Convert.ToInt32(time[1]);
                    string years = Convert.ToString(year);
                    string months = Convert.ToString(month);
                    string days = Convert.ToString(day);
                    if (months.Length == 4)
                    {
                        dt = Convert.ToDateTime(date);
                    }
                    else
                    {
                        string rq = "";
                        if (years.Length == 1)
                        {
                            years = "0" + years;
                        }
                        if (months.Length == 1)
                        {
                            months = "0" + months;
                        }
                        if (days.Length == 1)
                        {
                            days = "0" + days;
                        }
                        rq = "20" + years + "-" + months + "-" + days;
                        dt = Convert.ToDateTime(rq);
                    }
                }
                catch
                {
                    throw new Exception("日期格式不正确,转换日期失败!");
                }
                return dt;
            }
    
            /// <summary>
            /// 转化数字
            /// </summary>
            /// <param name="d">数字字符串</param>
            /// <returns></returns>
            public static decimal ConvertDecimal(object d)
            {
                string dStr = (d ?? "").ToString();
                decimal result = 0;
                if (decimal.TryParse(dStr, out result))
                {
                    return result;
                }
                else
                {
                    throw new Exception("数字格式不正确,转换数字失败!");
                }
    
            }
    
            #endregion
        }
    }
  • 相关阅读:
    zeromq和czmq编译
    Future Pattern
    国外程序员是如何准备面试的
    附加数据库后,给所有者赋权
    利用FastCopy迁移应用数据
    持续集成之“Everything is code”
    利用SQLyog实现mysql自动备份
    LinkedIn已将可自定义的索引引擎IndexTank开源
    Hillstone安全网关相关问题收集
    Install Toad for Oracle 10.6 on Winows 7 X64
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/6634530.html
Copyright © 2011-2022 走看看