none
VB2010+Excel2010 RRS feed

  • Вопрос

  • Гул ивнинг джентельменс!

    Пишу программу, которая выполняет некий расчет, запускает Excel, создает новую книгу и выплевывает в нее данные. Все бы хорошо, только вот решил немного улучшить программу и добавил код для объединения ячеек, чтобы таблица смотрелась удобнее:

    If Order = True Then
        a_ExcelWS.Cells(i * 2 + 5, q_ColNum2).Value = q_Value
        q_cell01 = a_ExcelWS.Cells(i * 2 + 4, q_ColNum2)
        q_cell02 = a_ExcelWS.Cells(i * 2 + 5, q_ColNum2)
        a_ExcelWS.Range(q_cell01, q_cell02).Merge()
    Else
        a_ExcelWS.Cells(i + 5, q_ColNum2).Value = q_Value
    End If
    

    Во первом варианте (Order = True), с объединением ячеек, код выполняется во много (18,5) раз дольше, хотя добавилась всего одна команда Excel. Неужели процесс объединения ячеек занимает так много времени? Или я опять накасячил?

     

    8 сентября 2011 г. 17:33

Все ответы

  • Попробуйте воспользоваться методом get_Range для выбора ячеек, котороые нужно объединить. Посмотрите как пример этот топик - c# + Excel + Merge или Merge Cell in Excel 2007 in C# 2008


    Для связи [mail]
    9 сентября 2011 г. 9:37
  • Попробуйте воспользоваться методом get_Range для выбора ячеек, котороые нужно объединить. Посмотрите как пример этот топик - c# + Excel + Merge или Merge Cell in Excel 2007 in C# 2008


    Для связи [mail]
    Странно, но у меня в Excel 2010 нет метода "get_Range", есть только "Range"... т.е. как и было у меня изначально.
    9 сентября 2011 г. 15:38
  • Да, действительно в vb.net нужно использовать Range.

    Вы точно уверены что именно объединение тормозит выполняется так долго? Какие данные у вас в объединяемых ячейках? Просто текст или какие-нибудь формулы или еще чего-нибудь тяжелое?

    Вот пример объединения 100 ячеек, работает 300-400 миллисекунд, попробуйте у себя:

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim application As Application = New Application
            Dim workbook As Workbook = application.Workbooks.Add()
            Dim sheet As Worksheet = workbook.Sheets(1)
            application.DisplayAlerts = False
    
            Dim sw As Stopwatch = Stopwatch.StartNew()
            For index = 1 To 100 Step 3
                sheet.Cells(index, 1).Value = index
                sheet.Range(sheet.Cells(index, 1), sheet.Cells(index + 1, 1)).Merge()
            Next
            sw.Stop()
            Console.WriteLine(sw.ElapsedMilliseconds)
            application.Visible = True
        End Sub
    


    Для связи [mail]
    12 сентября 2011 г. 13:13
  • Уверен. Разница только в объединение ячеек, все остальное абсолютно одинаково. В ячейках содержатся исключительно числа.

    Есть еще один нюанс, о котором я не сказал, так как не придал ему значения, а сейчас думаю, что именно он и виноват... Все это чудо у меня запускается из программы AutoCAD...

    13 сентября 2011 г. 8:14
  • ИМХО. Автокад сдесь не причем.

    Попробуйте отладить вызов обеих вариантов и под отладчиком проверить скорость выполнения метода "Мердж". Либо как Дмитрий указал непосредственно перед вызовом слияния, вставьте переменную типа Stopwatch и посмотрите как он влияет на производительность.

    И напоследок, вполне вероятно, если у вас замудреный цикл и большое количество данных.


    Andrew Babukov
    • Изменено Andrew VIR 16 сентября 2011 г. 9:13 Add some text
    16 сентября 2011 г. 9:11
  • Я уже замерял время. Тут не имеет значение замудренный цикл или нет. Один и тот же цикл выполняется почти в 20 раз дольше, если просто добавить объединение ячеек.
    16 сентября 2011 г. 16:37
  • Вы пробовали замерять время на разных компьютерах, результат один? Другого метода объединения ячеек скорее всего нет. Можно еще попробовать формировать макрос в екселе, а потом его выполнять. Незнаю на сколько это будет лучше, и на сколько возможно, но попробуйте посмотреть в эту сторону, например.


    Для связи [mail]
    17 сентября 2011 г. 6:27
  • Нет - замерял пока только на своем, других нет... буду пробовать на виртуальных.

    А вот по поводу макроса надо подумать, как реализовать.

    18 сентября 2011 г. 7:10