Преобразование кода 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
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

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