zoukankan      html  css  js  c++  java
  • 在C#中使用NPOI2.0操作Excel2003和Excel2007

    Excel2003:

     

        #region Excel2003  
        /// <summary>  
        /// 将Excel文件中的数据读出到DataTable中(xls)  
        /// </summary>  
        /// <param name="file"></param>  
        /// <returns></returns>  
        public static DataTable ExcelToTableForXLS(string file)  
        {  
            DataTable dt = new DataTable();  
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))  
            {  
                XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook(fs);  
                ISheet sheet = hssfworkbook.GetSheetAt(0);  
          
                //表头  
                IRow header = sheet.GetRow(sheet.FirstRowNum);  
                List<int> columns = new List<int>();  
                for (int i = 0; i < header.LastCellNum; i++)  
                {  
                    object obj = GetValueTypeForXLS(header.GetCell(i) as XLS.HSSFCell);  
                    if (obj == null || obj.ToString() == string.Empty)  
                    {  
                        dt.Columns.Add(new DataColumn("Columns" + i.ToString()));  
                        //continue;  
                    }  
                    else  
                        dt.Columns.Add(new DataColumn(obj.ToString()));  
                    columns.Add(i);  
                }  
                //数据  
                for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  
                {  
                    DataRow dr = dt.NewRow();  
                    bool hasValue = false;  
                    foreach (int j in columns)  
                    {  
                        dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as XLS.HSSFCell);  
                        if (dr[j] != null && dr[j].ToString() != string.Empty)  
                        {  
                            hasValue = true;  
                        }  
                    }  
                    if (hasValue)  
                    {  
                        dt.Rows.Add(dr);  
                    }  
                }  
            }  
            return dt;  
        }  
          
        /// <summary>  
        /// 将DataTable数据导出到Excel文件中(xls)  
        /// </summary>  
        /// <param name="dt"></param>  
        /// <param name="file"></param>  
        public static void TableToExcelForXLS(DataTable dt, string file)  
        {  
            XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook();  
            ISheet sheet = hssfworkbook.CreateSheet("Test");  
          
            //表头  
            IRow row = sheet.CreateRow(0);  
            for (int i = 0; i < dt.Columns.Count; i++)  
            {  
                ICell cell = row.CreateCell(i);  
                cell.SetCellValue(dt.Columns[i].ColumnName);  
            }  
          
            //数据  
            for (int i = 0; i < dt.Rows.Count; i++)  
            {  
                IRow row1 = sheet.CreateRow(i + 1);  
                for (int j = 0; j < dt.Columns.Count; j++)  
                {  
                    ICell cell = row1.CreateCell(j);  
                    cell.SetCellValue(dt.Rows[i][j].ToString());  
                }  
            }  
          
            //转为字节数组  
            MemoryStream stream = new MemoryStream();  
            hssfworkbook.Write(stream);  
            var buf = stream.ToArray();  
          
            //保存为Excel文件  
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))  
            {  
                fs.Write(buf, 0, buf.Length);  
                fs.Flush();  
            }  
        }  
          
        /// <summary>  
        /// 获取单元格类型(xls)  
        /// </summary>  
        /// <param name="cell"></param>  
        /// <returns></returns>  
        private static object GetValueTypeForXLS(XLS.HSSFCell cell)  
        {  
            if (cell == null)  
                return null;  
            switch (cell.CellType)  
            {  
                case CellType.BLANK: //BLANK:  
                    return null;  
                case CellType.BOOLEAN: //BOOLEAN:  
                    return cell.BooleanCellValue;  
                case CellType.NUMERIC: //NUMERIC:  
                    return cell.NumericCellValue;  
                case CellType.STRING: //STRING:  
                    return cell.StringCellValue;  
                case CellType.ERROR: //ERROR:  
                    return cell.ErrorCellValue;  
                case CellType.FORMULA: //FORMULA:  
                default:  
                    return "=" + cell.CellFormula;  
            }  
        }  
        #endregion  

     

    Excel2007:

        #region Excel2007  
        /// <summary>  
        /// 将Excel文件中的数据读出到DataTable中(xlsx)  
        /// </summary>  
        /// <param name="file"></param>  
        /// <returns></returns>  
        public static DataTable ExcelToTableForXLSX(string file)  
        {  
            DataTable dt = new DataTable();  
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))  
            {  
                XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);  
                ISheet sheet = xssfworkbook.GetSheetAt(0);  
          
                //表头  
                IRow header = sheet.GetRow(sheet.FirstRowNum);  
                List<int> columns = new List<int>();  
                for (int i = 0; i < header.LastCellNum; i++)  
                {  
                    object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);  
                    if (obj == null || obj.ToString() == string.Empty)  
                    {  
                        dt.Columns.Add(new DataColumn("Columns" + i.ToString()));  
                        //continue;  
                    }  
                    else  
                        dt.Columns.Add(new DataColumn(obj.ToString()));  
                    columns.Add(i);  
                }  
                //数据  
                for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  
                {  
                    DataRow dr = dt.NewRow();  
                    bool hasValue = false;  
                    foreach (int j in columns)  
                    {  
                        dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);  
                        if (dr[j] != null && dr[j].ToString() != string.Empty)  
                        {  
                            hasValue = true;  
                        }  
                    }  
                    if (hasValue)  
                    {  
                        dt.Rows.Add(dr);  
                    }  
                }  
            }  
            return dt;  
        }  
          
        /// <summary>  
        /// 将DataTable数据导出到Excel文件中(xlsx)  
        /// </summary>  
        /// <param name="dt"></param>  
        /// <param name="file"></param>  
        public static void TableToExcelForXLSX(DataTable dt, string file)  
        {  
            XSSFWorkbook xssfworkbook = new XSSFWorkbook();  
            ISheet sheet = xssfworkbook.CreateSheet("Test");  
          
            //表头  
            IRow row = sheet.CreateRow(0);  
            for (int i = 0; i < dt.Columns.Count; i++)  
            {  
                ICell cell = row.CreateCell(i);  
                cell.SetCellValue(dt.Columns[i].ColumnName);  
            }  
          
            //数据  
            for (int i = 0; i < dt.Rows.Count; i++)  
            {  
                IRow row1 = sheet.CreateRow(i + 1);  
                for (int j = 0; j < dt.Columns.Count; j++)  
                {  
                    ICell cell = row1.CreateCell(j);  
                    cell.SetCellValue(dt.Rows[i][j].ToString());  
                }  
            }  
          
            //转为字节数组  
            MemoryStream stream = new MemoryStream();  
            xssfworkbook.Write(stream);  
            var buf = stream.ToArray();  
          
            //保存为Excel文件  
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))  
            {  
                fs.Write(buf, 0, buf.Length);  
                fs.Flush();  
            }  
        }  
          
        /// <summary>  
        /// 获取单元格类型(xlsx)  
        /// </summary>  
        /// <param name="cell"></param>  
        /// <returns></returns>  
        private static object GetValueTypeForXLSX(XSSFCell cell)  
        {  
            if (cell == null)  
                return null;  
            switch (cell.CellType)  
            {  
                case CellType.BLANK: //BLANK:  
                    return null;  
                case CellType.BOOLEAN: //BOOLEAN:  
                    return cell.BooleanCellValue;  
                case CellType.NUMERIC: //NUMERIC:  
                    return cell.NumericCellValue;  
                case CellType.STRING: //STRING:  
                    return cell.StringCellValue;  
                case CellType.ERROR: //ERROR:  
                    return cell.ErrorCellValue;  
                case CellType.FORMULA: //FORMULA:  
                default:  
                    return "=" + cell.CellFormula;  
            }  
        }  

    注意:操作Excel2003与操作Excel2007使用的是不同的命名空间下的内容

    使用NPOI.HSSF.UserModel空间下的HSSFWorkbook操作Excel2003

    使用NPOI.XSSF.UserModel空间下的XSSFWorkbook操作Excel2007

            /// <summary>
            /// 写入到文件  IWorkbook 接口实现
            /// </summary>
            /// <param name="book"></param>
            /// <param name="fileName"></param>
            /// <returns></returns>
            private bool WriteToFile(IWorkbook book, string fileName)
            {
                bool result = true;
                try
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        string filePath = Path.GetDirectoryName(fileName);
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        book.Write(ms);
                        //保存为Excel文件  
                        var buf = ms.ToArray();
                        using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                        {
                            fs.Write(buf, 0, buf.Length);
                            fs.Flush();
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.WriteErrorLog(e.Message, e);
                    result = false;
                }
                finally
                {
                    GC.Collect();
                }
                return result;
            }

     

  • 相关阅读:
    c++经典书籍介绍
    jpeg软解码实现介绍
    视频编解码类型调查——抖音客户端
    微机接口复习
    更改MySQL数据库的密码
    python学习之创建我的第一个Django项目
    关于 V831 linux 调用 gpio 的一些通用操作。
    SpringBoot整合H2内存数据库快速启动测试
    MybatisPlus的各种功能使用笔记综合!
    MybatisPlus的自动填充功能使用!
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/5044408.html
Copyright © 2011-2022 走看看