简体   繁体   English

将 Select 查询(SQL Server)的结果保存到 Excel 的工作表中

[英]Save the Result Of Select Query (SQL Server) Into worksheet of Excel

I am currently developing a console application with C# and Entity Framework 5, where I insert data from Excel into database (SQL Server) then process it in the database (actually in a stored procedure) then update the excel file again.我目前正在使用 C# 和 Entity Framework 5 开发控制台应用程序,其中我将来自 Excel 的数据插入数据库(SQL Server)然后在数据库中处理它(实际上是在存储过程中),然后再次更新 ZBF57C906FA7D2556D07372E 文件。 The problem I encountered was that it took a long time to insert... but this has been resolved using SQLBulk.我遇到的问题是插入需要很长时间...但这已使用 SQLBulk 解决。

The next problem is that it takes a lot longer to write (update) a column (actually 3 columns).下一个问题是写入(更新)一列(实际上是 3 列)需要更长的时间。 where the value of the column comes from a database query.其中列的值来自数据库查询。 The number of rows generated from the query is 16000 rows.查询生成的行数为 16000 行。

Here is my code:这是我的代码:

private static void writetoExcel2(T_UploadEvent objParam, DateTime dtstartingTime)
    {
        try
        {
            M_PriceMapper m_PriceMapper = new M_PriceMapper();

            Application excelApp = new Application();

            if (excelApp == null)
            {
                Console.WriteLine("Excel is not installed!!");
                return;
            }

            Workbook excelBook = excelApp.Workbooks.Open(@objParam.FilePath);
            _Worksheet excelSheet = excelBook.Sheets[1];
            Range excelRange = excelSheet.UsedRange;
            Range excelRangeRow = excelSheet.UsedRange.Rows;

            int rows = excelRange.Rows.Count;
            int cols = excelRange.Columns.Count;


            List<T_HeaderOrder> t_HeaderOrders = new List<T_HeaderOrder>();

            T_HeaderOrderMapper t_HeaderOrderMapper = new T_HeaderOrderMapper();

            t_HeaderOrderLists = t_HeaderOrderMapper.getListData(objParam, "1");
            T_HeaderOrder objOL = new T_HeaderOrder();

            if (t_HeaderOrderLists != null)
            {
                for (int y = 2; y <= rows; y++)
                {
                    for (int x = 1; x <= cols; x++)
                    {
                        try
                        {
                            switch (excelRange.Cells[1, x].value2)
                            {
                                case "UNIQCODE":
                                    for (int c = 0; c <= t_HeaderOrderLists.Count - 1; c++)
                                    {
                                        T_HeaderOrder obj = t_HeaderOrderLists[c];
                                        if (string.IsNullOrEmpty(obj.ErrorMessage))
                                        {
                                            M_Price m_Price = new M_Price();
                                            m_Price = m_PriceMapper.getData(obj.MasterPriceID);
                                            if (m_Price.UniqCode == excelRange.Cells[y, x].value2.ToString())
                                            {
                                                objOL = obj;
                                                c = t_HeaderOrderLists.Count;
                                                Range ora1 = excelSheet.Rows.Cells[y, cols + 1];
                                                ora1.Value2 = objOL.NewPrice;

                                                Range ora2 = excelSheet.Rows.Cells[y, cols + 2];
                                                ora2.Value2 = objOL.Manual_VS_MPrise.ToUpper();
                                                if (objOL.Manual_VS_MPrise == "false")
                                                {
                                                    Range rowFormat = excelSheet.Rows[y];
                                                    rowFormat.Interior.Color = System.Drawing.Color.Red;
                                                    rowFormat.Font.Color = System.Drawing.Color.White;
                                                }

                                                Range ora3 = excelSheet.Rows.Cells[y, 33];
                                                ora3.Value2 = objOL.SourcePrice;
                                            }
                                        }
                                        else
                                        {
                                            Range msgERR = excelSheet.Rows.Cells[y, cols + 4];
                                            msgERR.Value2 = objOL.ErrorMessage.ToUpper();
                                        }
                                    }
                                    break;
                            }
                        }
                        catch (Exception eb)
                        {
                            Console.WriteLine("Error while write to excel, Row number : " + y);
                            Range msgERR = excelSheet.Rows.Cells[y, cols + 4];
                            msgERR.Value2 = eb.Message;
                        }
                    }
                    Console.WriteLine("Updateing row : " + y);
                }
                Range oraHEADER = excelSheet.Rows.Cells[1, cols + 1];
                oraHEADER.Value2 = "New PRICE";

                Range oravs = excelSheet.Rows.Cells[1, cols + 2];
                oravs.Value2 = "PRICE Comparasion";

                Range orasOURCE = excelSheet.Rows.Cells[1, cols + 3];
                orasOURCE.Value2 = "SOURCE PRICE";

                Range oramsgerr = excelSheet.Rows.Cells[1, cols + 4];
                orasOURCE.Value2 = "Error Message";
            }
            excelApp.ActiveWorkbook.Save();
            excelApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error While Sending Emails");
        }

}

public List<T_HeaderOrder> getListData(T_UploadEvent objParam, string param)
{
        try
        {
            List<T_HeaderOrder> t_HeaderOrders= new List<T_HeaderOrder>();
            using (Entities entities = new Entities ())
            {
                var idParam = new SqlParameter
                {
                    ParameterName = "T_UploadEventID",
                    Value = objParam.ID
                };

                var list = entities.Database.SqlQuery<T_HeaderOrder>
                    ("exec T_HeaderOrder_Comparasion @T_UploadEventID ", idParam).ToList<T_HeaderOrder>();
               
                t_HeaderOrders = list;

            }
            return t_HeaderOrders;
        }
        catch (DbEntityValidationException e)
        {
            foreach (var eve in e.EntityValidationErrors)
            {
                Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().Name, eve.Entry.State);
                foreach (var ve in eve.ValidationErrors)
                {
                    Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                        ve.PropertyName, ve.ErrorMessage);
                }
            }
            throw;
            return new List<T_HeaderOrder>();
        }
}

Thanks for your help谢谢你的帮助

Thanks for all your response, i have figured out the root cause and solved it.感谢您的所有回复,我已经找到了根本原因并解决了它。 the root caused is to many validation and nasted loop.造成的根源是许多验证和嵌套循环。 i have delete it.. and the application become more faster.我已将其删除.. 应用程序变得更快。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM