学习01:npoi导出excel 和SqlBulkCopy导入数据库 - Go语言中文社区

学习01:npoi导出excel 和SqlBulkCopy导入数据库


一、导出excel

1.准备npoi 的 dll:

下载地址:
https://npoi.codeplex.com/releases
2、引用
在这里插入图片描述
3、代码

	/// <summary>  
    /// DataTable导出到Excel文件  
    /// </summary>  
    /// <param name="dtSource">源DataTable</param>  
    /// <param name="strHeaderText">表头文本</param>  
    /// <param name="strFileName">保存位置</param>  
    /// <param name="SFBT">表头文本是否显示</param> 
    public static void Export(DataTable dtSource, string strHeaderText, string strFileName,bool SFBT)
    {
        using (MemoryStream ms = Export(dtSource, strHeaderText,SFBT))
        {
            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
            {
                byte[] data = ms.ToArray();
                fs.Write(data, 0, data.Length);
                fs.Flush();
            }
        }
    }

    /// <summary>  
 
    /// DataTable导出到Excel的MemoryStream  
    /// </summary>  
    /// <param name="dtSource">源DataTable</param>  
    /// <param name="strHeaderText">表头文本</param>  
    /// <param name="SFBT">表头文本是否显示</param>  
    public static MemoryStream Export(DataTable dtSource, string strHeaderText,bool SFBT)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet();
        ICellStyle dateStyle = workbook.CreateCellStyle();
        IDataFormat format = workbook.CreateDataFormat();
        dateStyle.DataFormat = format.GetFormat("yyyy-MM-dd");
        #region 取得每列的列宽(最大宽度)
        int[] arrColWidth = new int[dtSource.Columns.Count];
        foreach (DataColumn item in dtSource.Columns)
        {
            //GBK对应的code page是CP936
            arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
        }
        for (int i = 0; i < dtSource.Rows.Count; i++)
        {
            for (int j = 0; j < dtSource.Columns.Count; j++)
            {
                int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
                if (intTemp > arrColWidth[j])
                {
                    arrColWidth[j] = intTemp;
                }
            }
        }
        #endregion
        int rowIndex = 0;
        foreach (DataRow row in dtSource.Rows)
        {
            #region 新建表,填充表头,填充列头,样式
            if (rowIndex == 65535 || rowIndex == 0)
            {
                if (rowIndex != 0)
                {
                    sheet = workbook.CreateSheet();
                }
                if (SFBT)
                {
                    #region 表头及样式
                    {
                        IRow headerRow = sheet.CreateRow(0);
                        headerRow.HeightInPoints = 25;
                        headerRow.CreateCell(0).SetCellValue(strHeaderText);
                        ICellStyle headStyle = workbook.CreateCellStyle();
                        headStyle.Alignment = HorizontalAlignment.Center;
                        IFont font = workbook.CreateFont();
                        font.FontHeightInPoints = 20;
                        font.Boldweight = 700;
                        headStyle.SetFont(font);
                        headerRow.GetCell(0).CellStyle = headStyle;
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
                    }
                    #endregion
                    #region 列头及样式
                    {
                        IRow headerRow = sheet.CreateRow(1);
                        ICellStyle headStyle = workbook.CreateCellStyle();
                        headStyle.Alignment = HorizontalAlignment.Center;
                        IFont font = workbook.CreateFont();
                        font.FontHeightInPoints = 10;
                        font.Boldweight = 700;
                        headStyle.SetFont(font);
                        foreach (DataColumn column in dtSource.Columns)
                        {
							headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                            headerRow.GetCell(column.Ordinal).CellStyle = headStyle;

                            //设置列宽  
                            sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
                        }
                    }
                    #endregion

                    rowIndex = 2;
                }
                else
                {
                    #region 列头及样式
                    {
                        IRow headerRow = sheet.CreateRow(0);
                        ICellStyle headStyle = workbook.CreateCellStyle();
                        headStyle.Alignment = HorizontalAlignment.Center;
                        IFont font = workbook.CreateFont();
                        font.FontHeightInPoints = 10;
                        font.Boldweight = 700;
                        headStyle.SetFont(font);
                        foreach (DataColumn column in dtSource.Columns)
                        {
							headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                            headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
                            //设置列宽  
                            sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);

                        }
                    }
                    #endregion

                    rowIndex = 1;
                }
            }
            #endregion
            #region 填充内容
            ICellStyle contentStyle = workbook.CreateCellStyle();
            contentStyle.Alignment = HorizontalAlignment.Left;
            IRow dataRow = sheet.CreateRow(rowIndex);
            foreach (DataColumn column in dtSource.Columns)
            {
                ICell newCell = dataRow.CreateCell(column.Ordinal);
                newCell.CellStyle = contentStyle;
                string drValue = row[column].ToString();
                switch (column.DataType.ToString())
                {
                    case "System.String"://字符串类型  
                        newCell.SetCellValue(drValue);
                        break;
                    case "System.DateTime"://日期类型  
                        DateTime dateV;
                        DateTime.TryParse(drValue, out dateV);
                        newCell.SetCellValue(dateV);
                        newCell.CellStyle = dateStyle;//格式化显示  
                        break;
                    case "System.Boolean"://布尔型  
                        bool boolV = false;
                        bool.TryParse(drValue, out boolV);
                        newCell.SetCellValue(boolV);
                        break;
                    case "System.Int16"://整型  
                    case "System.Int32":
                    case "System.Int64":
                    case "System.Byte":
                        int intV = 0;
                        int.TryParse(drValue, out intV);
                        newCell.SetCellValue(intV);
                        break;
                    case "System.Decimal"://浮点型  
                    case "System.Double":
                        double doubV = 0;
                        double.TryParse(drValue, out doubV);
                        newCell.SetCellValue(doubV);
                        break;
                    case "System.DBNull"://空值处理  
                        newCell.SetCellValue("");
                        break;
                    default:
                        newCell.SetCellValue("");
                        break;
                }
            }
            #endregion
            rowIndex++;
        }
        using (MemoryStream ms = new MemoryStream())
        {
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            //sheet.Dispose();
            //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet  
            return ms;
        }
    }

二、SqlBulkCopy大数据导入(DataTable导入到数据库)

1、获取excel 数据并转换成 datatable.

            //获取全部数据      HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES  
	        string strConn2003 = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + Extended Properties = 'Excel 8.0;HDR=Yes;'";
            string strConn2007 = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=YES'";
            OleDbConnection conn = new OleDbConnection(strConn2003);
            conn.Open();
            string strExcel = "";
            OleDbDataAdapter myCommand = null;
            strExcel = string.Format("select * from [{0}$]", sheetName);
            myCommand = new OleDbDataAdapter(strExcel, strConn2003);
            myCommand.Fill(ds, sheetName);

2、用bcp导入数据

            //excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的 
            using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(Rejoy.DataHelper.Connection.strConn))
            {
                //bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                bcp.BatchSize = 100;//每次传输的行数        
                bcp.NotifyAfter = 100;//进度提示的行数        
                bcp.DestinationTableName = "FDCSCJCXX_YSZJJG.dbo.SQ_HTRZ_HT";//目标表   
                DataTable dt = RBase.JSONToDataTable(excelFile); //ds.Tables[0];

                foreach (DataColumn dc in dt.Columns)
                {
                    //源列字段:A,目标数据源字段:B
                    if (dc.ColumnName == "申请编号")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "SQBH");
                    }
                    if (dc.ColumnName == "申请BSM")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "SQBSM");
                    }
                    if (dc.ColumnName == "监管编号")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "JGBH");
                    }
                    if (dc.ColumnName == "合同标识码")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "HTBSM");
                    }
                    if (dc.ColumnName == "申请缴存金额")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "RZJE");
                    }
                    if (dc.ColumnName == "系统合同号")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "XTHTH");
                    }
                    if (dc.ColumnName == "有效性")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "YXX");
                    }
                    if (dc.ColumnName == "是否选择")
                    {
                        bcp.ColumnMappings.Add(dc.ColumnName, "SFXZ");
                    }

                }
                bcp.WriteToServer(dt);
            }
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010892385/article/details/103593889
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢