Excel替换值而不会丢失格式

时间:2009-12-11 14:09:42

标签: c# .net excel office-interop

我有一个使用Office Automation自动化Microsoft Excel(2003)的应用程序。它所做的一件事就是取代价值观。 我得到的问题是,当替换值时,所有丰富的格式都会丢失,如下所述: http://support.microsoft.com/kb/177194

为了澄清,我在一个单元格中用valueY替换valueX,如下所示:
valueX 很好

这导致:
valueY很棒


我尝试在替换前在单元格中获取格式,因此我可以保存哪些字符为粗体,并在替换值后应用格式。但我找不到一种方法来获取每个角色的格式。 (C#)

有没有办法解决这个问题,而不使用上面网站上的分辨率?在C#中或Excel中的一些解决方法

1 个答案:

答案 0 :(得分:3)

在您的问题中,您提到您无法弄清楚如何获取C#中每个字符的格式,但您可以在Excel中使用变通方法。我不确定Excel中的哪些对象通过interop暴露给C#,但也许我告诉你在VBA中可以做些什么将会有所帮助。

我将在答案中提供三个部分:

  1. 如何使用VBA在Excel中查找字符格式。
  2. 重置替换单元格内容格式的复杂性。
  3. 在之前/之后的情况下在Excel中使用VBA的可能方法。

  4. 如何使用VBA在Excel中查找字符格式

    通过Range.Characters.Font对象公开给定角色的格式。让我们来看看。想象一下,在Excel工作表的A1中的单元格Sheet1中有以下内容:

      

    特的 ST 荷兰国际集团

    从示例中可以看出第3个和第4个字符是粗体。我们如何找到这些字符的属性和其他字体属性?这是一个VBA函数,演示了您可以通过Range.CharactersRange.Characters.Font公开的一些属性:

    Sub IterateCharacters()
    Dim rng As Range
    Dim lngLen As Long
    Dim lngCount As Long
    Dim chr As Characters
    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
    lngCount = 1
    lngLen = Len(rng.Value)
    
    Debug.Print "Count", "Text", "Font", "Color", "Size", "Bold"    
    
    Do While lngCount <= lngLen
        Set chr = rng.Characters(lngCount, 1)
        Debug.Print lngCount, chr.Text, chr.Font.Name, chr.Font.Color, chr.Font.Size, chr.Font.Bold
        lngCount = lngCount + 1
    Loop
    
    End Sub
    

    上面的代码将产生以下输出:

    Count         Text          Font          Color         Size          Bold
     1            T             Arial          0             10           False
     2            e             Arial          0             10           False
     3            s             Arial          0             10           True
     4            t             Arial          0             10           True
     5            i             Arial          0             10           False
     6            n             Arial          0             10           False
    

    重置替换单元格内容格式的复杂性

    我认为这个问题的棘手部分实际上并不是找到每个角色的格式(当然,假设在你的情况下甚至可能)。困难的部分将是“记住”每个字符的格式,并在替换文本后重新应用格式。

    在最简单的情况下,替换字符串的长度始终与目标字符串的长度相同。如果将valueX简单地替换为valueY,并且它始终具有相同的长度,则保留格式非常简单。只需在运行replace方法之前获取格式,然后使用与之前完全相同的设置为每个字符重新应用格式。

    如果要替换单元格中的一个可能值,则稍微困难一些。在这种情况下,您需要通过替换格式和目标字符串之间的长度差异来抵消替换格式,并且只有替换后的字符串之后才会这样做。

    在最丑陋的场景中,你有n个字符串将被替换,在这种情况下,当你解析字符以应用格式时,你必须使用n * difference之类的内容来完成更换。

    我确信这项任务有更好的算法,但也许最适合单独的SO问题。


    在之前/之后的情况下在Excel中使用VBA的可能方法

    理想情况下,您将找到直接从C#访问必要对象的方法,这样您就不必处理VBA代码和Excel。但你可能没那么幸运。

    如果你必须在Excel中进行格式化,这可以采用一种方式。

    1. 将Excel工作表设置为3张:OriginalCopyReplacedValues
    2. 在运行C#代码之前,请确保CopyOriginal重复。
    3. 运行C#代码以替换单元格内容时,请在ReplacedValues工作表中粘贴替换字符串的值。我推荐一些简单的地方,你的范围地址(例如B2)在A栏中,原始值在B栏中,替换值在C栏中。
    4. 运行C#代码后,编写一个方法,遍历ReplacedValues中列出的所有范围。
    5. 对于每个范围,您将能够在Copy中引用原始值(可能我的命名方案有点令人困惑)以及Original中的更新值。
    6. 查找Copy中原始格式的内容。使用字符串长度的差异来偏移并将格式应用到原始格式(这是您可以编写一些奇特的代码解析器来完成所有这些工作的地方)。
    7. 可能有比上述过程更好的方法,但我认为这样可以很好地工作。