Excelreplace值,而不会丢失格式

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

为了澄清,我用下面的单元格中的valueYreplacevalueX:
valueX是伟大的

这导致:
价值是伟大的


更换之前 ,我尝试在单元格中获取格式,所以我可以保存哪些字符是粗体,并replace值应用格式。 但我找不到一种方法来获取每个字符的格式。 (C#)

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

在你的问题中,你提到你不知道如何获取C#中每个字符的格式,但是你可能能够在Excel中使用一个解决方法。 我不确定Excel中的哪些对象是通过interop暴露给C#的,但是也许我会告诉你在VBA中可以做些什么会有一些帮助。

我将提供三个部分给我的答案:

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

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

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

devise

您可以从示例中看到第3个和第4个字符是粗体。 我们怎样才能find这些字符的属性和其他字体属性? 这是一个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 

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

计数文本字体颜色大小粗体
  1 T Arial 0 10错误
  2 e Arial 0 10错误
  3 s Arial 0 10正确
  4 t Arial 0 10正确
  5我Arial 0 10假
  6 n Arial 0 10错误

重置被replace的单元格内容的格式的复杂性

我想这个问题的棘手部分实际上并不在于find每个单独字符的格式(当然,假设在你的情况下它甚至是可能的)。 困难的部分将是“记住”每个字符的格式,并在replace文本后重新应用格式。

在最简单的情况下,您的replacestring总是与您的目标string长度相同。 如果valueX将被valueY取代,并且它的长度始终相同,则保留格式是相当容易的。 只需在运行replace方法之前获取格式,然后使用与之前完全相同的设置为每个字符重新应用格式。

稍微难一点的是,如果你正在取代一个单元格中的一个可能的值。 在这种情况下,您需要通过replacestring和目标string之间的长度差异来抵消replace格式,并且只能在replace的string之后这样做。

在最丑陋的情况下,你有n个string将被replace,在这种情况下,当你通过字符分析应用格式化时,你必须为每个后续的replace做类似的n * difference

我相信这个任务有更好的algorithm,但也许最适合单独的SO问题。


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

理想情况下,您将find一种直接从C#访问必要对象的方法,因此您不必处理VBA代码和Excel。 但是你可能不那么幸运。

如果您必须在Excel中进行格式设置,则可以采用以下方法之一。

  1. 将您的Excel工作表设置为3张: OriginalCopyReplacedValues
  2. 在运行C#代码之前,请确保CopyOriginal的重复。
  3. 当您运行C#代码来replace单元格内容时,请将replacestring的值粘贴到ReplacedValues工作表中。 我会推荐一些简单的地方,如你的范围地址(例如B2 )在列A中,原始值在列B中,replace值在列C中。
  4. 在运行C#代码之后,编写一个方法,它将遍历ReplacedValues列出的所有范围。
  5. 对于每个范围,您都可以在“ Copy引用原始值(也许我的命名scheme有点令人困惑),并在“ Original引用更新后的值。
  6. findCopy的原始格式。 使用string长度的差异来抵消并将您的格式应用回原来的位置(这是您编写一些花哨的代码parsing器来完成所有这些工作的地方)。

可能比上述过程更好的方法,但我认为这将是相当不错的。