【问题标题】:C# Excel Format the color of multiple cellsC# Excel 格式化多个单元格的颜色
【发布时间】:2016-04-01 00:10:01
【问题描述】:

您好,我尝试用不同颜色格式化多个单元格。因此,当列表中有多个对象时,范围会发生变化。

这是我的代码:

        public void writeExcelFile(SPpowerPlant powerPlant, string sqlServer, string database)
        {

            //Path to template
            String tenplate = @"C:\Users\AAN\Documents\Visual Studio 2015\Projects\PowerPlants\Powerplants\bin\Debug\PROJEKTSTATUS_GESAMT_neues_Layout_template.xlsm";

            //open Excel (programm)
            Excel.Application excelApplication = new Excel.Application();

#if DEBUG
            excelApplication.Visible = true;
            excelApplication.DisplayAlerts = true;
#else
                excelApplication.Visible = false; 
                excelApplication.DisplayAlerts = false;
#endif

            //Open a Excel File
            Excel.Workbook excelWorkbook = excelApplication.Workbooks.Add(tenplate);
            Excel._Worksheet excelSheet = excelWorkbook.ActiveSheet;
            SPpowerPlantList powerPlantList = loadProjectsAndComponentsFromSqlServer(sqlServer, database, Convert.ToDateTime(powerPlant.timestamp), powerPlant.note);

            //Lists for the Excel Sheet
            List<String> projectName = new List<String>();  //1
            List<String> phase = new List<String>();        //2
            List<String> countryshort = new List<String>(); //3
            List<double> projectShareWeb = new List<double>();  //4
            List<double> mwWeb = new List<double>();        //5
            List<double> projectProgress = new List<double>();  //6
            List<double> mwDeveloped = new List<double>();  //7
            List<double> yearlyYieldOfWholeProject = new List<double>();    //8
            List<double> capexWholeProject = new List<double>();    //9
            List<double> equityAmount = new List<double>(); //10
            List<double> equityIrr = new List<double>();    //11
            List<String> cod = new List<String>();      //12
            List<String> projectmanager = new List<string>();   //13   
            List<String> changes = new List<string>();  //14
            List<String> technology = new List<string>();   //15
            List<String> countrylong = new List<string>();  //16
            List<String> state = new List<string>();    //17

            //to get the values into the lists from a powerplant
            foreach (SPpowerPlant powerPlantItem in powerPlantList)
            {

                if (powerPlantItem.phase == "Phase 6")
                {
                    ////Format the Header row to make it Bold and blue
                    excelSheet.get_Range("B4", "O4").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
                    //excelSheet.get_Range("A1", "B1").Font.Bold = true;
                }

                projectName.Add(powerPlantItem.projectName); //1
                phase.Add(powerPlantItem.phase);    //2
                countryshort.Add(powerPlantItem.country);   //3
                projectShareWeb.Add(powerPlantItem.projectShareWeb);    //4
                mwWeb.Add(powerPlantItem.mwWeb);    //5
                projectProgress.Add(powerPlantItem.projectProgress);    //6
                mwDeveloped.Add(powerPlantItem.mwDeveloped);    //7
                foreach (SPeconomicIndicator economicIndicatoritem in powerPlantItem.economicIndicators)
                {
                    yearlyYieldOfWholeProject.Add(economicIndicatoritem.yearlyYieldOfWholeProject); //8
                    capexWholeProject.Add(economicIndicatoritem.capexWholeProject); //9
                    equityAmount.Add(economicIndicatoritem.equityAmount);   //10
                    equityIrr.Add(economicIndicatoritem.equityIrr); //11
                }
                cod.Add(powerPlantItem.cod.Value.Year.ToString()); //12
                projectmanager.Add(powerPlantItem.projectManager); //13
                changes.Add("???"); //14
                technology.Add(powerPlantItem.technology); //15
                countrylong.Add(powerPlantItem.country); //16
                state.Add(powerPlantItem.state); //17

            }

            //adding it to the excel sheet
            int i = 0;
            for (i = 0; i < powerPlantList.Count; i++)
            {

                excelSheet.Cells[i + 4, 2] = projectName[i]; //1
                excelSheet.Cells[i + 4, 3] = phase[i];  //2
                excelSheet.Cells[i + 4, 4] = countryshort[i];   //3
                excelSheet.Cells[i + 4, 5] = projectShareWeb[i];    //4
                excelSheet.Cells[i + 4, 6] = mwWeb[i];  //5
                excelSheet.Cells[i + 4, 7] = projectProgress[i];    //6
                excelSheet.Cells[i + 4, 8] = mwDeveloped[i]; //7
                excelSheet.Cells[i + 4, 9] = yearlyYieldOfWholeProject[i]; //8
                excelSheet.Cells[i + 4, 10] = capexWholeProject[i]; //9
                excelSheet.Cells[i + 4, 11] = equityAmount[i]; //10
                excelSheet.Cells[i + 4, 12] = equityIrr[i]; //11
                excelSheet.Cells[i + 4, 13] = cod[i]; //12
                excelSheet.Cells[i + 4, 14] = projectmanager[i]; //13
                excelSheet.Cells[i + 4, 15] = changes[i]; //14;
                excelSheet.Cells[i + 4, 16] = technology[i]; //15
                excelSheet.Cells[i + 4, 17] = countrylong[i]; //16
                excelSheet.Cells[i + 4, 18] = state[i]; //17

            }

            //Save the excel workbook under a different name
            excelWorkbook.SaveAs(@"C:\Users\AAN\Documents\Visual Studio 2015\Projects\PowerPlants\Powerplants\bin\Debug\PROJEKTSTATUS_GESAMT_neues_Layout.xlsm", Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

            excelApplication.Quit();

        }

当我在单一范围内尝试它时,它可以正常工作,但是当有多个对象时,只有在行上的第 6 阶段才会获得新颜色。那么我怎样才能动态更改行呢?那么第 6 阶段的每个值都会得到我想要的格式?

所以任何帮助都会很棒,感谢您的宝贵时间。

【问题讨论】:

    标签: c# excel office-interop


    【解决方案1】:

    您的代码很长,其中大部分与您的问题无关。最好将相关问题提取为通用代码示例,以便其他人可以将代码复制到他们的机器中,然后尝试调试它。

    主要问题是您没有为任何地方的单元格范围分配颜色,除非最初在分配范围 B4:O4 时。因此,每次遇到第 6 阶段时,都会为相同的范围分配颜色,而不是您要填充的行。

    您可以尝试一些变体(虽然它有点笨拙,并且可能与您正在寻找的确切范围不对应):

        List<string> powerPlantList = new List<string>
        {
            "test",
            "blah",
            "phase 6",
            "foo",
            "bar",
            "phase 6"
        };
    
        Microsoft.Office.Interop.Excel.Application Excel = new Microsoft.Office.Interop.Excel.Application();
        Excel.Visible = true;
        Workbook wkbk = Excel.Workbooks.Add();
        Worksheet sheet = wkbk.ActiveSheet;
    
    
        int initialRow = 4;
        for (int i = 0; i < powerPlantList.Count; i++)
        {
            string s = powerPlantList[i];
            string row = (i+ initialRow).ToString();
            if (s.Equals("phase 6"))
            {
                sheet.get_Range("B" + row, "O"+row).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
            // This is where you assign the color to the current row range
    
            }
            sheet.Cells[i + initialRow, 4] = s;
    
        }
    

    您解析每个 powerPlantItem 的方法似乎过于复杂。最好只列出SPowerPlant 类型的列表,然后循环遍历每个 powerPlant 以直接填充工作表。您可能不需要创建一系列列表来存储每个 powerPlant 的属性。

    【讨论】:

    • 感谢您的回答,这真的很棒,我在 SPowerPlant 上尝试过,但没有让我工作,但这并不重要,因为我尝试使用 excel 在 c# 中变得更好。所以这还不错,因为在我的工作场所他们永远不会看到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2015-01-01
    • 2013-06-10
    相关资源
    最近更新 更多