使用NPOI将DataTable导入到Excel中

应该有很多同学需要将DataTable中的数据生成为Excel保存起来,虽然有很多例子,但为最近自己刚做了这一块,在博客做下记录。


Excel一般有两种格式:xls与xlsx,在NPOI中,也分别有这两种写法,现在以NPOI 2.2.0、针对.NET 4.0的版本为例。


1.首先将下载好的NPOI的.NET 4.0的dll都添加到引用里


2.为了兼容xls与xlsx,除了必要的.Net程序引用集需要引用一下NPOI的这些引用集

using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;

3.直接上生成的方法

	/// 
        /// 生成Excel
        /// 
        /// 文件存储路径
        /// 文件名
        /// 文件类型
        /// 需要导入的DataTable
        /// 
        public bool SaveXLS(String filePath,string filename,string filetype, DataTable dt)
        {
            try
            {
                if (filetype.ToLower() == ".xls")
                {
                    if (!Directory.Exists(filePath))
                    {
                        Directory.CreateDirectory(filePath);
                    }
                    int count = 0;
                    HSSFWorkbook wb = new HSSFWorkbook();
		    ISheet sh = wb.CreateSheet("TABLENAME");
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        HSSFRow row = (HSSFRow)sh.CreateRow(0);
                        for (int j = 0; j < dt.Columns.Count; ++j)
                        {
                            row.CreateCell(j).SetCellValue(dt.Columns[j].ColumnName);
                        }
                        count = 1;
                    }

                    for (int i = 0; i < dt.Rows.Count; ++i)
                    {
                        HSSFRow row = (HSSFRow)sh.CreateRow(count);
                        for (int j = 0; j < dt.Columns.Count; ++j)
                        {
                            row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
                        }
                        ++count;
                    }

                    using (FileStream stm = File.OpenWrite(filePath + filename))
                    {
                        wb.Write(stm);
                    }
                    return true;
                }
                if (filetype.ToLower() == ".xlsx")
                {
                    if (!Directory.Exists(filePath))
                    {
                        Directory.CreateDirectory(filePath);
                    }
                    int count = 0;
                    XSSFWorkbook wb = new XSSFWorkbook();
                    ISheet sh = wb.CreateSheet("TABLENAME");
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        XSSFRow row = (XSSFRow)sh.CreateRow(0);
                        for (int j = 0; j < dt.Columns.Count; ++j)
                        {
                            row.CreateCell(j).SetCellValue(dt.Columns[j].ColumnName);
                        }
                        count = 1;
                    }

                    for (int i = 0; i < dt.Rows.Count; ++i)
                    {
                        XSSFRow row = (XSSFRow)sh.CreateRow(count);
                        for (int j = 0; j < dt.Columns.Count; ++j)
                        {
                            row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
                        }
                        ++count;
                    }

                    using (FileStream stm = File.OpenWrite(filePath + filename))
                    {
                        wb.Write(stm);
                    }
                    return true;
                }
            }
            catch (Exception ex)
            {
                string path = System.Environment.CurrentDirectory + "\\" + System.DateTime.Now.ToString("yyyyMMdd") + "_ABOS.log";
                SaveLog(path,System.DateTime.Now.ToString() + " --> 失败:"+ex.ToString());
                return false;
            }
        }

4.在上面方法中,SaveLog是我保存Log记录的方法,可以删除掉,这样就能生成简单的Excel,如果需要添加格式,比如单元格居中、背景色等,那就需要使用NPOI中的另外的方法了。


注:生成的Excel如果打开时经常报错“内容不可读”之类的,基本是因为你生成好之后又用代码做了其他操作而忘记了Dispose(),导致第二次生成时,文件内容有损坏。



你可能感兴趣的:(c#,npoi,.net)