Я хотел бы попросить, чтобы вы могли оказать помощь,
Я попытался преобразовать код 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();
}
}
Предложение With
фиксирует значение своего аргумента, когда вы его вводите. Таким образом, With Rng.MergeArea
запоминает MergeArea
до разъединения, тогда как в C# вы повторно запрашиваете Rng.MergeArea
после разъединения, после чего оно изменилось.
Что касается вашего void ReleaseExcelObject
, см. stackoverflow.com/a/25135685/11683.
@GSerg спасибо за совет. вы указали, что я испортил, а также спасибо за полезную ссылку о ReleaseExcelObeject, вы имеете в виду, что текущий ReleaseExcelObject устранит любую проблему?
Можете ли вы попробовать это и посмотреть, работает ли это преобразование лучше для вас?
foreach (var Rng in excelcells)
{
if (Rng.MergeCells)
{
{
var withBlock = Rng.MergeArea;
withBlock.UnMerge();
withBlock.Formula = Rng.Formula;
}
}
}
К вашему сведению, это конвертер, который я использовал.
Большое спасибо, я ценю это. ваш код работал так, как я ожидал.
Вы отлаживали и входили в код, чтобы увидеть, что он там делает на самом деле?