Преобразование кода VB в код C# для разделения объединенных ячеек и заполнения одинаковым значением ячеек объединенной области

Я хотел бы попросить, чтобы вы могли оказать помощь,

Я попытался преобразовать код VB в C#, чтобы код работал так же. Цель кода — разъединить объединенные ячейки и заполнить объединенную область одним и тем же значением.
Код VB работал, как я и ожидал, но преобразованный код C# не работает.
Код C# заполняет первую ячейку области ячеек значением, а остальные ячейки пусты, НЕ заполняются предыдущим значением.

Я думаю, мне нужно что-то изменить в коде С#. Не могли бы вы посоветовать мне, что мне нужно пересмотреть?
Я предполагаю, что эта часть нуждается в дополнительных изменениях в приведенных ниже кодах C#.

Заранее спасибо,

(код VB) работал правильно

For Each Rng In excelcells
    If Rng.MergeCells Then
        With Rng.MergeArea
            .UnMerge
            .Formula = Rng.Formula
        End With
    End If
Next

=>
(код С#) не работает

foreach (Excel.Range Rng in excelcells)
{
    if (Rng.MergeCells)
    {
        Rng.MergeArea.UnMerge();
        Rng.MergeArea.Formula = Rng.Formula; 
    }
}

Полный код ссылки:

(код ВБ)

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.IO

Public Class Form1
Dim ExcelApp As Excel.Application = Nothing
Dim wb As Excel.Workbook = Nothing
Dim ws As Excel.Worksheet = Nothing
Dim rngAll As Range, xCell As Range
Dim excelcells As Excel.Range

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     'Excel Write
     Try
         ExcelApp = New Excel.Application()
         wb = ExcelApp.Workbooks.Open("D:\test.xlsx")
         ws = CType(wb.Worksheets("GLOBAL ENDC"), Excel.Worksheet)
         ws.Activate()
         excelcells = ws.UsedRange
         'Set WorkRng = Application.Selection
         'Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
     
     
         ExcelApp.ScreenUpdating = False
         ExcelApp.DisplayAlerts = False
         For Each Rng In excelcells
             If Rng.MergeCells Then
                 With Rng.MergeArea
                     .UnMerge
                     .Formula = Rng.Formula
                 End With
             End If
         Next
         ExcelApp.DisplayAlerts = True
         ExcelApp.ScreenUpdating = True
         ..
         wb.SaveAs("D:\test_unmerged.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, True, False,
                                XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing)
         wb.Saved = True
         wb.Close(False, Excel.XlFileFormat.xlWorkbookNormal)
         ExcelApp.Quit()
     
     Catch ex As Exception
         ReleaseObject(ws)
         ReleaseObject(wb)
         ReleaseObject(ExcelApp)
         GC.Collect()
     Finally
         ReleaseObject(ws)
         ReleaseObject(wb)
         ReleaseObject(ExcelApp)
         GC.Collect()
     End Try
End Sub

Private Sub ReleaseObject(ByVal obj As Object)
     Try
         If Not obj Is Nothing Then
             Runtime.InteropServices.Marshal.ReleaseComObject(obj)
             obj = Nothing
         End If
     Catch
         obj = Nothing
     Finally
         GC.Collect()
     End Try
End Sub

(код С#)

private void UnmergeCell()
{
    //Instantiate the application object
    Excel.Application excelapp = new Excel.Application();
    excelapp.Visible = false;

    string fullPath = @"D:\test.xlsx";

    //Open the Excel file

    Excel.Workbook excelappworkbook = excelapp.Workbooks.Open(
        fullPath,
        Type.Missing, Type.Missing, true, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing);

    Excel.Worksheet excelworksheet = (Excel.Worksheet)excelappworkbook.Worksheets.get_Item("Sheet01");
    Excel.Range excelcells = excelworksheet.UsedRange;

    excelapp.ScreenUpdating = false;
    excelapp.DisplayAlerts = false;
    foreach (Excel.Range Rng in excelcells)
    {
        if (Rng.MergeCells)
        {
            Rng.MergeArea.UnMerge();
            Rng.MergeArea.Formula = Rng.Formula; 
        }
    }
    excelapp.DisplayAlerts = true;
    excelapp.ScreenUpdating = true;

    excelappworkbook.SaveAs(@"D:\test_unmerged.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false,
                           XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);

    //Quit the application
    excelappworkbook.Close(false, Type.Missing, Type.Missing);
    excelapp.Quit();
   finally
    {
        // Clean up
        ReleaseExcelObject(ws);
        ReleaseExcelObject(wb);
        ReleaseExcelObject(excelApp);
    }
}

private static void ReleaseExcelObject(object obj)
{
    try
    {
        if (obj != null)
        {
            Marshal.ReleaseComObject(obj);
            obj = null;
        }
    }
    catch (Exception ex)
    {
        obj = null;
        throw ex;
    }
    finally
    {
        GC.Collect();
    }
}

Вы отлаживали и входили в код, чтобы увидеть, что он там делает на самом деле?

Dan Csharpster 20.12.2020 15:03

Предложение With фиксирует значение своего аргумента, когда вы его вводите. Таким образом, With Rng.MergeArea запоминает MergeArea до разъединения, тогда как в C# вы повторно запрашиваете Rng.MergeArea после разъединения, после чего оно изменилось.

GSerg 20.12.2020 15:12

Что касается вашего void ReleaseExcelObject, см. stackoverflow.com/a/25135685/11683.

GSerg 20.12.2020 15:13

@GSerg спасибо за совет. вы указали, что я испортил, а также спасибо за полезную ссылку о ReleaseExcelObeject, вы имеете в виду, что текущий ReleaseExcelObject устранит любую проблему?

smartrobby 26.12.2020 06:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
283
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Можете ли вы попробовать это и посмотреть, работает ли это преобразование лучше для вас?

            foreach (var Rng in excelcells)
            {
                if (Rng.MergeCells)
                {
                    {
                        var withBlock = Rng.MergeArea;
                        withBlock.UnMerge();
                        withBlock.Formula = Rng.Formula;
                    }
                }
            }

К вашему сведению, это конвертер, который я использовал.

Большое спасибо, я ценю это. ваш код работал так, как я ожидал.

smartrobby 26.12.2020 06:20

Другие вопросы по теме