使用NPOI读取Excel的数据,插入到DataTable中

笔者最近遇到一个项目,需要做一个SSIS Package,修改Excel的列名,并在ssms中创建job自动执行,项目需求比较简单,由于笔者做过的Package比较少,所以经历了一番曲折。

我首先想到的是使用NPOI,在Script task中使用NPOI.dll,但是在使用NPOI时,Script task不能将NPOI自动导入到.net framework,需要执行一个gacutil的脚本,有点麻烦,放弃。

其次,我想到 Microsoft.Office.Interop.Excel.dll ,这个类库是MS提供的用于操作Excel的类库,既然Microsoft.Office.Interop.Excel.dll是微软的东西,肯定是已经集成到.net framework中,免去了导入的麻烦。但是在Script Task中使用Microsoft.Office.Interop.Excel.dll仍然出错,这可能跟Script Task 的内部实现机制有关系,不允许创建Excel的process,放弃。

然后,我使用了Execute Process Task 来引用一个Console Application,在BIDS中调试运行是没有任何问题的,但是在SSMS中排job,job不能正常执行,返回异常,并且不能Kill Excel的Prcess,长久下去,Excel的process会耗尽所有的内存,放弃。

最后,还是决定使用Execute Process Task来引用一个Console Application,使用NPOI来操作Excel,最终解决了问题。

以下示例代码就是使用NPOI的Console Application,是项目的一段测试代码的,主要实现的功能修改Excel的ColumnName,并从Excel的两个sheet中读取数据到DataTable中。

class Program
    {

        static Hashtable ht1 = new Hashtable();
        static Hashtable ht2 = new Hashtable();
        static DataTable dt = new DataTable("dt");
        static string strExcelPath = @"C:\ExcelFile\test.xlsx";
        static void Main(string[] args)
        {
            Console.Write("begin");

            GetDataFromExcel();

            Console.Write("end");
            System.Console.Read();
        }

        static void CreateDataTable()
        {
            dt.Columns.Add("XCode");
            dt.Columns.Add("DescriptionOrg");
            dt.Columns.Add("Country");

            dt.Columns.Add("tx");
            dt.Columns.Add("BG");
            dt.Columns.Add("Cell");
            dt.Columns.Add("Sheet", typeof(int));
        }

        public static void SetMapFromExcelHeadColumn(int sheet,string key,int keyIdx)
        {
            int idx = 0;

            if (sheet==1)
            {
                switch(key.Trim().ToLower())
                {
                    case "country":
                        idx = 2;
                        break;
                    case "x-code":
                        idx = 0;
                        break;
                    case "bg":
                        idx = 4;
                        break;
                    case "description":
                        idx = 1;
                        break;
                    case "tx":
                        idx = 3;
                        break;
                    default:
                        idx = 7;
                        break;
                }
                ht1.Add(keyIdx, idx);
            }
            else
            {
                switch (key.Trim().ToLower())
                {
                    case "country":
                        idx = 2;
                        break;
                    case "xcode":
                        idx = 0;
                        break;
                    case "cell":
                        idx = 5;
                        break;
                    default:
                        idx = 7;
                        break;
                }
                ht2.Add(keyIdx, idx);
            }
        }

        static public void GetDataFromExcel()
        {
            XSSFWorkbook workbook;

            using (FileStream file = new FileStream(strExcelPath, FileMode.Open, FileAccess.Read))
            {
                workbook = new XSSFWorkbook(file);
                file.Close();
                file.Dispose();
            }

            CreateDataTable();

            //read sheet1
            ISheet sheet = workbook.GetSheetAt(0);

            int iRowCnt, iCellCnt;
            iRowCnt = sheet.LastRowNum;
            //iCellCnt = sheet.GetRow(0).LastCellNum;
            iCellCnt = 9;

            for(int i=0;i<iCellCnt;i++)
            {
                SetMapFromExcelHeadColumn(1,sheet.GetRow(0).Cells[i].StringCellValue.Trim().ToLower(),i);
            }

            for (int i = 1; i < iRowCnt; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dr = dt.NewRow();
                for (int j = 0; j < iCellCnt; j++)
                {
                    ICell cell = row.GetCell(j);
                    if (cell == null)
                        continue;

                    string strCellValue=cell.ToString();
                    int idx=(int)ht1[j];
                    if(idx<7)
                    {
                        dr[idx] = strCellValue;
                    }
                }
                dr[6] = "1";
                dt.Rows.Add(dr);
            }

            //read sheet2
            sheet = workbook.GetSheetAt(1);
            iRowCnt = sheet.LastRowNum;
            //iCellCnt = sheet.GetRow(0).LastCellNum;
            iCellCnt = 4;

            for(int i=0;i<iCellCnt;i++)
            {
                SetMapFromExcelHeadColumn(2,sheet.GetRow(0).Cells[i].ToString().Trim().ToLower(),i+1);
            }

            for (int i = 1; i < iRowCnt; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dr = dt.NewRow();

                for (int j = 0; j < iCellCnt; j++)
                {
                    ICell cell = row.GetCell(j);
                    if (cell == null)
                        continue;

                    string strCellValue = cell.ToString();

                    int idx = (int)ht2[j];
                    if (idx < 7)
                    {
                        dr[idx] = strCellValue;
                    }
                }
                dr[6] = "2";
                dt.Rows.Add(dr);
            }

            int iTotalRowCnt = dt.Rows.Count;
        }
        public static void UpdateExcelColumnNameSimplify()
        {
            XSSFWorkbook workbook;

            using (FileStream file = new FileStream(strExcelPath, FileMode.Open, FileAccess.ReadWrite))
            {
                workbook = new XSSFWorkbook(file);

                File.Delete(strExcelPath);
                file.Close();
                file.Dispose();
            }

            ISheet sheet = workbook.GetSheetAt(0);
            IRow row = sheet.GetRow(0);
            for (int j = 0; j < row.LastCellNum; j++)
            {
                ICell cell = row.GetCell(j);
                if (cell == null)
                    continue;

                cell.SetCellValue(cell.ToString().Trim());
            }

            sheet = workbook.GetSheetAt(1);
            row = sheet.GetRow(0);
            for (int j = 0; j < row.LastCellNum; j++)
            {
                ICell cell = row.GetCell(j);
                if (cell == null)
                    continue;

                cell.SetCellValue(cell.ToString().Trim());
            }

            using (FileStream file = new FileStream(strExcelPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                workbook.Write(file);
                file.Close();
                file.Dispose();
            }
        }
    }
时间: 2024-08-05 19:34:00

使用NPOI读取Excel的数据,插入到DataTable中的相关文章

《.NET学习笔记》——使用NPOI读取Excel导入数据和导出Excel的功能

前提:由于有差不多两年时间没有进行B/S项目开发了,换了新工作,项目中要求有Excel导入数据库的功能,故保存下来供以后查看. 一.使用jQuery的uploadify插件完成选择文件并上传的功能: (1)先引入相关文件: <script src="../Scripts/uploadify/swfobject.js" type="text/javascript"></script> <link href="../Scripts

.net下使用NPOI读取Excel表数据

这里只写MVC下的情况 public ActionResult Index() { var path = Server.MapPath(@"/content/user.xlsx"); var dt= ExcelToDataTable(true, path); List<User> list = new List<User>(); foreach (DataRow item in dt.Rows) { list.Add(new User(){ No=Convert

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

NPOI 创建Excel,数据读取与写入

<1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Formula.Functions; using System.IO; using System.Text; namespace 导入导出Excel { /// <summary&g

使用NPOI读取Excel数据到DataTable

现在XML文件的存储格式大行其道,但是也不是适用于所有情况,很多单位的数据交换还是使用Excel的形式.这就使得我们需要读取Excel内的数据,加载到程序中进行处理.但是怎样有效率的读取,怎样使程序保持健壮,这需要很大的努力. 我们如果要写一个动态链接库会很花费时间和精力,这就使得开源项目是个很有效率的选择. 在各类关于Excel的开源项目中NPOI是中国的程序员发起的,他的一大好处是直接处理Ole文件,用户不必安装Office.现在发展到2.0还可以自动判断Excel文件版本,我们自己判断文件

使用NPOI读取Excel数据并写入SQLite

首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示 然后建一个Excel表格,往表格里面写入一些数据,我这里只是Demo形式,可以根据自己的实际情况,稍作修改 然后开始建一个新的项目,我这里用的是WPF,你可以使用Core,Console,Winform都可以,我这里提供思路,仅供参考 然后引用一下图中的dll程序集,主要是SQLite和NPOI,你可以到Nuget去下载,Nuge

使用NPOI读取Excel到DataTable

一.NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作 二.安装NPOI 新建控制台应用程序>管理NuGet程序包>搜索NPOI>安装NPOI 三.下面是我需要的读取的Excel文件,数据格式如下: 四.添加ExcelHelper类: using System; using NPOI.SS.User

VC6.0读取Excel文件数据

啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过光感应器实时获取气象数据,传送至服务器 3.碟型镜面,反射阳光热量,均匀聚焦到350mm直径的圆形范围内--发动机热头大小: 4.斯特林发动机,吸收镜面反射热量,通过内部气体膨胀.收缩带动发动机发电: 5.通信线,连接系统各个部分,使其运行正常. 对于这样一台设备,要使其高效发电,出气象条件要好之外

Java版将EXCEL表数据导入到数据库中

1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls")); //获取该工作表中的第一个工作表 Sheet sheet=workBook.getSheet(0); //获取该工作表的行数,以供下面循环使用 int rowSize=sheet.getRows(); for(int i=0;i<rowSize;i++) { //编号 String