我有一个使用Office Automation自动化Microsoft Excel(2003)的应用程序。它所做的一件事就是取代价值观。 我得到的问题是,当替换值时,所有丰富的格式都会丢失,如下所述: http://support.microsoft.com/kb/177194
为了澄清,我在一个单元格中用valueY替换valueX,如下所示:
valueX 很好
这导致:
valueY很棒
我尝试在替换前在单元格中获取格式,因此我可以保存哪些字符为粗体,并在替换值后应用格式。但我找不到一种方法来获取每个角色的格式。 (C#)
有没有办法解决这个问题,而不使用上面网站上的分辨率?在C#中或Excel中的一些解决方法
答案 0 :(得分:3)
在您的问题中,您提到您无法弄清楚如何获取C#中每个字符的格式,但您可以在Excel中使用变通方法。我不确定Excel中的哪些对象通过interop暴露给C#,但也许我告诉你在VBA中可以做些什么将会有所帮助。
我将在答案中提供三个部分:
如何使用VBA在Excel中查找字符格式
通过Range.Characters.Font
对象公开给定角色的格式。让我们来看看。想象一下,在Excel工作表的A1
中的单元格Sheet1
中有以下内容:
特的 ST 荷兰国际集团
从示例中可以看出第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
上面的代码将产生以下输出:
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中进行格式化,这可以采用一种方式。
Original
,Copy
,ReplacedValues
Copy
与Original
重复。ReplacedValues
工作表中粘贴替换字符串的值。我推荐一些简单的地方,你的范围地址(例如B2
)在A栏中,原始值在B栏中,替换值在C栏中。ReplacedValues
中列出的所有范围。Copy
中引用原始值(可能我的命名方案有点令人困惑)以及Original
中的更新值。Copy
中原始格式的内容。使用字符串长度的差异来偏移并将格式应用到原始格式(这是您可以编写一些奇特的代码解析器来完成所有这些工作的地方)。可能有比上述过程更好的方法,但我认为这样可以很好地工作。