краткое или простое решение для размещения значений от метки до столбца в excel

У меня есть код здесь, который подсчитывает количество фруктов из столбца B в столбце AF (31 день). Я использовал switch с случаями от 1 до 31. Я бы хотел, чтобы мой код был проще. 31 case достаточно длинный.

 private void button1_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application OfficeExcel;
        Microsoft.Office.Interop.Excel._Workbook OfficeWorkBook;
        Microsoft.Office.Interop.Excel._Worksheet OfficeSheet;

        var dtpMonth = dateTimePicker1.Value.ToString("MMMM");
        var dtpYear = dateTimePicker1.Value.Year;
        var MonthYear = dtpMonth + " - " + dtpYear;
        var dtpDay = dateTimePicker1.Value.Day;
        try
        {
            OfficeExcel = new Microsoft.Office.Interop.Excel.Application();
            OfficeExcel.Visible = true;

            int appletotal = Convert.ToInt32(lblappletotal.Text);
            int bananatotal = Convert.ToInt32(lblbananatotal.Text);
            int orangetotal = Convert.ToInt32(lblorangetotal.Text);
            int grapestotal = Convert.ToInt32(lblgrapestotal.Text);

            switch (dateTimePicker1.Value.Day.ToString())
            { 
                case "1":
                     OfficeWorkBook = (Microsoft.Office.Interop.Excel._Workbook)(OfficeExcel.Workbooks.Add(""));
                     OfficeSheet = (Microsoft.Office.Interop.Excel._Worksheet)OfficeWorkBook.ActiveSheet;

                    OfficeSheet.Cells[3,1] = "apple";
                    OfficeSheet.Cells[4,1] = "banana";
                    OfficeSheet.Cells[5,1] = "orange";
                    OfficeSheet.Cells[6,1] = "grapes";

                    OfficeSheet.Cells[2, 2] = dtpDay + dtpMonth ;
                    OfficeSheet.Cells[3, 2] = appletotal; // variable
                    OfficeSheet.Cells[4, 2] = bananatotal;
                    OfficeSheet.Cells[5, 2] = orangetotal;
                    OfficeSheet.Cells[6, 2] = grapestotal;

                    OfficeExcel.Visible = true;



                    OfficeWorkBook.SaveAs("D:\\fruits\\" + MonthYear + ".xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, Type.Missing, Type.Missing,
                                    false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                                    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


                     break;


                case "2":
                    OfficeWorkBook = OfficeExcel.Workbooks.Open("D:\\fruits\\" + MonthYear + ".xls");
                    OfficeSheet = (Excel.Worksheet)OfficeWorkBook.Worksheets.get_Item(1);

                    OfficeSheet.Cells[2, 3] = dtpDay + dtpMonth;
                    OfficeSheet.Cells[3, 3] = appletotal;
                    OfficeSheet.Cells[4, 3] = bananatotal;
                    OfficeSheet.Cells[5, 3] = orangetotal;
                    OfficeSheet.Cells[6, 3] = grapestotal;

                    OfficeExcel.Visible = true;
                    OfficeWorkBook.Save();


                    case "3":
                    OfficeWorkBook = OfficeExcel.Workbooks.Open("D:\\fruits\\" + MonthYear + ".xls");
                    OfficeSheet = (Excel.Worksheet)OfficeWorkBook.Worksheets.get_Item(1);

                    OfficeSheet.Cells[2, 4] = dtpDay + dtpMonth;
                    OfficeSheet.Cells[3, 4] = appletotal;
                    OfficeSheet.Cells[4, 4] = bananatotal;
                    OfficeSheet.Cells[5, 4] = orangetotal;
                    OfficeSheet.Cells[6, 4] = grapestotal;

                    OfficeExcel.Visible = true;
                    OfficeWorkBook.Save();

                    break;
                case "4":
                    OfficeWorkBook = OfficeExcel.Workbooks.Open("D:\\fruits\\" + MonthYear + ".xls");
                    OfficeSheet = (Excel.Worksheet)OfficeWorkBook.Worksheets.get_Item(1);

                    OfficeSheet.Cells[2, 5] = dtpDay + dtpMonth;
                    OfficeSheet.Cells[3, 5] = appletotal;
                    OfficeSheet.Cells[4, 5] = bananatotal;
                    OfficeSheet.Cells[5, 5] = orangetotal;
                    OfficeSheet.Cells[6, 5] = grapestotal;

                    OfficeExcel.Visible = true;
                    OfficeWorkBook.Save();

                    break;
                    .
                    .
                    .
                    so On.....
    }
8 голосов | спросил jLaw 18 FriEurope/Moscow2015-12-18T16:41:21+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2015 16:41:21 +0300 2015, 16:41:21

2 ответа


8
private void button1_Click(object sender, EventArgs e)

У вас есть имя управления пользовательским интерфейсом button1. Это нехорошее имя, потому что вы не можете понять (в коде), какова его цель. Использовать значащее имя . То же самое справедливо и для dateTimePicker1.

int appletotal = Convert.ToInt32(lblappletotal.Text);

Прежде всего, вы должны использовать оболочку proper для своих переменных. В C # обычно для локальных переменных используется camelCase. Используйте его последовательно: appleTotal и officeExcel.

Более того OfficeExcel, OfficeWorkbook и так не являются описательными именами. Если вы сохраняете свою функцию маленькой, вам не нужно больше excel, workbook, activeWorksheet и т. д. (что вы talk ) о Microsoft Office объекты очевидны).

Microsoft.Office.Interop.Excel.Application OfficeExcel;
...
OfficeExcel = new Microsoft.Office.Interop.Excel.Application();

Это C #, вам не нужно объявлять свои переменные в самом начале вашего метода. Объявите их как можно позже (идеально вместе с их инициализацией):

var workbook = (Microsoft.Office.Interop.Excel._Workbook)(excel.Workbooks.Add(""));

COM-объекты должны (должны?) быть удалены, они не реализуют IDisposable, тогда вы должны использовать Marshal.FinalReleaseComObject(excel) (также для других объектов). См. Также Как выпустить дескриптор COM в .NET .

int appletotal = Convert.ToInt32(lblappletotal.Text);

Вы не выполняете проверку ошибок, пользователь может ввести недопустимую строку, и ваше приложение просто сработает.

int apples;
if (!Int32.TryParse(lblApples.Text, out apples)) {
    // Invalid input. Also check other TryParse overloads.
}
"D:\\fruits\\" + MonthYear + ".xls" ...

Прежде всего, не нужно указывать константы жесткого кода! Вам не понадобится экономить место в любом другом месте? Даже если это написано на камне, используйте поле const для этого:

private const string OutputFolderPath = @"d:\fruits";

Тогда вы никогда не должны составлять пути вручную:

string outputFilePath = Path.Combine(OutputFolderPath, monthAndYear + ".xls");

Вы также можете дать ему некоторое достоинство и создать ResolveOutputFileName().

OfficeSheet.Cells[2, 5] = dtpDay + dtpMonth;
OfficeSheet.Cells[3, 5] = appletotal;
OfficeSheet.Cells[4, 5] = bananatotal;
OfficeSheet.Cells[5, 5] = orangetotal;
OfficeSheet.Cells[6, 5] = grapestotal;

Этот блок кода повторяется в каждом case. Реорганизуйте его в отдельный метод (также используя вычисления для этих переменных) ExportEatenFruitInRow(int row, ...) (выберите лучшее и более содержательное имя).

switch (dateTimePicker1.Value.Day.ToString())

Вам не нужно преобразовывать в строку для сравнения:

switch (dateTimePicker1.Value.Day) {
    case 1:
    ...
}

Однако вы используете dateTimePicker1.Value.Day просто как смещение для метода, который вы реорганизовали только сейчас. Вы должны просто удалить целые switch /case вызов этого метода:

ExportEatenFruitInRow(dateTimePicker1.Value.Day + 1, ...);
ответил Adriano Repetti 18 FriEurope/Moscow2015-12-18T17:24:34+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2015 17:24:34 +0300 2015, 17:24:34
4

Сделайте себе одолжение и добавьте эту строку вверху файла кода:

using Microsoft.Office.Interop.Excel;

Теперь эти локали:

Microsoft.Office.Interop.Excel.Application OfficeExcel;
Microsoft.Office.Interop.Excel._Workbook OfficeWorkBook;
Microsoft.Office.Interop.Excel._Worksheet OfficeSheet;

Может быть объявлено следующим образом:

    Application OfficeExcel;
    _Workbook OfficeWorkBook;
    _Worksheet OfficeSheet;

Гораздо менее раздражает, не так ли? Теперь _Workbook и _Worksheet не чувствую себя очень естественным - см. этот ответ на переполнение стека о различиях между _Worksheet и Worksheet, но длинный рассказ, я бы объявил их следующим образом:

    Application excelApp;
    Workbook workbook;
    Worksheet worksheet;

Установленное соглашение об именах для локальных переменных заключается в использовании camelCase: обратите внимание, что синтаксис синтаксиса Stack Exchange больше не смущает их для имен классов ! Вам также не нужно префикс «Office», кроме того, что префикс «Workbook» с «Office» неверен, поскольку «рабочая книга» является объектом Excel, Office ничего не знает о книгах и рабочих листах.

ответил Mathieu Guindon 18 FriEurope/Moscow2015-12-18T18:52:00+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2015 18:52:00 +0300 2015, 18:52:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132