C#将数据批量导入EXCEL的方法

作为一个资深小白,用C#将数据批量导入到excel中这么简单的事儿都略显费力,特地来记录一下。

方法1:NPOI,听说这个炒鸡简单,因为项目已经完成,所以没有再花功夫看这个,在这儿只是记录一下这个方法名称。
方法2:引用Microsoft.Office.Interop.Excel,引用—添加引用—com里找这个dll,接下来就是数据导入,按单元格导入很慢,按行导入稍快点儿,最快的是将所有数据变成一个二维数组,一次性写入,超级快。那么。。。。
C#将数据批量导入EXCEL的方法_第1张图片

  • 按单元格写入
 System.Data.DataTable table = ShowTBL();//读取数据库函数
            string fileName = @"D:\地质库相关数据收集.xlsx";//EXCEL路径
            string sheetName = "土质数据收集";//工作表名称
            //string dt = "";//向excel单元格里添加的数据
            Application objExcelApp = new ApplicationClass();//定义Excel Application对象
            Workbooks objExcelWorkBooks = objExcelApp.Workbooks;//定义Workbook工作簿集合对象
            Workbook objExcelWorkbook = objExcelWorkBooks.Open(fileName, 0, false, 5, "", "", true,
                XlPlatform.xlWindows, "", true, false, 0, true, false, false);//定义Excel workbook工作簿对象
            Worksheet objExcelWorkSheet = (Worksheet)objExcelWorkbook.Worksheets[sheetName]; //strSheetName是指的Excel工作簿的Sheet名,如果没有命名则为"1"
            objExcelWorkSheet.Select(Type.Missing);
            Worksheet objExcelWorkSheetTemp = (Worksheet)objExcelApp.ActiveSheet;
            ////将数据库第一行写入excel中
            for (int i = 1; i < table.Columns.Count; i++)
            {
                string aaa = table.Rows[0][i].ToString();
                objExcelWorkSheetTemp.Cells[7, 13 + i] = table.Rows[0][i];
            }
            objExcelWorkbook.Save();
            objExcelWorkbook.Close();
            Console.Write("写入成功");
            Console.ReadKey();
  • 按二维数组写入
static void Main(string[] args)
        {
            System.Data.DataTable table = ShowTBL();//读取数据库函数
            string fileName = @"D:\地质库相关数据收集终稿修改版.xlsx";//EXCEL路径
            Application excel = new Application
            {
                Visible = false,//不显示excel
                DisplayAlerts = false,//不提示信息
                ScreenUpdating = false//停止屏幕更新。加快速度
            };
            Workbooks workbooks = excel.Workbooks;//获取工作簿
            _Workbook workbook = workbooks.Open(fileName);//打开文件
            Sheets sheets = workbook.Worksheets;//文件中的工作表sheet
            _Worksheet worksheet = (_Worksheet)sheets["土质数据收集"];//指定所需要修改的sheet
            DataToSheet(TurnData(table), worksheet);
            workbook.Save();
            workbook.Close();
            excel.Quit();//关闭excel
            
            Console.Write("写入成功");
            Console.ReadKey();
        }

        /// 将二维数组存入sheet文件中
        public static void DataToSheet(object[,] data, _Worksheet Sheet)
        {
            int row = data.GetLength(1);
            int colums = data.GetLength(0);
            Range range;
            //写入数据行
            range = Sheet.get_Range("N7", Missing.Value);//数据起始位置
            range = range.get_Resize(colums, row);//数据范围
            range.set_Value(Missing.Value, data);//将数组插入sheet中
        }
        /// 将数据库中datatable转为excel需要的dataTable形式
        public static object[,] TurnData(System.Data.DataTable table)
        {
            List strIDs = new List();
            string strIDstart = table.Rows[0][0].ToString();//开始计数时的strID
            int N = 1;//每个重复项的个数(计数)
            int maxN = 0;//最大的一次计数
            for (int i = 0; i < table.Rows.Count; i++)
            {
                string strID = table.Rows[i][0].ToString();
                strIDs.Add(strID);
                if (i > 0)//从第二个数开始计数
                {
                    if (strIDstart == strID)
                    {
                        N++;
                    }
                    else
                    {
                        strIDstart = strID;
                        if (N > maxN)
                        {
                            maxN = N;
                        }
                        N = 1;
                    }
                }

            }
            int objectRows = strIDs.Distinct().ToList().Count;//去重后的个数即为数组的行数
            int objectColoum = maxN * 40;
            object[,] cellData = new object[objectRows, objectColoum];//创建适应需求的二维数组
            string sIDstrart = table.Rows[0][0].ToString();
            int M = 0;//计数
            int totalM = 0;
            for (int i = 0; i < table.Rows.Count; i++)
            {
                string sID = table.Rows[i][0].ToString();
                if (sID == sIDstrart)
                {                  
                    for (int j = 0; j < table.Columns.Count - 1; j++)//注意,数据表中有一列不需要提取,所以减去1
                    {
                        
                        cellData[i - totalM, j + table.Columns.Count * M - M] = table.Rows[i][j + 1];
                    }
                    M++;
                    totalM++;
                }
                else
                {
                    M = 1;
                    //totalM--;
                    sIDstrart = sID;
                    for (int j = 0; j < table.Columns.Count - 1; j++)
                    {
                        cellData[i - totalM + 1, j * M] = table.Rows[i][j + 1];
                    }
                }              
            }
            return cellData;
        }

        /// 读取数据库
        public static System.Data.DataTable ShowTBL()
        {
            string ConStr = "Data Source=DESKTOP-RO11SSP;Initial Catalog=库库;Integrated Security=True";
            System.Data.DataTable table = new System.Data.DataTable();  //建立表格
            table.Clear();  //清空表格内容
            using (SqlConnection con = new SqlConnection(ConStr))
            {
                string CmdStr = "SELECT * FROM[库库].[dbo].[转换表$]";
                using (SqlCommand cmd = new SqlCommand(CmdStr, con))
                {
                    con.Open();
                    SqlDataAdapter data = new SqlDataAdapter(CmdStr, con);
                    DataSet ds = new DataSet();
                    data.Fill(ds, "表");               //填充表格
                    table = ds.Tables["表"];
                    con.Close();
                }
            }
            return table;
        }

因为我的数据库格式和即将要导入的excel表格形式不一样,所以在转换成二维数组的时候稍微复杂了一点,资深小白写的很不好,请各位大佬指教

你可能感兴趣的:(C#,EXCEL)