1

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

为了澄清,我在一个像这样的单元格中将 valueX 替换为 valueY:
valueX很棒

这导致:
valueY 很棒


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

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

4

1 回答 1

3

在您的问题中,您提到您无法弄清楚如何在 C# 中获取每个字符的格式,但您可能可以在 Excel 中使用解决方法。我不确定 Excel 中的哪些对象通过互操作暴露给 C#,但也许我向您展示可以在 VBA 中完成的操作会有所帮助。

我将提供三个部分来回答我的问题:

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

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

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

测试_ _

从示例中可以看出,第 3 和第 4 个字符是粗体。我们如何找到这些字符的这些属性和其他字体属性?这是一个 VBA 函数,它演示了您可以通过Range.Characters和公开的一些属性Range.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 宋体 0 10 假
 2 e 宋体 0 10 假
 3 秒 Arial 0 10 真
 4 t 宋体 0 10 真
 5 i 宋体 0 10 假
 6 n 宋体 0 10 假

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

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

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

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

在最丑陋的情况下,您有 n 个将被替换的字符串,在这种情况下,当您解析回字符以应用格式时,您必须n * difference对每个后续替换进行类似的操作。

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


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

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

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

  1. 将您的 Excel 工作表设置为 3 个工作表:Original、、、CopyReplacedValues
  2. 在运行 C# 代码之前,请确保它CopyOriginal.
  3. 运行 C# 代码替换单元格内容时,将替换字符串的值粘贴到ReplacedValues工作表中。我会推荐一些简单的东西,您的范围地址(例如B2)在 A 列中,原始值在 B 列中,替换值在 C 列中。
  4. 运行 C# 代码后,编写一个方法来遍历ReplacedValues.
  5. 对于每个范围,您将能够引用 中的原始值Copy(也许我的命名方案有点混乱)和Original.
  6. 查找原始格式在Copy. 使用字符串长度的差异来抵消并将您的格式应用回原始格式(这是您可以编写一些花哨的代码解析器来完成所有这些工作的地方)。

可能有比上述过程更好的方法,但我认为这会很好。

于 2009-12-11T21:25:55.677 回答