C# 你是不是在说:“你至少会“呆在Excel空间”而不是打很多昂贵的电话?”?能否请您详细说明一下?您可能会在代码中创建至少两个额外的Excel实例,这取决于您的计算机,可能会非常慢。看起来,一点常规的excel编码(可能只是一个透视表)可能就是您所需要的——

C# 你是不是在说:“你至少会“呆在Excel空间”而不是打很多昂贵的电话?”?能否请您详细说明一下?您可能会在代码中创建至少两个额外的Excel实例,这取决于您的计算机,可能会非常慢。看起来,一点常规的excel编码(可能只是一个透视表)可能就是您所需要的——,c#,winforms,visual-studio-2010,performance,excel,C#,Winforms,Visual Studio 2010,Performance,Excel,你是不是在说:“你至少会“呆在Excel空间”而不是打很多昂贵的电话?”?能否请您详细说明一下?您可能会在代码中创建至少两个额外的Excel实例,这取决于您的计算机,可能会非常慢。看起来,一点常规的excel编码(可能只是一个透视表)可能就是您所需要的——如果不逐行地将代码分开,就有点难说了。但我非常确信,C#解决方案不是将数据从一个Excel电子表格转换到另一个Excel电子表格的方法。假装你只能用Excel来解决这个问题,你会很高兴你这么做的。@Jeremythonpson:这并不是一个完全


你是不是在说:“你至少会“呆在Excel空间”而不是打很多昂贵的电话?”?能否请您详细说明一下?您可能会在代码中创建至少两个额外的Excel实例,这取决于您的计算机,可能会非常慢。看起来,一点常规的excel编码(可能只是一个透视表)可能就是您所需要的——如果不逐行地将代码分开,就有点难说了。但我非常确信,C#解决方案不是将数据从一个Excel电子表格转换到另一个Excel电子表格的方法。假装你只能用Excel来解决这个问题,你会很高兴你这么做的。@Jeremythonpson:这并不是一个完全重复的情况。如果仔细阅读代码,您会注意到需要进行一些修改,以使代码运行得更快。我正在寻找这样的修改。是什么让你认为这可以做得更快?你是否做过任何分析来发现大部分时间都花在了哪里?excel文件有多大?我真的很想知道,如果使用VBA,你是否会过得更好?你至少应该“呆在Excel空间”,而不是对连接Excel和C#的代码进行大量昂贵的调用。@Floris:我发现大部分时间都花在最内部的for循环中,它从当前Excel文件中检索值。excel文件的大小约为80 KB。我不熟悉winforms的这个概念。我没有考虑过使用VBA。你说:“你至少会“呆在Excel空间”而不是打很多昂贵的电话,这到底是指什么?”?能否请您详细说明一下?您可能会在代码中创建至少两个额外的Excel实例,这取决于您的计算机,可能会非常慢。看起来,一点常规的excel编码(可能只是一个透视表)可能就是您所需要的——如果不逐行地将代码分开,就有点难说了。但我非常确信,C#解决方案不是将数据从一个Excel电子表格转换到另一个Excel电子表格的方法。假装你只能用Excel来解决这个问题,你会很高兴你这么做的。@Jeremythonpson:这并不是一个完全重复的情况。如果仔细阅读代码,您会注意到需要进行一些修改,以使代码运行得更快。我正在寻找这样的修改。我希望我能使用一些商业图书馆。但是,我希望在不使用任何现有的第三方库的情况下实现这一点。我希望我可以使用一些商业库。但是,我希望在不使用任何现有第三方库的情况下实现这一点。感谢您的回复。这个应用程序将在不同类型的机器上使用,所以即使我使用多线程,它也可能在H/W配置较低的机器上出现问题。不管怎样,它都会提高代码的性能。其次,每次迭代都会加载一个新文件。因此,据我所知,没有这种不必要的I/O操作。如果你能纠正我的错误,我会很高兴的。谢谢你的回复。这个应用程序将在不同类型的机器上使用,所以即使我使用多线程,它也可能在H/W配置较低的机器上出现问题。不管怎样,它都会提高代码的性能。其次,每次迭代都会加载一个新文件。因此,据我所知,没有这种不必要的I/O操作。如果你能纠正我的错误,我会很高兴的。这确实是一个很好的解决办法。我目前正在现有代码上实现。而且,由于限制政策,我不能使用一些第三方库,如OpenXML或SpreadSheetLight。您的观点具体指的是什么:“•在处理过程中关闭Excel更新UI”?在我上面的代码中,我在哪里可以真正使用它呢?希望我的编辑能让第四速度优化更清晰地理解和实现。弹出一个调用,在子例程开始时关闭,在子例程结束时重新打开。谢谢!我明白你的意思了!这确实是一个很好的解决办法。我目前正在现有代码上实现。而且,由于限制政策,我不能使用一些第三方库,如OpenXML或SpreadSheetLight。您的观点具体指的是什么:“•在处理过程中关闭Excel更新UI”?在我上面的代码中,我在哪里可以真正使用它呢?希望我的编辑能让第四速度优化更清晰地理解和实现。弹出一个调用,在子例程开始时关闭,在子例程结束时重新打开。谢谢!我明白你的意思了!
    #region master_tracking_sheet
    public string[] xlsfiles;
    public string[] personList = new string[35];
    public string[,] excelSheet_det = new string[35, 6];
    private void buttonBrowseFolder_Click(object sender, EventArgs e)
    {
        if (folder_browse_excelSheet.ShowDialog() == DialogResult.OK)
        {
            this.txt_DirPath.Text = folder_browse_excelSheet.SelectedPath;
            gotFile = true;
        }

    }
    private void btnCreateMasterSheet_Click(object sender, EventArgs e)
    {
        try
        {
            if (gotFile == false)
            {
                MessageBox.Show("Please select a folder first!");
            }
            else
            {
                var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
                {
                    ".xls",
                    ".xlsx",
                };
                userNotifier = false;
                var baseDir = txt_DirPath.Text;
                var file_count = Directory.EnumerateFiles(baseDir).Count(filename => extensions.Contains(Path.GetExtension(filename)));
                Excel.Application application = new Excel.Application();
                xlsfiles = Directory.GetFiles(folder_browse_excelSheet.SelectedPath, "*.xls");
                for (int j = 1; j <= file_count; j++) //Generating list of persons whose excelSheets are there
                {
                    csvFilePath = System.IO.Path.GetFileNameWithoutExtension(xlsfiles[j - 1]);
                    personList[j - 1] = csvFilePath.ToString();
                }
                bool check_proceed = checkpersonSheetExist(personList);//Check for any missing excelSheet file as per the given person list
                if (check_proceed == false)
                {
                    application.Quit();
                    killApplication(true);
                }
                else
                {
                    for (int i = 1; i <= file_count; i++)
                    {
                        Excel.Workbook temp_wb;
                        excelSheet_det[i - 1, 0] = personList[i - 1].ToString(); //Adding person name as first entry
                        string excelFileName = xlsfiles[i - 1];
                        excelFilePath = excelFileName; //reassigning the excelFilePath to make an entry in excelSheet Log.txt
                        findWordInFile("Non Working", excelFileName); //Calling the method to identify Non-working entry if any
                        //The above method sets flag value to 'y' if true else the flag value remains to 'n'
                        temp_wb = application.Workbooks.Open(excelFileName);
                        Excel.Worksheet worksheet;
                        worksheet = temp_wb.Sheets[1];
                        var cell_val = 0.0;
                        var cell_valA = 0.0;
                        if ((worksheet.Cells[5, 25] as Excel.Range).Value == null || (worksheet.Cells[5, 25] as Excel.Range).Value == 0)
                            cell_val = 0;
                        else
                            cell_val = (double)(worksheet.Cells[5, 25] as Excel.Range).Value;
                        if ((worksheet.Cells[4, 25] as Excel.Range).Value == null || (worksheet.Cells[4, 25] as Excel.Range).Value==0)
                            cell_valA = 0;
                        else
                            cell_valA = (double)(worksheet.Cells[4, 25] as Excel.Range).Value;
                        if (cell_val == 0)
                        {
                            excelSheet_det[i - 1, 1] = cell_valA.ToString(); //Adding Normal Hours
                        }
                        else
                        {
                            excelSheet_det[i - 1, 1] = cell_val.ToString(); //Adding Normal Hours
                        }
                        if (flag == 'y') //if non-working non billable entry found
                        {
                            var cell_val1 = 0.0;
                            if ((worksheet.Cells[14, 25] as Excel.Range).Value == null || (worksheet.Cells[14, 25] as Excel.Range).Value == 0.0)
                                cell_val1 = 0;
                            else
                                cell_val1 = (double)(worksheet.Cells[14, 25] as Excel.Range).Value;
                            excelSheet_det[i - 1, 3] = cell_val1.ToString();//Adding Non-working Hours
                            excelSheet_det[i - 1, 2] = "0"; //Setting working hours to zero
                        }
                        else //if non-working non billable entry NOT found
                        {
                            var cell_val2 = 0.0;
                            if ((worksheet.Cells[14, 25] as Excel.Range).Value == null || (worksheet.Cells[14, 25] as Excel.Range).Value == 0)
                                cell_val2 = 0;
                            else
                                cell_val2 = (double)(worksheet.Cells[14, 25] as Excel.Range).Value;
                            excelSheet_det[i - 1, 2] = cell_val2.ToString();//Adding working Hours
                            excelSheet_det[i - 1, 3] = "0"; //Setting non-working hours to zero
                        }
                        var cell_val3 = 0.0;
                        var cell_val3_1 = 0.0;
                        var cell_val3_2 = 0.0;
                        if ((worksheet.Cells[15, 25] as Excel.Range).Value == null || (worksheet.Cells[15, 25] as Excel.Range).Value == 0)
                            cell_val3 = 0;
                        else
                            cell_val3 = (double)(worksheet.Cells[15, 25] as Excel.Range).Value;
                        if ((worksheet.Cells[13, 25] as Excel.Range).Value == null || (worksheet.Cells[13, 25] as Excel.Range).Value == 0)
                            cell_val3_1 = 0;
                        else
                            cell_val3_1 = (double)(worksheet.Cells[13, 25] as Excel.Range).Value;
                        if ((worksheet.Cells[12, 25] as Excel.Range).Value == null || (worksheet.Cells[12, 25] as Excel.Range).Value == 0)
                            cell_val3_2 = 0;
                        else
                            cell_val3_2 = (double)(worksheet.Cells[12, 25] as Excel.Range).Value;
                        if (cell_val3 == 0 && cell_val3_1 == 0)
                        {
                            excelSheet_det[i - 1, 4] = cell_val3_2.ToString();
                        }
                        else if (cell_val3_1 == 0 && cell_val3_2 == 0)
                        {
                            excelSheet_det[i - 1, 4] = cell_val3.ToString();
                        }
                        else
                        {
                            excelSheet_det[i - 1, 4] = cell_val3_1.ToString();
                        }
                        var cell_val4 = DateTime.MinValue;
                        if ((worksheet.Cells[3, 24] as Excel.Range).Value == null)
                            cell_val4 = DateTime.MinValue;
                        else
                            cell_val4 = (worksheet.Cells[3, 24] as Excel.Range).Value;
                        excelSheet_det[i - 1, 5] = cell_val4.ToString();//copy last date of excelSheet entry
                        Marshal.ReleaseComObject(temp_wb);
                    }
                    application.Workbooks.Close();
                    application.Quit();
                }
                /*Writing the array contents into the excel master sheet*/
                string masterSheetPath = folder_browse_excelSheet.SelectedPath + "\\Master Spreadsheet\\" + "MasterSheet.xls";
                if (!Directory.Exists(folder_browse_excelSheet.SelectedPath +
                     "\\masterSheet"))
                {
                    Directory.CreateDirectory(folder_browse_excelSheet.SelectedPath + "\\Master Spreadsheet");
                }
                if (!File.Exists(masterSheetPath))
                {
                    FileStream fs = File.Create(masterSheetPath);
                    fs.Close();
                }
                Excel.Application excel = new Excel.Application();
                Excel.Workbook workBook = excel.Workbooks.Open(masterSheetPath);
                Excel.Worksheet sheet = workBook.ActiveSheet;
                int numRows = sheet.UsedRange.Rows.Count;
                //MessageBox.Show(numRows.ToString());
                //Check for any duplicate entries in the mastersheet
                string masterDupErrDisplay = string.Empty;
                if (numRows > 1)
                {
                    for (int i1 = 0; i1 < xlsfiles.Length; i1++)
                    {
                        for (int ch = 0; ch < numRows; ch++)
                        {
                            if (excelSheet_det[i1, 5] == (((sheet.Cells[ch + 1, 6] as Excel.Range).Value)).ToString() && excelSheet_det[i1, 0] == ((string)(sheet.Cells[ch + 1, 1] as Excel.Range).Value))
                            {
                                if (!masterDupErrDisplay.Contains(excelSheet_det[i1, 0].ToString()))
                                {
                                    masterDupErrDisplay += string.Join(Environment.NewLine, excelSheet_det[i1, 0].ToString());
                                    masterDupErrDisplay += string.Join(Environment.NewLine, Environment.NewLine);
                                }
                            }

                        }
                    }
                    if (masterDupErrDisplay != null)
                    {
                        if (MessageBox.Show("Duplicate entries have been found for these people " + Environment.NewLine + masterDupErrDisplay + Environment.NewLine + "Do you wish to Continue?", "Duplicate Mastersheet entry Error", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            excel.Quit();
                            killApplication(true);
                        }
                    }
                }
                sheet.Cells[1, 1] = "Name";
                sheet.Cells[1, 2] = "Normal Hours";
                sheet.Cells[1, 3] = "Working Hours";
                sheet.Cells[1, 4] = "Not working Hours";
                sheet.Cells[1, 5] = "Total Hours";
                sheet.Cells[1, 6] = "excelSheet Stamp";
                for (int i = 0; i < xlsfiles.Length; i++)
                {
                    sheet.Cells[numRows + 1 + i, 1] = excelSheet_det[i, 0];
                    sheet.Cells[numRows + 1 + i, 2] = excelSheet_det[i, 1];
                    sheet.Cells[numRows + 1 + i, 3] = excelSheet_det[i, 2];
                    sheet.Cells[numRows + 1 + i, 4] = excelSheet_det[i, 3];
                    sheet.Cells[numRows + 1 + i, 5] = excelSheet_det[i, 4];
                    sheet.Cells[numRows + 1 + i, 6] = excelSheet_det[i, 5];
                }
                workBook.RefreshAll();
                excel.Calculate();
                workBook.Save();
                workBook.Close(true);
                excel.Workbooks.Close();
                excel.Quit();
                application.Quit();
                MessageBox.Show("Master track sheet is successfully updated!", "Process Successful");
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    #endregion master_tracking_sheet
    public bool checkpersonSheetExist(string[] assocName)
    {
        try
        {
            string[,] personListSupply = new string[35, 2];
            int counter = 0;
            string errorDisplay = string.Empty;
            string line;
            // Read the file and display it line by line.
            System.IO.StreamReader file = new System.IO.StreamReader(folder_browse_excelSheet.SelectedPath + "\\team_members.txt");
            while ((line = file.ReadLine()) != null)
            {
                personListSupply[counter, 0] = line.ToString();
                personListSupply[counter, 1] = "n";
                counter++;
            }
            file.Close();
            int c = 0;
            while (assocName[c] != null)
            {
                c++;
            }
            for (int i = 0; i < counter; i++)
            {
                for (int k = 0; k < c; k++)
                {
                    if (personListSupply[i, 0] == assocName[k])
                    {
                        personListSupply[i, 1] = "y";
                        continue;
                    }

                }
                if (personListSupply[i, 1] == "n")
                {
                    errorDisplay += string.Join(Environment.NewLine, personListSupply[i, 0].ToString());
                    errorDisplay += string.Join(Environment.NewLine, Environment.NewLine);

                }
            }
            if (MessageBox.Show("The excel files are missing for" + Environment.NewLine + errorDisplay + Environment.NewLine + "Do you wish to Continue?", "File Missing Error", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }
private static XlCalculation xlCalculation = XlCalculation.xlCalculationAutomatic;
static public void TurnOffApplicationSettings(Excel.Application xlApp)
{
    xlApp.ScreenUpdating = false;
    xlApp.DisplayAlerts = false;
    xlCalculation = xlApp.Calculation; //Record the current Calculation Mode
    xlApp.Calculation = XlCalculation.xlCalculationManual;
    xlApp.UserControl = false;
    xlApp.EnableEvents = false;
}
static public void TurnOnApplicationSettings(Excel.Application xlApp)
{
    xlApp.ScreenUpdating = true;
    xlApp.DisplayAlerts = true;
    xlApp.Calculation = xlCalculation;
    xlApp.UserControl = true;
    xlApp.EnableEvents = true;
}