读取Excel数据到Table表中

方法一:

            try
            {
                List<DBUtility.CommandInfo> list = new List<DBUtility.CommandInfo>();

                string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + path + ";Extended Properties=‘Excel 12.0; HDR=YES; IMEX=1‘"; //此连接可以操作.xls与.xlsx文件
                using (OleDbConnection conn = new OleDbConnection(strConn))
                {
                    conn.Open();
                    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });  //得到所有sheet的名字
                    string SheetName = sheetsName.Rows[0][2].ToString();
                    string strSQL = string.Format("SELECT * FROM [{0}]", SheetName);
                    OleDbDataAdapter oda = new OleDbDataAdapter(strSQL, strConn);
                    DataTable dt = new DataTable();
                    oda.Fill(dt);

                    if (dt.Rows.Count > 0)
                    {
                        DateTime date = DateTime.Parse(System.DateTime.Now.ToString());
                        string year = date.ToString("yyyy");
                        string month = date.ToString("MM");
                        string proName = dt.Rows[0][1].ToString().Substring(5);
                        strSQL = "insert into tb_targetcostlist (gcmc,Date,UserID) values(‘" + proName + "‘,‘" + date + "‘,‘" + Session["UserId"] + "‘);select @@identity;";
                        string proID = DBUtility.DbHelperSQL.GetSingle(strSQL).ToString();
                        for (int i = 1; i < dt.Rows.Count; i++)
                        {
                            DBUtility.CommandInfo item = new DBUtility.CommandInfo();
                            item.CommandText = "insert into tb_MonthlyCost (Num, ProClassification, ProName, Unit, Quantity, UnitPrice, TotalPrice, MonthPlanCost, MonthActuallyCost_GJ, MonthActuallyCost_JD, MonthProfitAndLoss, TotalPlanCost, TotalActuallyCost_GJ, TotalActuallyCost_JD, ProTotalCost, TotalProfitAndLoss, EvenCost, ContractPrice, ProfitAndLoss, Others, Month,Year,proID)";
                            item.CommandText += "values(";
                            item.CommandText += "‘" + dt.Rows[i][0].ToString() + "‘,‘" + dt.Rows[i][1].ToString() + "‘,‘" + dt.Rows[i][2].ToString() + "‘,‘" + dt.Rows[i][3].ToString() + "‘,‘" + dt.Rows[i][4].ToString() + "‘,‘" + dt.Rows[i][5].ToString() + "‘,‘" + dt.Rows[i][6].ToString() + "‘,‘" + dt.Rows[i][7].ToString() + "‘,‘" + dt.Rows[i][8] + "‘,‘" + dt.Rows[i][9].ToString() + "‘,‘" + dt.Rows[i][10].ToString() + "‘,‘" + dt.Rows[i][11].ToString() + "‘,‘" + dt.Rows[i][12].ToString() + "‘,‘" + dt.Rows[i][13].ToString() + "‘,‘" + dt.Rows[i][14].ToString() + "‘,‘" + dt.Rows[i][15].ToString() + "‘,‘" + dt.Rows[i][16].ToString() + "‘,‘" + dt.Rows[i][17].ToString() + "‘,‘" + dt.Rows[i][18].ToString() + "‘,‘" + dt.Rows[i][19].ToString() + "‘,‘" + month + "‘,‘" + year + "‘,‘" + proID + "‘";
                            item.CommandText += ")";
                            list.Add(item);
                            DBUtility.DbHelperSQL.ExecuteSqlTran(list);
                            item.CommandText = "";
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                Page.RegisterStartupScript("", "<script>alert(‘" + ex.Message + "‘);</script>");
            }

方法二:

此方法弊端:每次都会产生一个EXCEL.exe进程,下次再运行,要不这个进程关闭才行,非常不方便

        private void ReadExcelToTable(string path)
        {
            Microsoft.Office.Interop.Excel.Application oXL;
            Microsoft.Office.Interop.Excel._Workbook oWB;
            Microsoft.Office.Interop.Excel._Worksheet oSheet;
            object missing = System.Type.Missing;

            //创建Excel实例
            oXL = new Microsoft.Office.Interop.Excel.Application();

            //打开已有的工作簿
            oWB = oXL.Workbooks.Open(path, missing, missing, missing, missing, missing, missing,
                missing, missing, missing, missing, missing, missing, missing, missing);

            //导入服务器的连接
            String strcon = "Data Source=192.168.1.245;Initial Catalog=Component;User ID=sa;Password=yuxit2008";
            using (SqlConnection objcon1 = new SqlConnection(strcon))
            {
                objcon1.Open();

                for (int i = 1; i <= oWB.Sheets.Count; i++)
                {
                    oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.Sheets.get_Item(i);
                    //tb_targetcostlist中插入标题,项目名称等
                    DateTime date = DateTime.Parse(System.DateTime.Now.ToString());
                    string year = date.ToString("yyyy");
                    string month = date.ToString("MM");
                    string proName = GetCellText(2, 2, oSheet).Substring(5);
                    string title = GetCellText(1, 1, oSheet);
                    string strSQL = "insert into tb_targetcostlist(gcmc,Title,Date,UserID) values(‘" + proName + "‘,‘" + title + "‘,‘" + date + "‘,‘" + Session["UserId"] + "‘);select @@identity;";
                    string proID = DBUtility.DbHelperSQL.GetSingle(strSQL).ToString();

                    // 从第二行开始遍历 行、列 数据
                    for (int j = 2; j <= oSheet.UsedRange.Rows.Count; j++)
                    {
                        string str = "";
                        for (int n = 1; n < oSheet.UsedRange.Columns.Count; n++)
                        {
                            str += "‘" + GetCellText(j, n, oSheet) + "‘,";
                        }
                        string strinsert = @"insert into tb_MonthlyCost( Num, ProClassification, ProName, Unit, Quantity, UnitPrice, TotalPrice, MonthPlanCost, MonthActuallyCost_GJ, MonthActuallyCost_JD, MonthProfitAndLoss, TotalPlanCost, TotalActuallyCost_GJ, TotalActuallyCost_JD, ProTotalCost, TotalProfitAndLoss, EvenCost, ContractPrice, ProfitAndLoss, Others,Year,Month,ProID)" +
                                     " values(" + str + "‘" + year + "‘,‘" + month + "‘,‘" + proID + "‘)";

                        using (SqlCommand objcom = new SqlCommand(strinsert, objcon1))
                        {
                            objcom.ExecuteNonQuery();
                        }

                    }
                }
            }
        }
         ///<summary>
         ///获取单元格文本
         ///</summary>
         ///<param name="row"></param>
         ///<param name="col"></param>
         ///<param name="oSheet"></param>
         ///<returns></returns>
        private string GetCellText(int row, int col, Microsoft.Office.Interop.Excel._Worksheet oSheet)
        {
            string result = "";
            bool isFound = false;
            int rowEnd = 1;
            int colEnd = 1;

            Microsoft.Office.Interop.Excel.Range oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[row, col];
            if (oRng.Value2 != null)
            {
                result = oRng.Value2.ToString();
                isFound = true;
            }
            else
            {
                if (!(bool)oRng.MergeCells)    // 如果该单元格无值且不是合并的,则返回 null
                {
                    result = null;
                    isFound = true;
                }
            }
            if (!isFound)
            {
                // 倒序遍历该列所有行(从倒2行开始),判断是否有合并单元格且有值,如果遇到则已求出,
                // 如果遇到非合并单元格,则行+1(倒回1行),列同样倒序进行
                for (int r = row - 1; r >= 1; r--)
                {
                    oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[r, col];
                    if ((bool)oRng.MergeCells)
                    {
                        try
                        {
                            if (oRng.Value2 != null)
                            {
                                result = oRng.Value2.ToString();
                                isFound = true;
                                break;
                            }
                        }
                        catch (Exception)
                        { }
                    }
                    else
                    {
                        rowEnd = r + 1;
                        break;
                    }
                }
                if (!isFound)
                {
                    // 倒序遍历该行所有列,判断是否有合并单元格且有值,如果遇到则已求出,如果遇到非合并单元格,则说明数据非法。。。
                    for (int c = col - 1; c >= 1; c--)
                    {
                        oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, c];
                        if ((bool)oRng.MergeCells)
                        {
                            try
                            {
                                if (oRng.Value2 != null)
                                {
                                    result = oRng.Value2.ToString();
                                    isFound = true;
                                    break;
                                }
                            }
                            catch (Exception)
                            { }
                        }
                        else
                        {
                            colEnd = c + 1;
                            break;
                        }
                    }
                }
                if (!isFound)
                {
                    result = null;
                }
            }
            return result;
        }

方法三(重点):

使用NPOI读取单元格。对于合并单元格:相同值,读取多次,存储到数据库表中

        private void ReadExcelToTable(string path)
        {
            using (FileStream fs=File.Open(path,FileMode.Open))
            {
                using (Workbook wk=new HSSFWorkbook(fs))
                {
                    for (int i = 0; i < wk.NumberOfSheets; i++)
                    {
                        using (Sheet sheet = wk.GetSheetAt(i))
                        {
                            //tb_targetcostlist中插入标题,项目名称等
                            DateTime date = DateTime.Parse(System.DateTime.Now.ToString());
                            string year = date.ToString("yyyy");
                            string month = date.ToString("MM");
                            Cell cell_title = sheet.GetRow(0).GetCell(0);
                            Cell cell_proName = sheet.GetRow(1).GetCell(1);
                            Cell cell_monthly=sheet.GetRow(1).GetCell(9);
                            Cell cell_total=sheet.GetRow(1).GetCell(13);
                            string proName = getCellValue(cell_proName).Substring(5);
                            string title = getCellValue(cell_title);
                            string monthlyProduct=getCellValue(cell_monthly);
                                string totalProduct=getCellValue(cell_total);
                                string strSQL = "insert into tb_targetcostlist(ProName, Title, Date, UserID,MonthlyProduct,TotalProduct) values(‘" + proName + "‘,‘" + title + "‘,‘" + date + "‘,‘" + Session["UserId"] + "‘,‘" + monthlyProduct + "‘,‘" + totalProduct + "‘);select @@identity";
                            string proID = DBUtility.DbHelperSQL.GetSingle(strSQL).ToString();

                                   //从第3行开始遍历
                            for (int j = 2; j <= sheet.LastRowNum; j++)
                            {
                                string value = "";
                                Row curRow = sheet.GetRow(j);
                                if (curRow != null)
                                {
                                    for (int m = 0; m < 19; m++)
                                    {
                                        Cell cell = curRow.GetCell(m);
                                        if (cell != null)
                                        {
                                            if (isMergedRegion(sheet, j, m))
                                            {
                                                value += "‘" + getMergedRegionValue(sheet, j, m) + "‘,";
                                            }
                                            else
                                            {
                                                value += "‘" + getCellValue(cell) + "‘,";
                                            }
                                        }
                                        else
                                        {
                                            value += "‘‘,";
                                        }

                                    }

                                    string strinsert = @"insert into tb_MonthlyCost( Num, ProClassification, ItemName, Unit, Quantity, UnitPrice, TotalPrice, MonthPlanCost, MonthActuallyCost_GJ, MonthActuallyCost_JD, MonthProfitAndLoss, TotalPlanCost, TotalActuallyCost_GJ, TotalActuallyCost_JD, ProTotalCost, TotalProfitAndLoss, EvenCost, ContractPrice, ProfitAndLoss,Year,Month,ProID)" +
                                         " values(" + value + "‘" + year + "‘,‘" + month + "‘,‘" + proID + "‘)";

                                    DBUtility.DbHelperSQL.GetSingle(strinsert);
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 获取合并单元格的值
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <returns></returns>

        public String getMergedRegionValue(Sheet sheet, int row, int column)
        {
            int sheetMergeCount = sheet.NumMergedRegions;

            for (int i = 0; i < sheetMergeCount; i++)
            {
                CellRangeAddress ca = sheet.GetMergedRegion(i);
                int firstColumn = ca.FirstColumn;
                int lastColumn = ca.LastColumn;
                int firstRow = ca.FirstRow;
                int lastRow = ca.LastRow;

                if (row >= firstRow && row <= lastRow)
                {

                    if (column >= firstColumn && column <= lastColumn)
                    {
                        Row fRow = sheet.GetRow(firstRow);
                        Cell fCell = fRow.GetCell(firstColumn);

                        return getCellValue(fCell);
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// 判断指定的单元格是否是合并单元格
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <returns></returns>
        public bool isMergedRegion(Sheet sheet, int row, int column)
        {
            int sheetMergeCount = sheet.NumMergedRegions;

            for (int i = 0; i < sheetMergeCount; i++)
            {
                CellRangeAddress ca = sheet.GetMergedRegion(i);
                int firstColumn = ca.FirstColumn;
                int lastColumn = ca.LastColumn;
                int firstRow = ca.FirstRow;
                int lastRow = ca.LastRow;

                if (row >= firstRow && row <= lastRow)
                {
                    if (column >= firstColumn && column <= lastColumn)
                    {
                        return true;
                    }
                }
            }

            return false;
        }

        /// <summary>
        /// 获取单元格的值
        /// </summary>
        /// <param name="cell"></param>
        /// <returns></returns>
        public String getCellValue(Cell cell)
        {

            if (cell == null) return "";

            if (cell.CellType == CellType.STRING)
            {
                return cell.StringCellValue;
            }
            else if (cell.CellType == CellType.BOOLEAN)
            {
                return cell.BooleanCellValue.ToString();
            }
            else if (cell.CellType == CellType.FORMULA)
            {          //此处注意,对于通过公式计算出来的单元格值,返回值为cell.NumericCellValue.ToString();
                return cell.NumericCellValue.ToString();
            }
            else if (cell.CellType == CellType.NUMERIC)
            {
                return cell.NumericCellValue.ToString();
            }
            return "";
时间: 2024-10-19 03:33:43

读取Excel数据到Table表中的相关文章

Delphi中使用python脚本读取Excel数据

Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://seewind.blog.51cto.com/249547/46669前段时间,在正式项目中使用Python来读取Excel表格的数据.具体需求是,项目数据库中有些数据需要根据Excel表格里面的数据进行一些调整,功能应该比较简单.为了学习Pyth

java的poi技术读取Excel数据到MySQL

这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 :java的jxl技术导入Excel  项目结构: Excel中的测试数据: 数据库结构: 对应的SQL: 1 CREATE TABLE `student_info` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `no` varchar(20) DEFAU

猜想-未做 利用office组件读取excel数据

---未实际使用过 用SQL-Server访问Office的Access和Excel http://blog.sina.com.cn/s/blog_964237ea0101532x.html 2007 Office system 驱动程序:数据连接组件 http://www.microsoft.com/zh-CN/download/details.aspx?id=23734 2007 Office system 驱动程序:数据连接组件 详情 版本:All File Name:AccessData

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

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

使用NPOI读取Excel数据到DataTable

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

hive-hbase-handler方式导入hive表数据到hbase表中

Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler.jar工具类 : hive-hbase-handler.jar在hive的lib包中而不是在hbase的lib中,hive0.6版本以后: 创建hive表的同时创建hbase表,删除 hive表的同时也会删除对应的hbase表. 参见官方文档:https://cwiki.apache.org/confluence/display/Hive/HBaseIntegr

MySQL 处理重复数据:防止表中出现重复数据、统计、过滤、删除重复数据

MySQL 处理重复数据 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据. 防止表中出现重复数据 你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性. 让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录. CREATE TABLE person_tbl

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP

Openxml入门---Openxm读取Excel数据

Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.FromOADate(double d)转换为时间. 可是缺点的地方就是,如果Cell.DataType ==NULL, 根本无法确认这个数据到底是 浮点型还是[被转换为了日期的浮点数].查阅了很多国外资料,的确国外博客有一部分都反映了.有关Openxml读取Excel时Cell.DataType==